diff --git a/.github/workflows/cypress-platform.yml b/.github/workflows/cypress-platform.yml index 112a10c199..d136991e38 100644 --- a/.github/workflows/cypress-platform.yml +++ b/.github/workflows/cypress-platform.yml @@ -79,7 +79,7 @@ jobs: - name: Set up environment variables run: | - echo "TOOLJET_EDITION=${{ matrix.edition == 'ee' && 'EE' || 'CE' }}" >> .env + echo "TOOLJET_EDITION=${{ matrix.edition == 'ee' && 'ee' || 'ce' }}" >> .env echo "TOOLJET_HOST=http://localhost:8082" >> .env echo "LOCKBOX_MASTER_KEY=cd97331a419c09387bef49787f7da8d2a81d30733f0de6bed23ad8356d2068b2" >> .env echo "SECRET_KEY_BASE=7073b9a35a15dd20914ae17e36a693093f25b74b96517a5fec461fc901c51e011cd142c731bee48c5081ec8bac321c1f259ef097ef2a16f25df17a3798c03426" >> .env diff --git a/.github/workflows/docs-pr-app.yml b/.github/workflows/docs-pr-app.yml index ae605c660c..612d857b76 100644 --- a/.github/workflows/docs-pr-app.yml +++ b/.github/workflows/docs-pr-app.yml @@ -53,7 +53,7 @@ jobs: ], "serviceDetails": { "pullRequestPreviewsEnabled": "no", - "buildCommand": "bash build-latest-version.sh", + "buildCommand": "npm i && npm run build", "publishPath": "build/", "url": "https://tooljet-pr-${{ env.PR_NUMBER }}.onrender.com" } diff --git a/.github/workflows/render-preview-deploy.yml b/.github/workflows/render-preview-deploy.yml index ead9ba50bf..203ee88150 100644 --- a/.github/workflows/render-preview-deploy.yml +++ b/.github/workflows/render-preview-deploy.yml @@ -13,12 +13,42 @@ permissions: jobs: # Community Edition - create-ce-review-app: if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'create-ce-review-app' || github.event.label.name == 'review-app') }} runs-on: ubuntu-latest steps: + - name: Sync repo + uses: actions/checkout@v3 + + - name: Check if Forked Repository + id: check_repo + run: | + if [[ "${{ github.event.pull_request.head.repo.fork }}" == "true" ]]; then + echo "is_fork=true" >> $GITHUB_ENV + echo "FORKED_OWNER=${{ github.event.pull_request.head.repo.owner.login }}" >> $GITHUB_ENV + else + echo "is_fork=false" >> $GITHUB_ENV + fi + + - name: Set Repository URL + run: | + if [[ "$is_fork" == "true" ]]; then + echo "REPO_URL=https://github.com/${FORKED_OWNER}/ToolJet" >> $GITHUB_ENV + else + echo "REPO_URL=https://github.com/ToolJet/ToolJet" >> $GITHUB_ENV + fi + + - name: Fetch and Checkout Forked Branch + if: env.is_fork == 'true' + run: | + git fetch origin pull/${{ github.event.number }}/head:${{ env.BRANCH_NAME }} + git checkout ${{ env.BRANCH_NAME }} + + - name: Checkout Default Branch + if: env.is_fork == 'false' + uses: actions/checkout@v3 + - name: Creating deployment for CE id: create-ce-deployment run: | @@ -34,7 +64,7 @@ jobs: "name": "ToolJet CE PR #${{ env.PR_NUMBER }}", "notifyOnFail": "default", "ownerId": "tea-caeo4bj19n072h3dddc0", - "repo": "https://github.com/ToolJet/ToolJet", + "repo": "'"$REPO_URL"'", "slug": "tooljet-ce-pr-${{ env.PR_NUMBER }}", "suspended": "not_suspended", "suspenders": [], diff --git a/.github/workflows/vulnerability-ci.yml b/.github/workflows/vulnerability-ci.yml new file mode 100644 index 0000000000..15f8425a46 --- /dev/null +++ b/.github/workflows/vulnerability-ci.yml @@ -0,0 +1,651 @@ +name: Vulnerability CI + +# Controls when the workflow will run +on: + pull_request: + types: [labeled, unlabeled, closed] + + # Allows you to run this workflow manually from the Actions tab + workflow_dispatch: + + # Schedule the workflow to run every two weeks once + + schedule: + - cron: '30 5 */14 * *' + +jobs: + PeriodicVulnerability-CheckOn-frontend-code: + if: github.event_name == 'schedule' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: refs/heads/main + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix frontend install + + - name: Running security audit + run: npm --prefix server audit --json > Periodic-frontend-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' Periodic-frontend-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-frontend-audit-report + path: Periodic-frontend-audit.json + + - 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 }} + + + PeriodicVulnerability-CheckOn-server-code: + if: github.event_name == 'schedule' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: refs/heads/main + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix server install + + - name: Running security audit + run: npm --prefix server audit --json > Periodic-server-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' Periodic-server-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-server-audit-report + path: Periodic-server-audit.json + + - 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 }} + + + PeriodicVulnerability-CheckOn-marketplace-code: + if: github.event_name == 'schedule' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: refs/heads/main + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix marketplace install + + - name: Running security audit + run: npm --prefix marketplace audit --json > Periodic-marketplace-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' Periodic-marketplace-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-marketplace-audit-report + path: Periodic-marketplace-audit.json + + - 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 }} + + + PeriodicVulnerability-CheckOn-plugins-code: + if: github.event_name == 'schedule' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: refs/heads/main + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix plugins install + + - name: Running security audit + run: npm --prefix plugins audit --json > Periodic-plugins-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' Periodic-plugins-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-plugins-audit-report + path: Periodic-plugins-audit.json + + - 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 }} + + + PeriodicVulnerability-CheckOn-cypress-code: + if: github.event_name == 'schedule' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: refs/heads/main + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix cypress-tests install + + - name: Running security audit + run: npm --prefix cypress-tests audit --json > 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 }} + + + PeriodicVulnerability-CheckOn-root-code: + if: github.event_name == 'schedule' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: refs/heads/main + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm install + + - name: Running security audit + run: npm audit --json > Periodic-root-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' Periodic-root-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-root-audit-report + path: Periodic-root-audit.json + + - 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 }} + + + ManualVulnerability-CheckOn-frontend-code: + if: ${{ github.event.action == 'labeled' && (github.event.label.name == 'frontend-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 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix frontend install + + - name: Running security audit + run: npm --prefix frontend audit --json > frontend-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' frontend-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: frontend-audit-report + path: frontend-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 Frontend 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.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 + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.ref }} + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix server install + + - name: Running security audit + run: npm --prefix server audit --json > server-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' server-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: server-audit-report + path: server-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 Server 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.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 + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.ref }} + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix marketplace install + + - name: Running security audit + run: npm --prefix marketplace audit --json > marketplace-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' marketplace-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: marketplace-audit-report + path: marketplace-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 Marketplace 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.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 + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.ref }} + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm --prefix plugins install + + - name: Running security audit + run: npm --prefix plugins audit --json > plugins-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' plugins-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: plugins-audit-report + path: plugins-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 Plugins 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.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 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - 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 + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.ref }} + + - name: Use Node.js 18.18.2 + uses: actions/setup-node@v3 + with: + node-version: 18.18.2 + + - name: Install dependencies + run: npm install + + - name: Running security audit + run: npm audit --json > root-audit.json + continue-on-error: true + + - name: Parse audit summary + id: parse-audit + run: | + vulnerabilities=$(jq '.metadata.vulnerabilities' root-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: root-audit-report + path: root-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 Root 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.root_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}). \ No newline at end of file diff --git a/.version b/.version index 7c69a55dbb..19811903a7 100644 --- a/.version +++ b/.version @@ -1 +1 @@ -3.7.0 +3.8.0 diff --git a/README.md b/README.md index 8e20040cfe..aec5952469 100644 --- a/README.md +++ b/README.md @@ -46,13 +46,7 @@ ToolJet is an **open-source low-code framework** to build and deploy internal to
## Quickstart -The easiest way to get started with ToolJet is by creating a [ToolJet Cloud](https://tooljet.com) account. ToolJet Cloud offers a hosted solution of ToolJet. If you want to self-host ToolJet, kindly proceed to [deployment documentation](https://docs.tooljet.com/docs/setup/). - -You can deploy ToolJet on DigitalOcean using one-click-deployment. - -

- Deploy to DigitalOcean -

+The easiest way to get started with ToolJet is by creating a [ToolJet Cloud](https://tooljet.ai) account. ToolJet Cloud offers a hosted solution of ToolJet. If you want to self-host ToolJet, kindly proceed to [deployment documentation](https://docs.tooljet.ai/docs/setup/). ### Try using Docker Want to give ToolJet a quick spin on your local machine? You can run the following command from your terminal to have ToolJet up and running right away. @@ -65,42 +59,42 @@ docker run \ -p 80:80 \ --platform linux/amd64 \ -v tooljet_data:/var/lib/postgresql/13/main \ - tooljet/try:EE-LTS-latest + tooljet/try:ee-lts-latest ``` *For users upgrading their ToolJet version, we recommend choosing the LTS version over the latest version. The LTS version ensures stability with production bug fixes, security patches, and performance enhancements.* ## Tutorials and examples -[Time Tracker Application](https://docs.tooljet.com/docs/#quickstart-guide)
-[Build your own CMS using low-code](https://blog.tooljet.com/build-cms-using-lowcode-and-mongodb/)
-[AWS S3 Browser](https://blog.tooljet.com/build-an-aws-s3-broswer-with-tooljet/)
+[Time Tracker Application](https://docs.tooljet.ai/docs/#quickstart-guide)
+[Build your own CMS using low-code](https://blog.tooljet.ai/build-cms-using-lowcode-and-mongodb/)
+[AWS S3 Browser](https://blog.tooljet.ai/build-an-aws-s3-broswer-with-tooljet/)
## Documentation -Documentation is available at https://docs.tooljet.com. +Documentation is available at https://docs.tooljet.ai. -- [Getting Started](https://docs.tooljet.com)
-- [Data source Reference](https://docs.tooljet.com/docs/data-sources/airtable/)
-- [Component Reference](https://docs.tooljet.com/docs/widgets/button) +- [Getting Started](https://docs.tooljet.ai)
+- [Data source Reference](https://docs.tooljet.ai/docs/data-sources/airtable/)
+- [Component Reference](https://docs.tooljet.ai/docs/widgets/button) ## Self-hosted You can use ToolJet Cloud for a fully managed solution. If you want to self-host ToolJet, we have guides on deploying ToolJet on Kubernetes, AWS EC2, Docker, and more. | Provider | Documentation | | :------------- | :------------- | -| Digital Ocean | [Link](https://docs.tooljet.com/docs/setup/digitalocean) | -| Docker | [Link](https://docs.tooljet.com/docs/setup/docker) | -| AWS EC2 | [Link](https://docs.tooljet.com/docs/setup/ec2) | -| AWS ECS | [Link](https://docs.tooljet.com/docs/setup/ecs) | -| OpenShift | [Link](https://docs.tooljet.com/docs/setup/openshift) | -| Helm | [Link](https://docs.tooljet.com/docs/setup/helm) | -| AWS EKS (Kubernetes) | [Link](https://docs.tooljet.com/docs/setup/kubernetes) | -| GCP GKE (Kubernetes) | [Link](https://docs.tooljet.com/docs/setup/kubernetes-gke) | -| Azure AKS (Kubernetes) | [Link](https://docs.tooljet.com/docs/setup/kubernetes-aks) | -| Azure Container | [Link](https://docs.tooljet.com/docs/setup/azure-container) | -| Google Cloud Run | [Link](https://docs.tooljet.com/docs/setup/google-cloud-run) | -| Deploying ToolJet client | [Link](https://docs.tooljet.com/docs/setup/client) | -| Deploying ToolJet on a Subpath | [Link](https://docs.tooljet.com/docs/setup/tooljet-subpath/) | +| Digital Ocean | [Link](https://docs.tooljet.ai/docs/setup/digitalocean) | +| Docker | [Link](https://docs.tooljet.ai/docs/setup/docker) | +| AWS EC2 | [Link](https://docs.tooljet.ai/docs/setup/ec2) | +| AWS ECS | [Link](https://docs.tooljet.ai/docs/setup/ecs) | +| OpenShift | [Link](https://docs.tooljet.ai/docs/setup/openshift) | +| Helm | [Link](https://docs.tooljet.ai/docs/setup/helm) | +| AWS EKS (Kubernetes) | [Link](https://docs.tooljet.ai/docs/setup/kubernetes) | +| GCP GKE (Kubernetes) | [Link](https://docs.tooljet.ai/docs/setup/kubernetes-gke) | +| Azure AKS (Kubernetes) | [Link](https://docs.tooljet.ai/docs/setup/kubernetes-aks) | +| Azure Container | [Link](https://docs.tooljet.ai/docs/setup/azure-container) | +| Google Cloud Run | [Link](https://docs.tooljet.ai/docs/setup/google-cloud-run) | +| Deploying ToolJet client | [Link](https://docs.tooljet.ai/docs/setup/client) | +| Deploying ToolJet on a Subpath | [Link](https://docs.tooljet.ai/docs/setup/tooljet-subpath/) | ## Marketplace ToolJet can now be found on both AWS and Azure Marketplaces, making it simpler than ever to access and deploy our app-building platform. @@ -108,9 +102,9 @@ ToolJet can now be found on both AWS and Azure Marketplaces, making it simpler t Find ToolJet on AWS Marketplace [here](https://aws.amazon.com/marketplace/pp/prodview-fxjto27jkpqfg?sr=0-1&ref_=beagle&applicationId=AWSMPContessa) and explore seamless integration on Azure Marketplace [here](https://azuremarketplace.microsoft.com/en-us/marketplace/apps/tooljetsolutioninc1679496832216.tooljet?tab=Overview). ## Community support -For general help using ToolJet, please refer to the official [documentation](https://docs.tooljet.com/docs/). For additional help, you can use one of these channels to ask a question: +For general help using ToolJet, please refer to the official [documentation](https://docs.tooljet.ai/docs/). For additional help, you can use one of these channels to ask a question: -- [Slack](https://tooljet.com/slack) - Discussions with the community and the team. +- [Slack](https://tooljet.ai/slack) - Discussions with the community and the team. - [GitHub](https://github.com/ToolJet/ToolJet/issues) - For bug reports and feature requests. - [𝕏 (Twitter)](https://twitter.com/ToolJet) - Get the product updates quickly. diff --git a/cypress-tests/cypress/commands/commands.js b/cypress-tests/cypress/commands/commands.js index 0f9a6c9996..5df60a6c5a 100644 --- a/cypress-tests/cypress/commands/commands.js +++ b/cypress-tests/cypress/commands/commands.js @@ -116,8 +116,10 @@ Cypress.Commands.add( }); const splitIntoFlatArray = (value) => { - const regex = /(\{|\}|\(|\)|\[|\]|,|:|;|=>|'[^']*'|[a-zA-Z0-9._]+|\s+)/g; + const regex = + /(\{|\}|\(|\)|\[|\]|,|:|;|=>|'[^']*'|"[^"]*"|[a-zA-Z0-9._+\-*]+|\s+)/g; let prefix = ""; + return ( value.match(regex)?.reduce((acc, part) => { if (part === "{{" || part === "((") { @@ -132,6 +134,14 @@ Cypress.Commands.add( acc.push(prefix + " "); } else if (part === ":") { acc.push(prefix + ":"); + } else if (part === '"') { + acc.push(prefix + '"'); + } else if ( + part.includes("-") || + part.includes("+") || + part.includes("*") + ) { + acc.push(prefix + part); } else { acc.push(prefix + part); prefix = ""; @@ -142,13 +152,11 @@ Cypress.Commands.add( }; if (Array.isArray(value)) { - cy.wrap(subject) - .last() - .realType(value, { - parseSpecialCharSequences: false, - delay: 0, - force: true, - }); + cy.wrap(subject).last().realType(value, { + parseSpecialCharSequences: false, + delay: 0, + force: true, + }); } else { splitIntoFlatArray(value).forEach((i) => { cy.wrap(subject) @@ -228,9 +236,9 @@ Cypress.Commands.add( .invoke("text") .then((text) => { cy.wrap(subject).realType(createBackspaceText(text)), - { - delay: 0, - }; + { + delay: 0, + }; }); } ); @@ -522,6 +530,82 @@ Cypress.Commands.overwrite( } ); +Cypress.Commands.add("installMarketplacePlugin", (pluginName) => { + const MARKETPLACE_URL = `${Cypress.config("baseUrl")}/integrations/marketplace`; + + cy.visit(MARKETPLACE_URL); + cy.wait(1000); + + cy.get('[data-cy="-list-item"]').eq(0).click(); + cy.wait(1000); + + cy.get("body").then(($body) => { + if ($body.find(".plugins-card").length === 0) { + cy.log("No plugins found, proceeding to install..."); + installPlugin(pluginName); + } else { + cy.get(".plugins-card").then(($cards) => { + const isInstalled = $cards.toArray().some((card) => { + return ( + Cypress.$(card) + .find(".font-weight-medium.text-capitalize") + .text() + .trim() === pluginName + ); + }); + + if (isInstalled) { + cy.log(`${pluginName} is already installed. Skipping installation.`); + cy.get(commonSelectors.globalDataSourceIcon).click(); + } else { + installPlugin(pluginName); + cy.get(commonSelectors.globalDataSourceIcon).click(); + } + }); + } + }); + + function installPlugin(pluginName) { + cy.get('[data-cy="-list-item"]').eq(1).click(); + cy.wait(1000); + + cy.contains(".plugins-card", pluginName).within(() => { + cy.get(".marketplace-install").click(); + cy.wait(1000); + }); + } +}); + +Cypress.Commands.add("uninstallMarketplacePlugin", (pluginName) => { + const MARKETPLACE_URL = `${Cypress.config("baseUrl")}/integrations/marketplace`; + + cy.visit(MARKETPLACE_URL); + cy.wait(1000); + + cy.get('[data-cy="-list-item"]').eq(0).click(); + cy.wait(1000); + + cy.get(".plugins-card").each(($card) => { + cy.wrap($card) + .find(".font-weight-medium.text-capitalize") + .invoke("text") + .then((text) => { + if (text.trim() === pluginName) { + cy.wrap($card).find(".link-primary").contains("Remove").click(); + cy.wait(1000); + + cy.get('[data-cy="delete-plugin-title"]').should("be.visible"); + cy.get('[data-cy="yes-button"]').click(); + cy.wait(2000); + + cy.log(`${pluginName} has been successfully uninstalled.`); + } else { + cy.log(`${pluginName} is not installed. Skipping uninstallation.`); + } + }); + }); +}); + Cypress.Commands.add("verifyElement", (selector, text, eqValue) => { const element = eqValue !== undefined ? cy.get(selector).eq(eqValue) : cy.get(selector); diff --git a/cypress-tests/cypress/constants/selectors/Plugins.js b/cypress-tests/cypress/constants/selectors/Plugins.js new file mode 100644 index 0000000000..8d41dee2db --- /dev/null +++ b/cypress-tests/cypress/constants/selectors/Plugins.js @@ -0,0 +1,62 @@ +export const pluginSelectors = { + regionField: '[data-cy="region-section"] .react-select__control', + regionFieldValue: '[data-cy="region-section"] .react-select__single-value', + amazonsesAccesKey: '[data-cy="access-key-text-field"]', + operationDropdown: '[data-cy="operation-select-dropdown"]', + sendEmailInputField: '[data-cy="send-mail-to-input-field"]', + ccEmailInputField: '[data-cy="cc-to-input-field"]', + bccEmailInputField: '[data-cy="bcc-to-input-field"]', + sendEmailFromInputField: '[data-cy="send-mail-from-input-field"]', + emailSubjetInputField: '[data-cy="subject-input-field"]', + emailbodyInputField: '[data-cy="body-input-field"]', + amazonAthenaDbName: '[data-cy="database-text-field"]', +}; + +export const baserowSelectors = { + hostField: '[data-cy="host-select-dropdown"]', + baserowApiKey: '[data-cy="api-token-text-field"]', + table: '[data-cy="table-id-input-field"]', + rowIdinputfield: '[data-cy="row-id-input-field"]', +}; + +export const appWriteSelectors = { + projectID: '[data-cy="project-id-text-field"]', + collectionId: '[data-cy="collectionid-input-field"]', + documentId: '[data-cy="documentid-input-field"]', + bodyInput: '[data-cy="body-input-field"]', +}; + +export const twilioSelectors = { + toNumberInputField: '[data-cy="to-number-input-field"]', + bodyInput: '[data-cy="body-input-field"]', +}; + +export const minioSelectors = { + sslToggle: 'data-cy="ssl-enabled-toggle-input"', + bucketNameInputField: '[data-cy="bucket-input-field"]', + objectNameInputField: '[data-cy="objectname-input-field"]', + contentTypeInputField: '[data-cy="contenttype-input-field"]', + dataInput: '[data-cy="data-input-field"]', +}; + +export const harperDbSelectors = { + recordsInputField: '[data-cy="records-input-field"]', + hashValueInputField: '[data-cy="hash-values-input-field"]', + attributesInputField: '[data-cy="attributes-input-field"]', + searchValueInputField: '[data-cy="search-value-input-field"]', + searchAttributeInputField: '[data-cy="search-attribute-input-field"]', + conditionInputField: '[data-cy="conditions-input-field"]', + sqlQueryInputField: '[data-cy="sql-query-input-field"]', + schemaInputField: '[data-cy="schema-input-field"]', + TableInputField: '[data-cy="table-input-field"]', +}; + +export const awsTextractSelectors = { + documentInputField: '[data-cy="document-input-field"]', + bucketNameInputField: '[data-cy="bucket-input-field"]', + keyNameInputField: '[data-cy="key-input-field"]', +}; + +export const graphQLSelectors = { + urlInputField: '[data-cy="url-text-field"]', +}; diff --git a/cypress-tests/cypress/constants/selectors/awss3.js b/cypress-tests/cypress/constants/selectors/awss3.js index 59bdebacff..81f1a6efe8 100644 --- a/cypress-tests/cypress/constants/selectors/awss3.js +++ b/cypress-tests/cypress/constants/selectors/awss3.js @@ -5,5 +5,5 @@ export const s3Selector = { regionLabel: '[data-cy="label-region"]', customEndpointLabel: '[data-cy="label-custom-endpoint"]', customEndpointInput: '[data-cy="undefined-text-field"]', - dataSourceNameInput: '[data-cy="data-source-name-input-filed"]', + dataSourceNameInput: '[data-cy="data-source-name-input-field"]', }; diff --git a/cypress-tests/cypress/constants/selectors/dataSource.js b/cypress-tests/cypress/constants/selectors/dataSource.js index bdf1677d91..8283eb2b92 100644 --- a/cypress-tests/cypress/constants/selectors/dataSource.js +++ b/cypress-tests/cypress/constants/selectors/dataSource.js @@ -14,7 +14,7 @@ export const dataSourceSelector = { dataSourceSearchInputField: '[data-cy="home-page-search-bar"]', postgresDataSource: "[data-cy='data-source-postgresql']", - dataSourceNameInputField: '[data-cy="data-source-name-input-filed"]', + dataSourceNameInputField: '[data-cy="data-source-name-input-field"]', labelHost: '[data-cy="label-host"]', labelPort: '[data-cy="label-port"]', labelSsl: '[data-cy="label-ssl"]', @@ -28,7 +28,7 @@ export const dataSourceSelector = { buttonTestConnection: '[data-cy="test-connection-button"]', connectionFailedText: '[data-cy="test-connection-failed-text"]', buttonSave: '[data-cy="db-connection-save-button"] > .tj-base-btn', - dangerAlertNotSupportSSL: '.go3958317564', + dangerAlertNotSupportSSL: ".go3958317564", passwordTextField: '[data-cy="password-text-field"]', textConnectionVerified: '[data-cy="test-connection-verified-text"]', @@ -97,11 +97,11 @@ export const dataSourceSelector = { eventQuerySelectionField: '[data-cy="query-selection-field"]', addedDsSearchIcon: '[data-cy="added-ds-search-icon"]', AddedDsSearchBar: '[data-cy="added-ds-search-bar"]', - dsNameInputField: '[data-cy="data-source-name-input-filed"]', + dsNameInputField: '[data-cy="data-source-name-input-field"]', unSavedModalTitle: '[data-cy="unsaved-changes-title"]', eventQuerySelectionField: '[data-cy="query-selection-field"]', connectionAlertText: '[data-cy="connection-alert-text"]', deleteDSButton: (datasourceName) => { - return `[data-cy="${cyParamName(datasourceName)}-delete-button"]` + return `[data-cy="${cyParamName(datasourceName)}-delete-button"]`; }, }; diff --git a/cypress-tests/cypress/constants/selectors/postgreSql.js b/cypress-tests/cypress/constants/selectors/postgreSql.js index 49e0351656..4f38357961 100644 --- a/cypress-tests/cypress/constants/selectors/postgreSql.js +++ b/cypress-tests/cypress/constants/selectors/postgreSql.js @@ -12,7 +12,7 @@ export const postgreSqlSelector = { dataSourceSearchInputField: '[data-cy="home-page-search-bar"]', postgresDataSource: "[data-cy='data-source-postgresql']", - dataSourceNameInputField: '[data-cy="data-source-name-input-filed"]', + dataSourceNameInputField: '[data-cy="data-source-name-input-field"]', labelHost: '[data-cy="label-host"]', labelPort: '[data-cy="label-port"]', labelSsl: '[data-cy="label-ssl"]', @@ -88,3 +88,11 @@ export const postgreSqlSelector = { eventQuerySelectionField: '[data-cy="query-selection-field"]', }; + +export const airTableSelector = { + operationSelectDropdown: '[data-cy="operation-select-dropdown"]', + baseIdInputField: '[data-cy="base-id-input-field"]', + tableNameInputField: '[data-cy="table-name-input-field"]', + recordIdInputField: '[data-cy="record-id-input-field"]', + bodyInputField: '[data-cy="body-input-field"]', +}; diff --git a/cypress-tests/cypress/constants/selectors/restAPI.js b/cypress-tests/cypress/constants/selectors/restAPI.js new file mode 100644 index 0000000000..a24c115712 --- /dev/null +++ b/cypress-tests/cypress/constants/selectors/restAPI.js @@ -0,0 +1,44 @@ +export const cyParamName = (paramName = "") => { + return String(paramName) + .toLowerCase() + .replace(/\(s\)/g, "") + .replace(/\s+/g, "-"); +}; +export const restAPISelector = { + accordionHeader: (header) => { + return `[data-cy="widget-accordion-${cyParamName(header)}"]`; + }, + subHeaderLabel: (header) => { + return `[data-cy="label-${cyParamName(header)}"]`; + }, + subSection: (header) => { + return `[data-cy="${cyParamName(header)}-section"]`; + }, + keyInputField: (header, index) => { + return `[data-cy="${cyParamName(header)}-key-input-field-${cyParamName(index)}"]`; + }, + valueInputField: (header, index) => { + return `[data-cy="${cyParamName(header)}-value-input-field-${cyParamName(index)}"]`; + }, + deleteButton: (header, index) => { + return `[data-cy="${cyParamName(header)}-delete-button-${cyParamName(index)}"]`; + }, + addMoreButton: (header) => { + return `[data-cy="${cyParamName(header)}-add-more-button"]`; + }, + dropdownLabel: (label) => { + return `[data-cy="${cyParamName(label)}-dropdown-label"]`; + }, + inputField: (fieldName) => { + return `[data-cy="${cyParamName(fieldName)}-input-field"]`; + }, + button: (buttonName) => { + return `[data-cy="button-${cyParamName(buttonName)}"]`; + }, + authenticationAllUsersToggleSwitch: + '[data-cy="authentication-required-for-all-users-toggle-switch"]', + retryNetworkToggleSwitch: '[data-cy="retry-network-errors-toggle-input"]', + retryNetworkToggleText: '[data-cy="retry-network-errors-toggle-text"]', + retryNetworkToggleSubtext: '[data-cy="retry-network-errors-toggle-subtext"]', + readDocumentationLinkText: '[data-cy="link-read-documentation"]', +}; diff --git a/cypress-tests/cypress/constants/texts/airTable.js b/cypress-tests/cypress/constants/texts/airTable.js new file mode 100644 index 0000000000..44df3cf9e1 --- /dev/null +++ b/cypress-tests/cypress/constants/texts/airTable.js @@ -0,0 +1,6 @@ +export const airtableText = { + airtable: "Airtable", + cypressairtable: "cypress-Airtable", + ApiKey: "Personal access token", + apikeyPlaceholder: "**************", + }; \ No newline at end of file diff --git a/cypress-tests/cypress/constants/texts/amazonAthena.js b/cypress-tests/cypress/constants/texts/amazonAthena.js new file mode 100644 index 0000000000..794815d4a7 --- /dev/null +++ b/cypress-tests/cypress/constants/texts/amazonAthena.js @@ -0,0 +1,8 @@ +export const amazonAthenaText = { + AmazonAthena: "Amazon Athena", + cypressAmazonAthena: "cypress-Amazon Athena", + labelAccesskey: "Access key", + labelSecretKey: "Secret key", + placeholderEnteraAccessKey: "Enter access key", + placeholderSecretKey:"**************", + }; \ No newline at end of file diff --git a/cypress-tests/cypress/constants/texts/amazonSes.js b/cypress-tests/cypress/constants/texts/amazonSes.js new file mode 100644 index 0000000000..2abaed71ab --- /dev/null +++ b/cypress-tests/cypress/constants/texts/amazonSes.js @@ -0,0 +1,8 @@ +export const amazonSesText = { + AmazonSES: "Amazon SES", + cypressAmazonSES: "cypress-Amazon SES", + labelAccesskey: "Access key", + labelSecretKey: "Secret key", + placeholderAccessKey: "Enter access key", + placeholderSecretKey:"**************", + }; \ No newline at end of file diff --git a/cypress-tests/cypress/constants/texts/appwrite.js b/cypress-tests/cypress/constants/texts/appwrite.js new file mode 100644 index 0000000000..15b723d1cc --- /dev/null +++ b/cypress-tests/cypress/constants/texts/appwrite.js @@ -0,0 +1,12 @@ +export const appwriteText = { + appwrite: "Appwrite", + cypressAppwrite: "cypress-Appwrite", + host: "Host", + ProjectID: "Project ID", + DatabaseID: "Database ID", + SecretKey: "Secret Key", + SecretKeyPlaceholder: "**************", + hostPlaceholder: "Appwrite database host/endpoint", + projectIdPlaceholder: "Appwrite project id", + databaseIdPlaceholder: "Appwrite Database id", +}; diff --git a/cypress-tests/cypress/constants/texts/awsLambda.js b/cypress-tests/cypress/constants/texts/awsLambda.js new file mode 100644 index 0000000000..fea1428598 --- /dev/null +++ b/cypress-tests/cypress/constants/texts/awsLambda.js @@ -0,0 +1,8 @@ +export const awsLambdaText = { + awsLambda: "AWS Lambda", + cypressawsLambda: "cypress-aws-lambda", + labelAccesskey: "Access key", + labelSecretKey: "Secret key", + placeholderAccessKey: "Enter access key", + placeholderSecretKey: "**************", +}; diff --git a/cypress-tests/cypress/constants/texts/awsTextract.js b/cypress-tests/cypress/constants/texts/awsTextract.js new file mode 100644 index 0000000000..36c752ec4c --- /dev/null +++ b/cypress-tests/cypress/constants/texts/awsTextract.js @@ -0,0 +1,12 @@ +export const awsTextractText = { + awsTextract: "AWS Textract", + cypressawsLambda: "cypress-aws-textract", + labelAccesskey: "Access key", + labelSecretKey: "Secret key", + placeholderAccessKey: "Enter access key", + placeholderSecretKey: "**************", + documentName: + "JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PCAvVHlwZSAvQ2F0YWxvZyAvUGFnZXMgMiAwIFIgPj4KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFszIDAgUl0gL0NvdW50IDEgPj4KZW5kb2JqCjMgMCBvYmoKPDwgL1R5cGUgL1BhZ2UgL1BhcmVudCAyIDAgUiAvUmVzb3VyY2VzIDw8IC9Gb250IDw8IC9GMSA0IDAgUiA+PiA+PiAvQ29udGVudHMgNSAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL1R5cGUgL0ZvbnQgL1N1YnR5cGUgL1R5cGUxIC9CYXNlRm9udCAvSGVsdmV0aWNhLUJvbGQgPj4KZW5kb2JqCjUgMCBvYmoKPDwgL0xlbmd0aCAxMjUgPj4Kc3RyZWFtCkJUIC9GMSAxMiBUZiAxMDAgNzAwIFRkICgoSGVsbG8sIEFtYXpvbiBUZXh0cmFjdCEpIFRqIEVUCmVuZHN0cmVhbQplbmRvYmoKeHJlZgowIDYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDExIDAwMDAwIG4gCjAwMDAwMDAwNTQgMDAwMDAgbgAKMDAwMDAwMDEwMyAwMDAwMCBuIAowMDAwMDAwMTcyIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgNiAvUm9vdCAxIDAgUiA+PgpzdGFydHhyZWYKMjIzCiUlRU9G", + bucketName: "reimbursement-receipt-files", + keyName: "reimbursement_receipt_1718364944018.png", +}; diff --git a/cypress-tests/cypress/constants/texts/baseRow.js b/cypress-tests/cypress/constants/texts/baseRow.js new file mode 100644 index 0000000000..6f9958d979 --- /dev/null +++ b/cypress-tests/cypress/constants/texts/baseRow.js @@ -0,0 +1,6 @@ +export const baseRowText = { + baserow: "baserow", + cypressBaseRow: "cypress-baserow", + lableApiToken: "API token", + placeholderApiToken:"**************", + }; \ No newline at end of file diff --git a/cypress-tests/cypress/constants/texts/dataSource.js b/cypress-tests/cypress/constants/texts/dataSource.js index 6a97093d87..063d87d469 100644 --- a/cypress-tests/cypress/constants/texts/dataSource.js +++ b/cypress-tests/cypress/constants/texts/dataSource.js @@ -80,4 +80,11 @@ export const dataSourceText = { labelNoEventhandler: "No event handlers", toastDSSaved: "Data Source Saved", unSavedModalTitle: "Unsaved Changes", + + sslCertificateLabel: "SSL Certificate", + caCertificateOption: "CA certificate", + clientCertificateOption: "Client certificate", + clientKeyLabel: "Client Key", + clientCertLabel: "Client Cert", + caCertLabel: "CA Cert", }; diff --git a/cypress-tests/cypress/constants/texts/graphQL.js b/cypress-tests/cypress/constants/texts/graphQL.js new file mode 100644 index 0000000000..5d1149efd3 --- /dev/null +++ b/cypress-tests/cypress/constants/texts/graphQL.js @@ -0,0 +1,6 @@ +export const GraphQLText = { + GraphQL: "GraphQL", + cypressGraphQL: "cypress-GraphQL", + urlInputLabel: "URL", + urlInputPlaceholder: "https://api.example.com/v1/graphql", +}; diff --git a/cypress-tests/cypress/constants/texts/harperDb.js b/cypress-tests/cypress/constants/texts/harperDb.js new file mode 100644 index 0000000000..11987296a3 --- /dev/null +++ b/cypress-tests/cypress/constants/texts/harperDb.js @@ -0,0 +1,21 @@ +export const harperDbText = { + harperDb: "HarperDB", + cypressHarperDB: "cypressHarperDB", + hostLabel: "Host", + hostInputPlaceholder: "Enter host", + portLabel: "Port", + portPlaceholder: "Enter port", + userNameLabel: "Username", + passwordlabel: "Password", + userNamePlaceholder: "Enter username", + passwordPlaceholder: "**************", + recordsValue: `[{id: 10, name: 'QA', age: 24}]`, + hashValue: "[10]", + attributesValue: "['name']", + searchAttributeValue: "name", + searchValue: "QA", + condtionValue: `[{'search_attribute': 'name', 'search_type': 'between', 'search_value': [1, 5]}, {'search_attribute': 'name', 'search_type': 'equals', 'search_value': 'QA'}]`, + sqlValue: "SELECT * FROM test_schema.test_table", + schemaValue: "test_schema", + tableValue: "test_table", +}; diff --git a/cypress-tests/cypress/constants/texts/minio.js b/cypress-tests/cypress/constants/texts/minio.js new file mode 100644 index 0000000000..5afd1ed477 --- /dev/null +++ b/cypress-tests/cypress/constants/texts/minio.js @@ -0,0 +1,14 @@ +export const minioText = { + minio: "Minio", + cypressMinio: "cypressMinio", + hostLabel: "Host", + hostInputPlaceholder: "Enter host", + portLabel: "Port", + portPlaceholder: "Enter port", + labelAccesskey: "Access key", + labelSecretKey: "Secret key", + placeholderAccessKey: "Enter access key", + placeholderSecretKey: "**************", + bucketName: `my-second-bucket`, + objectName: `mybucket`, +}; diff --git a/cypress-tests/cypress/constants/texts/redis.js b/cypress-tests/cypress/constants/texts/redis.js index f249442310..588af00c47 100644 --- a/cypress-tests/cypress/constants/texts/redis.js +++ b/cypress-tests/cypress/constants/texts/redis.js @@ -2,8 +2,7 @@ export const redisText = { redis: "Redis", cypressRedis: "cypress-redis", - errorMaxRetries: - 'Reached the max retries per request limit (which is 1). Refer to "maxRetriesPerRequest" option for details.', - errorPort: "Port should be >= 0 and < 65536. Received type number (108299).", - errorInvalidUserOrPassword: "WRONGPASS invalid username-password pair", + errorMaxRetries: "Connection could not be established", + errorPort: "Connection could not be established", + errorInvalidUserOrPassword: "Connection could not be established", }; diff --git a/cypress-tests/cypress/constants/texts/restAPI.js b/cypress-tests/cypress/constants/texts/restAPI.js new file mode 100644 index 0000000000..dd10f8624b --- /dev/null +++ b/cypress-tests/cypress/constants/texts/restAPI.js @@ -0,0 +1,58 @@ +export const restAPIText = { + restAPI: "REST API", + credentialsText: "CREDENTIALS", + baseUrlLabel: "Base URL", + headersLabel: "Headers", + urlParametesLabel: "URL parameters", + bodyLabel: "Body", + cookiesLabel: "Cookies", + authenticationText: "AUTHENTICATION", + authenticationTypeLabel: "Authentication type", + noneText: "None", + editButtonText: "Edit", + basicAuth: { + basicText: "Basic", + usernameLabel: "Username", + passwordLabel: "Password", + }, + bearerAuth: { + bearerText: "Bearer", + tokenLabel: "Token", + }, + oAuthText: "OAuth 2.0", + grantTypeLabel: "Grant type", + authorizationCode: { + authorizationCodeLabel: "Authorization code", + addAccessTokenLabel: "Add access token to", + headerPrefixLabel: "Header prefix", + requestHeader: "Request header", + accessTokenURLLabel: "Access token URL", + accessTokenURLCustomHeadersLabel: "Access token URL custom headers", + clientIDLabel: "Client ID", + clientSecretLabel: "Client secret", + scopeLabel: "Scope(s)", + customQueryParametersLabel: "Custom query parameters", + authorizationURLLabel: "Authorization URL", + customAuthenticationParametersLabel: "Custom authentication parameters", + clientAuthentication: "Client authentication", + sendBasicAuthheaderOption: "Send as basic auth header", + sendClientCredentialsBodyOption: "Send client credentials in body", + authenticationRequiredUsersToggle: "Authentication required for all users", + }, + + clientCredentials: { + clientCredentialsLabel: "Client credentials", + accessTokenURLLabel: "Access token URL", + accessTokenURLCustomHeadersLabel: "Access token URL custom headers", + clientIDLabel: "Client ID", + clientSecretLabel: "Client secret", + scopeLabel: "Scope(s)", + audiencelabel: "Audience", + }, + authenticationHeader: "Authentication", + secureSocketsLayerText: "SECURE SOCKETS LAYER", + generalSettingsText: "GENERAL SETTINGS", + retryNetworkErrorsToggleLabel: "Retry on network errors", + retryToggleHelperText: + "By default, ToolJet tries to hit API endpoint 3 times before declaring query failed as server did not respond", +}; diff --git a/cypress-tests/cypress/constants/texts/twilio.js b/cypress-tests/cypress/constants/texts/twilio.js new file mode 100644 index 0000000000..535bfb3b8a --- /dev/null +++ b/cypress-tests/cypress/constants/texts/twilio.js @@ -0,0 +1,11 @@ +export const twilioText = { + twilio: "Twilio", + cypresstwilio: "cypress-Twilio", + authTokenLabel: "Auth Token", + authTokenPlaceholder: "**************", + accountSidLabel: "Account SID", + accountSidPlaceholder: "Account SID for Twilio", + messagingSIDLabel: "Messaging Service SID", + messagingSIDPalceholder: "Messaging Service SID for Twilio", + messageText: "Sending test message to check twilio", +}; diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/addAllPluginsToApp.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/addAllPluginsToApp.cy.js new file mode 100644 index 0000000000..46f6339e11 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/addAllPluginsToApp.cy.js @@ -0,0 +1,218 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { commonSelectors } from "Selectors/common"; + +import { selectAndAddDataSource } from "Support/utils/postgreSql"; + +import { closeDSModal } from "Support/utils/dataSource"; + +const data = {}; +data.dsNamefake = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); +data.dsNamefake1 = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); +const cyParamName = (name) => name.toLowerCase().replace(/[^a-z0-9]/g, "-"); +data.workspaceName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); +data.workspaceSlug = fake.lastName.toLowerCase().replace(/\s+/g, "-"); + +const dataSources = [ + "BigQuery", + "ClickHouse", + "CosmosDB", + "CouchDB", + "Databricks", + "DynamoDB", + "Elasticsearch", + "Firestore", + "InfluxDB", + "MariaDB", + "MongoDB", + "SQL Server", + "MySQL", + "Oracle DB", + "PostgreSQL", + "Redis", + "RethinkDB", + "SAP HANA", + "Snowflake", + "TypeSense", + "Airtable", + "Amazon SES", + "Appwrite", + "Amazon Athena", + "Baserow", + // "Google Sheets", need to remove + "GraphQL", + // "gRPC", need to remove + "Mailgun", + "n8n", + "Notion", + "OpenAPI", + "REST API", + "SendGrid", + // "Slack", need to remove + "SMTP", + "Stripe", + "Twilio", + "Woocommerce", + //"Zendesk", need to remove + "Azure Blob Storage", + "GCS", + "Minio", + "AWS S3", +]; + +describe("Add all Data sources to app", () => { + beforeEach(() => { + cy.apiLogin(); + }); + + it("Should verify global data source page", () => { + cy.apiCreateWorkspace(data.workspaceName, data.workspaceSlug); + cy.visit(`${data.workspaceSlug}`); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + }); + + it("Should add all data sources in data source page", () => { + cy.visit(`${data.workspaceSlug}`); + + dataSources.forEach((dsName) => { + cy.get(commonSelectors.globalDataSourceIcon).click(); + selectAndAddDataSource("databases", dsName, dsName); // Using the correct fake name + + // Test connection + // cy.get(postgreSqlSelector.buttonTestConnection).click(); + // cy.get(postgreSqlSelector.textConnectionVerified, { + // timeout: 10000, + // }).should("have.text", postgreSqlText.labelConnectionVerified); + + // // Save data source + // cy.get(postgreSqlSelector.buttonSave).click(); + // cy.verifyToastMessage( + // commonSelectors.toastMessage, + // `Data Source ${dsName} saved.` + // ); + }); + }); + + it("Should add all data sources in the app", () => { + cy.visit(`${data.workspaceSlug}`); + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsNamefake); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.wrap(dataSources).each((dsName) => { + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type( + `cypress-${cyParamName(dsName)}-${cyParamName(dsName)}` + ); + cy.wait(500); + + cy.contains( + `[id*="react-select-"]`, + `cypress-${cyParamName(dsName)}-${cyParamName(dsName)}` + ) + .should("be.visible") + .click(); + + cy.wait(500); + }); + }); + + it("Should install all makretplace plugins and add them into the app", () => { + cy.visit(`${data.workspaceSlug}`); + const dataSourcesMarketplace = [ + "Plivo", + "GitHub", + "OpenAI", + "AWS Textract", + "HarperDB", + "AWS Redshift", + "PocketBase", + "AWS Lambda", + "Supabase", + "Engagespot", + // "Salesforce", need to remove + "Presto", + "Jira", + // "Sharepoint", need to remove + "Portkey", + "Pinecone", + "Hugging Face", + "Cohere", + "Gemini", + "Mistral", + "Anthropic", + "Qdrant", + "Weaviate DB", + ]; + + cy.get(commonSelectors.globalDataSourceIcon).click(); + + cy.window().then((win) => { + cy.stub(win, "open").callsFake((url) => { + win.location.href = url; + }); + }); + + cy.get('[data-cy="data-source-add-plugin"]').click(); + + cy.get(".marketplace-install").each(($el) => { + cy.wrap($el).click(); + cy.wait(500); + cy.get(commonSelectors.toastMessage).should("include.text", "installed"); + }); + cy.wait(1000); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get(commonSelectors.pageSectionHeader).should( + "have.text", + "Data sources" + ); + + cy.wrap(dataSourcesMarketplace).each((dsName) => { + cy.get(commonSelectors.globalDataSourceIcon).click(); + selectAndAddDataSource("databases", dsName, dsName); + cy.wait(500); + }); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsNamefake1); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.wrap(dataSourcesMarketplace).each((dsName) => { + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type( + `cypress-${cyParamName(dsName)}-${cyParamName(dsName)}` + ); + cy.wait(500); + + cy.contains( + `[id*="react-select-"]`, + `cypress-${cyParamName(dsName)}-${cyParamName(dsName)}` + ) + .should("be.visible") + .click(); + + cy.wait(500); + }); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTable.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTable.cy.js new file mode 100644 index 0000000000..1ae1290180 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/airTable.cy.js @@ -0,0 +1,288 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector, airTableSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { airtableText } from "Texts/airTable"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); +data.dsName1 = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source Airtable", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + }); + + it("Should verify elements on connection AirTable form", () => { + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource("databases", airtableText.airtable, data.dsName); + + cy.get(postgreSqlSelector.buttonSave).verifyVisibleElement( + "have.text", + postgreSqlText.buttonTextSave + ); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + deleteDatasource(`cypress-${data.dsName}-airtable`); + }); + + it("Should verify the functionality of AirTable connection form.", () => { + selectAndAddDataSource("databases", airtableText.airtable, data.dsName); + + fillDataSourceTextField( + airtableText.ApiKey, + airtableText.apikeyPlaceholder, + Cypress.env("airTable_apikey") + ); + cy.get(postgreSqlSelector.buttonSave).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get( + `[data-cy="cypress-${data.dsName}-airtable-button"]` + ).verifyVisibleElement("have.text", `cypress-${data.dsName}-airtable`); + deleteDatasource(`cypress-${data.dsName}-airtable`); + }); + + it("Should able to run the query with valid conection", () => { + const airTable_apiKey = Cypress.env("airTable_apikey"); + const airTable_baseId = Cypress.env("airtabelbaseId"); + const airTable_tableName = Cypress.env("airtable_tableName"); + const airTable_recordID = Cypress.env("airtable_recordId"); + + selectAndAddDataSource("databases", airtableText.airtable, data.dsName); + + fillDataSourceTextField( + airtableText.ApiKey, + airtableText.apikeyPlaceholder, + airTable_apiKey + ); + + cy.wait(1000); + cy.get(postgreSqlSelector.buttonSave).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get( + `[data-cy="cypress-${data.dsName}-airtable-button"]` + ).verifyVisibleElement("have.text", `cypress-${data.dsName}-airtable`); + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + // Verfiy List Recored operation + + cy.get(airTableSelector.operationSelectDropdown) + .click() + .type("List records{enter}"); + + cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror( + airTable_baseId + ); + + cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror( + airTable_tableName + ); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + + // Verfiy Retrieve record operation + + cy.get(airTableSelector.operationSelectDropdown) + .click() + .type("Retrieve record{enter}"); + + cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror( + airTable_baseId + ); + cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror( + airTable_tableName + ); + + cy.get(airTableSelector.recordIdInputField).clearAndTypeOnCodeMirror( + airTable_recordID + ); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + + // Verfiy Create record operation + + cy.get(airTableSelector.operationSelectDropdown) + .click() + .type("Create record{enter}"); + + cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror( + airTable_baseId + ); + + cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror( + airTable_tableName + ); + + cy.get(airTableSelector.bodyInputField) + .realClick() + .realType('[{"', { force: true, delay: 0 }) + .realType("fields", { force: true, delay: 0 }) + .realType('": {}', { force: true, delay: 0 }); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + + // Verfiy Update record operation + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName1); + + cy.get(airTableSelector.operationSelectDropdown) + .click() + .type("Update record{enter}"); + + cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror( + airTable_baseId + ); + cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror( + airTable_tableName + ); + + cy.get(airTableSelector.recordIdInputField).clearAndTypeOnCodeMirror( + airTable_recordID + ); + + cy.get(airTableSelector.bodyInputField) + .realClick() + .realType("{", { force: true, delay: 0 }) + .realType("{enter}", { force: true, delay: 0 }) + .realType('"Phone Number": "555_98"', { force: true, delay: 0 }); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName1}) completed.` + ); + + // Verify Delete record operation + + cy.get(airTableSelector.operationSelectDropdown) + .click() + .type("Delete record{enter}"); + + const recordId = Cypress._.uniqueId("recDummy_"); + + cy.request({ + method: "POST", + url: `https://api.airtable.com/v0/${airTable_baseId}/${airTable_tableName}`, + headers: { + Authorization: `Bearer ${Cypress.env("airTable_apikey")}`, + "Content-Type": "application/json", + }, + body: { + records: [ + { + fields: { + "Employee ID": "E005", + "First Name": "test", + "Last Name": "abc", + Email: "doe@example.com", + "Phone Number": "555-12", + }, + }, + ], + }, + }).then((createResponse) => { + const newRecordId = createResponse.body.records[0].id; + + cy.get(airTableSelector.operationSelectDropdown) + .click() + .type("Delete record{enter}"); + + cy.get(airTableSelector.baseIdInputField).clearAndTypeOnCodeMirror( + airTable_baseId + ); + cy.get(airTableSelector.tableNameInputField).clearAndTypeOnCodeMirror( + airTable_tableName + ); + + cy.get(airTableSelector.recordIdInputField).clearAndTypeOnCodeMirror( + newRecordId + ); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName1}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-airtable` + ); + }); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonAthena.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonAthena.cy.js new file mode 100644 index 0000000000..34bd7b6c82 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonAthena.cy.js @@ -0,0 +1,207 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { pluginSelectors } from "Selectors/plugins"; +import { postgreSqlText } from "Texts/postgreSql"; +import { amazonSesText } from "Texts/amazonSes"; +import { amazonAthenaText } from "Texts/amazonAthena"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source amazon athena", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + cy.intercept("POST", "/api/data_queries").as("createQuery"); + }); + + it("Should verify elements on amazon athena connection form", () => { + const Accesskey = Cypress.env("amazonathena_accessKey"); + const Secretkey = Cypress.env("amazonathena_secretKey"); + const DbName = Cypress.env("amazonathena_DbName"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource( + "databases", + amazonAthenaText.AmazonAthena, + data.dsName + ); + + cy.get(pluginSelectors.amazonAthenaDbName).click().type(DbName); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(" "); + + fillDataSourceTextField( + amazonSesText.labelSecretKey, + amazonAthenaText.placeholderSecretKey, + Secretkey + ); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(postgreSqlSelector.buttonTestConnection) + .verifyVisibleElement( + "have.text", + postgreSqlText.buttonTextTestConnection + ) + .click(); + cy.get(postgreSqlSelector.connectionFailedText).verifyVisibleElement( + "have.text", + postgreSqlText.couldNotConnect + ); + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-Amazon-Athena`); + }); + + it("Should verify the functionality of amazon athena connection form.", () => { + const Accesskey = Cypress.env("amazonathena_accessKey"); + const Secretkey = Cypress.env("amazonathena_secretKey"); + const DbName = Cypress.env("amazonathena_DbName"); + selectAndAddDataSource( + "databases", + amazonAthenaText.AmazonAthena, + data.dsName + ); + + cy.get(pluginSelectors.amazonAthenaDbName).click().type(DbName); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + amazonSesText.labelSecretKey, + amazonAthenaText.placeholderSecretKey, + Secretkey + ); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + cy.get(postgreSqlSelector.buttonSave).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-amazon-Athena`); + }); + + it("Should able to run the query with valid conection", () => { + const Accesskey = Cypress.env("amazonathena_accessKey"); + const Secretkey = Cypress.env("amazonathena_secretKey"); + const DbName = Cypress.env("amazonathena_DbName"); + selectAndAddDataSource( + "databases", + amazonAthenaText.AmazonAthena, + data.dsName + ); + + cy.get(pluginSelectors.amazonAthenaDbName).click().type(DbName); + + fillDataSourceTextField( + amazonAthenaText.labelAccesskey, + amazonAthenaText.placeholderEnteraAccessKey, + Cypress.env("amazonathena_accessKey") + ); + fillDataSourceTextField( + amazonAthenaText.labelSecretKey, + amazonAthenaText.placeholderSecretKey, + Cypress.env("amazonathena_secretKey") + ); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get( + `[data-cy="cypress-${data.dsName}-amazon-athena-button"]` + ).verifyVisibleElement("have.text", `cypress-${data.dsName}-amazon-athena`); + cy.wait(1000); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + cy.get('[data-cy="query-input-field"]').clearAndTypeOnCodeMirror( + "SHOW DATABASES;" + ); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-amazon-Athena` + ); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonses.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonses.cy.js new file mode 100644 index 0000000000..ed198b4af7 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/amazonses.cy.js @@ -0,0 +1,205 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { pluginSelectors } from "Selectors/plugins"; +import { postgreSqlText } from "Texts/postgreSql"; +import { amazonSesText } from "Texts/amazonSes"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source amazon ses", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + cy.intercept("POST", "/api/data_queries").as("createQuery"); + }); + + it("Should verify elements on amazonses connection form", () => { + const Accesskey = Cypress.env("amazonSes_accessKey"); + const Secretkey = Cypress.env("amazonSes_secretKey"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource("databases", amazonSesText.AmazonSES, data.dsName); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + amazonSesText.labelSecretKey, + "**************", + Secretkey + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-Amazon-ses`); + }); + + it("Should verify the functionality of amazonses connection form.", () => { + selectAndAddDataSource("databases", amazonSesText.AmazonSES, data.dsName); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + fillDataSourceTextField( + amazonSesText.labelAccesskey, + amazonSesText.placeholderAccessKey, + Cypress.env("amazonSes_accessKey") + ); + fillDataSourceTextField( + amazonSesText.labelSecretKey, + amazonSesText.placeholderSecretKey, + Cypress.env("amazonSes_secretKey") + ); + + cy.get(postgreSqlSelector.buttonSave).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get( + `[data-cy="cypress-${data.dsName}-amazon-ses-button"]` + ).verifyVisibleElement("have.text", `cypress-${data.dsName}-amazon-ses`); + + deleteDatasource(`cypress-${data.dsName}-amazon-ses`); + }); + + it("Should able to run the query with valid conection", () => { + const email = "adish" + "@" + "tooljet.com"; + selectAndAddDataSource("databases", amazonSesText.AmazonSES, data.dsName); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + fillDataSourceTextField( + amazonSesText.labelAccesskey, + amazonSesText.placeholderAccessKey, + Cypress.env("amazonSes_accessKey") + ); + fillDataSourceTextField( + amazonSesText.labelSecretKey, + amazonSesText.placeholderSecretKey, + Cypress.env("amazonSes_secretKey") + ); + + cy.get(postgreSqlSelector.buttonSave).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get( + `[data-cy="cypress-${data.dsName}-amazon-ses-button"]` + ).verifyVisibleElement("have.text", `cypress-${data.dsName}-amazon-ses`); + cy.wait(1000); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + cy.get(pluginSelectors.operationDropdown) + .click() + .type("Email service{enter}"); + + cy.wait(500); + + cy.get(pluginSelectors.sendEmailInputField) + .realClick() + .realType('{{["', { force: true, delay: 0 }) + .realType("mekhla@tooljet.com", { force: true, delay: 0 }); + + cy.get(pluginSelectors.ccEmailInputField) + .realClick() + .realType('{{["', { force: true, delay: 0 }) + .realType("mani@tooljet.com", { force: true, delay: 0 }); + + cy.get(pluginSelectors.bccEmailInputField) + .realClick() + .realType('{{["', { force: true, delay: 0 }) + .realType("midhun@tooljet.com", { force: true, delay: 0 }); + + cy.get(pluginSelectors.sendEmailFromInputField) + .realClick() + .realType("adish", { force: true, delay: 0 }) + .realType("@", { force: true, delay: 0 }) + .realType("tooljet.com", { force: true, delay: 0 }); + + cy.get(pluginSelectors.emailSubjetInputField).clearAndTypeOnCodeMirror( + "Testmail for amazon ses" + ); + + cy.get(pluginSelectors.emailbodyInputField).clearAndTypeOnCodeMirror( + "Body text for amazon ses" + ); + + cy.wait(1000); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-amazon-ses` + ); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/appWrite.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/appWrite.cy.js new file mode 100644 index 0000000000..707c333855 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/appWrite.cy.js @@ -0,0 +1,315 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { appwriteText } from "Texts/appWrite"; +import { appWriteSelectors } from "Selectors/Plugins"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source AppWrite", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + cy.intercept("POST", "/api/data_queries").as("createQuery"); + }); + + it("Should verify elements on appwrite connection form", () => { + const Host = Cypress.env("appwrite_host"); + const ProjectID = Cypress.env("appwrite_projectID"); + const DatabaseID = Cypress.env("appwrite_databaseID"); + const SecretKey = Cypress.env("appwrite_secretkey"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource("databases", appwriteText.appwrite, data.dsName); + + fillDataSourceTextField( + appwriteText.host, + appwriteText.hostPlaceholder, + Host + ); + + fillDataSourceTextField( + appwriteText.ProjectID, + appwriteText.projectIdPlaceholder, + ProjectID + ); + + fillDataSourceTextField( + appwriteText.DatabaseID, + appwriteText.databaseIdPlaceholder, + DatabaseID + ); + + fillDataSourceTextField( + appwriteText.SecretKey, + appwriteText.SecretKeyPlaceholder, + SecretKey + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-Appwrite`); + }); + + it("Should verify the functionality of appwrite connection form.", () => { + const Host = Cypress.env("appwrite_host"); + const ProjectID = Cypress.env("appwrite_projectID"); + const DatabaseID = Cypress.env("appwrite_databaseID"); + const SecretKey = Cypress.env("appwrite_secretkey"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", appwriteText.appwrite, data.dsName); + + fillDataSourceTextField( + appwriteText.host, + appwriteText.hostPlaceholder, + Host + ); + + fillDataSourceTextField( + appwriteText.ProjectID, + appwriteText.projectIdPlaceholder, + ProjectID + ); + + fillDataSourceTextField( + appwriteText.DatabaseID, + appwriteText.databaseIdPlaceholder, + DatabaseID + ); + + fillDataSourceTextField( + appwriteText.SecretKey, + appwriteText.SecretKeyPlaceholder, + SecretKey + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + deleteDatasource(`cypress-${data.dsName}-Appwrite`); + }); + + it("Should be able to run the query with a valid connection", () => { + const Host = Cypress.env("appwrite_host"); + const ProjectID = Cypress.env("appwrite_projectID"); + const DatabaseID = Cypress.env("appwrite_databaseID"); + const SecretKey = Cypress.env("appwrite_secretkey"); + const CollectionID = Cypress.env("appwrite_collectionID"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", appwriteText.appwrite, data.dsName); + + fillDataSourceTextField( + appwriteText.host, + appwriteText.hostPlaceholder, + Host + ); + fillDataSourceTextField( + appwriteText.ProjectID, + appwriteText.projectIdPlaceholder, + ProjectID + ); + fillDataSourceTextField( + appwriteText.DatabaseID, + appwriteText.databaseIdPlaceholder, + DatabaseID + ); + fillDataSourceTextField( + appwriteText.SecretKey, + appwriteText.SecretKeyPlaceholder, + SecretKey + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get( + `[data-cy="cypress-${data.dsName}-appwrite-button"]` + ).verifyVisibleElement("have.text", `cypress-${data.dsName}-appwrite`); + cy.wait(1000); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + // Create API document for delete operation + + cy.request({ + method: "POST", + url: `https://cloud.appwrite.io/v1/databases/${DatabaseID}/collections/${CollectionID}/documents`, + headers: { + "X-Appwrite-Project": ProjectID, + "X-Appwrite-Key": SecretKey, + "Content-Type": "application/json", + }, + body: { + documentId: "unique()", + data: { + User_name: "test", + User_ID: 30, + }, + permissions: ['read("any")'], + }, + }).then((response) => { + expect(response.status).to.eq(201); + cy.wrap(response.body.$id).as("documentId"); + }); + + // Verify all operations + const operations = [ + "List documents", + "Get document", + "Add Document to Collection", + "Update document", + "Delete document", + ]; + + cy.get("@documentId").then((documentId) => { + operations.forEach((operation) => { + cy.get(".react-select__input") + .eq(1) + .type(`${operation}{enter}`, { force: true }); + + if (operation === "Get document") { + cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror( + CollectionID + ); + + cy.get(appWriteSelectors.documentId).clearAndTypeOnCodeMirror( + Cypress.env("appwrite_documentID") + ); + } + + if (operation === "Add Document to Collection") { + cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror( + CollectionID + ); + cy.get(appWriteSelectors.bodyInput).clearAndTypeOnCodeMirror( + '{"User_name": "John Updated", "User_ID": 35}' + ); + } + + if (operation === "Update document") { + cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror( + CollectionID + ); + + cy.get(appWriteSelectors.documentId).clearAndTypeOnCodeMirror( + Cypress.env("appwrite_documentID") + ); + cy.get(appWriteSelectors.bodyInput).clearAndTypeOnCodeMirror( + '{"User_name": "John Updated", "User_ID": 35}' + ); + } + + if (operation === "List documents") { + cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror( + CollectionID + ); + } + + if (operation === "Delete document") { + cy.get(appWriteSelectors.collectionId).clearAndTypeOnCodeMirror( + CollectionID + ); + cy.get(appWriteSelectors.documentId).clearAndTypeOnCodeMirror( + documentId + ); + } + cy.get(dataSourceSelector.queryPreviewButton).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + }); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-Appwrite` + ); + }); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/awsLambda.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/awsLambda.cy.js new file mode 100644 index 0000000000..60422c2ea9 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/awsLambda.cy.js @@ -0,0 +1,187 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { pluginSelectors } from "Selectors/plugins"; +import { postgreSqlText } from "Texts/postgreSql"; +import { awsLambdaText } from "Texts/awsLambda"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source AWS Lambda", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + cy.intercept("POST", "/api/data_queries").as("createQuery"); + }); + + it("Should verify elements on AWS Lambda connection form", () => { + const Accesskey = Cypress.env("awslamda_access"); + const Secretkey = Cypress.env("awslamda_secret"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + cy.installMarketplacePlugin("AWS Lambda"); + + selectAndAddDataSource("databases", awsLambdaText.awsLambda, data.dsName); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + awsLambdaText.labelSecretKey, + "**************", + Secretkey + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-aws-lambda`); + }); + + it("Should verify the functionality of AWS Lambda connection form", () => { + const Accesskey = Cypress.env("awslamda_access"); + const Secretkey = Cypress.env("awslamda_secret"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.installMarketplacePlugin("AWS Lambda"); + + selectAndAddDataSource("databases", awsLambdaText.awsLambda, data.dsName); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + awsLambdaText.labelSecretKey, + "**************", + Secretkey + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-aws-lambda`); + }); + + it("Should able to run the query with valid conection", () => { + const Accesskey = Cypress.env("awslamda_access"); + const Secretkey = Cypress.env("awslamda_secret"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.installMarketplacePlugin("AWS Lambda"); + + selectAndAddDataSource("databases", awsLambdaText.awsLambda, data.dsName); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option") + .contains("US West (N. California)") + .wait(500) + .click(); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + awsLambdaText.labelSecretKey, + "**************", + Secretkey + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + cy.get(pluginSelectors.operationDropdown) + .click() + .type("Invoke Lambda Function{enter}"); + + cy.wait(500); + + cy.get( + '[data-cy="function-name-section"] .cm-content' + ).clearAndTypeOnCodeMirror("testAwslambdaPlugin"); + + cy.wait(500); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-aws-lambda` + ); + cy.uninstallMarketplacePlugin("AWS Lambda"); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/awsTextract.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/awsTextract.cy.js new file mode 100644 index 0000000000..9ac5973ebf --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/awsTextract.cy.js @@ -0,0 +1,225 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { pluginSelectors } from "Selectors/plugins"; +import { awsTextractSelectors } from "Selectors/Plugins"; +import { postgreSqlText } from "Texts/postgreSql"; +import { awsTextractText } from "Texts/awsTextract"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source AWS Textract", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + cy.intercept("POST", "/api/data_queries").as("createQuery"); + }); + + it("Should verify elements on AWS Textract connection form", () => { + const Accesskey = Cypress.env("awstextract_access"); + const Secretkey = Cypress.env("awstextract_secret"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + cy.installMarketplacePlugin("AWS Textract"); + + selectAndAddDataSource( + "databases", + awsTextractText.awsTextract, + data.dsName + ); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + awsTextractText.labelSecretKey, + "**************", + Secretkey + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-aws-textract`); + }); + + it("Should verify functionality of AWS Textract connection form", () => { + const Accesskey = Cypress.env("awstextract_access"); + const Secretkey = Cypress.env("awstextract_secret"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.installMarketplacePlugin("AWS Textract"); + + selectAndAddDataSource( + "databases", + awsTextractText.awsTextract, + data.dsName + ); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option").contains("US West (N. California)").click(); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + awsTextractText.labelSecretKey, + "**************", + Secretkey + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-aws-textract`); + }); + + it("Should able to run the query with valid conection", () => { + const Accesskey = Cypress.env("awstextract_access"); + const Secretkey = Cypress.env("awstextract_secret"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.installMarketplacePlugin("AWS Textract"); + + selectAndAddDataSource( + "databases", + awsTextractText.awsTextract, + data.dsName + ); + + cy.get(".react-select__dropdown-indicator").eq(1).click(); + cy.get(".react-select__option") + .contains("US West (N. California)") + .wait(500) + .click(); + + cy.get(pluginSelectors.amazonsesAccesKey).click().type(Accesskey); + + fillDataSourceTextField( + awsTextractText.labelSecretKey, + "**************", + Secretkey + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + // Verifying analyze document operation + cy.get(pluginSelectors.operationDropdown) + .click() + .wait(500) + .type("Analyze Document{enter}"); + + cy.wait(500); + + cy.get(awsTextractSelectors.documentInputField).clearAndTypeOnCodeMirror( + awsTextractText.documentName + ); + + cy.wait(500); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + // Verifying Analyze document stored in AWS S3 operation + + cy.get(pluginSelectors.operationDropdown) + .click() + .wait(500) + .type("Analyze document stored in AWS S3{enter}"); + + cy.wait(500); + + cy.get(awsTextractSelectors.bucketNameInputField).clearAndTypeOnCodeMirror( + awsTextractText.bucketName + ); + + cy.get(awsTextractSelectors.keyNameInputField).clearAndTypeOnCodeMirror( + awsTextractText.keyName + ); + + cy.wait(500); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-aws-textract` + ); + cy.uninstallMarketplacePlugin("AWS Textract"); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/baseRow.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/baseRow.cy.js new file mode 100644 index 0000000000..2e8ac905d8 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/baseRow.cy.js @@ -0,0 +1,218 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { pluginSelectors, baserowSelectors } from "Selectors/plugins"; +import { postgreSqlText } from "Texts/postgreSql"; +import { baseRowText } from "Texts/baseRow"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source baserow", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + cy.intercept("POST", "/api/data_queries").as("createQuery"); + }); + + it("Should verify elements on baserow connection form", () => { + const Apikey = Cypress.env("baserow_apikey"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource("databases", baseRowText.baserow, data.dsName); + + fillDataSourceTextField( + baseRowText.lableApiToken, + baseRowText.placeholderApiToken, + Apikey + ); + + cy.get(".react-select__control").eq(1).click(); + + cy.get(".react-select__option").contains("Baserow Cloud").click(); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-baserow`); + }); + + it("Should verify the functionality of baserow connection form.", () => { + const Apikey = Cypress.env("baserow_apikey"); + + selectAndAddDataSource("databases", baseRowText.baserow, data.dsName); + + fillDataSourceTextField( + baseRowText.lableApiToken, + baseRowText.placeholderApiToken, + Apikey + ); + + cy.get(".react-select__control").eq(1).click(); + + cy.get(".react-select__option").contains("Baserow Cloud").click(); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + deleteDatasource(`cypress-${data.dsName}-baserow`); + }); + + it("Should be able to run the query with a valid connection", () => { + const baserowTableID = Cypress.env("baserow_tableid"); + const baserowRowID = Cypress.env("baserow_rowid"); + const Apikey = Cypress.env("baserow_apikey"); + + selectAndAddDataSource("databases", baseRowText.baserow, data.dsName); + + fillDataSourceTextField( + baseRowText.lableApiToken, + baseRowText.placeholderApiToken, + Apikey + ); + + cy.get(".react-select__control").eq(1).click(); + cy.get(".react-select__option").contains("Baserow Cloud").click(); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + cy.get( + `[data-cy="cypress-${data.dsName}-baserow-button"]` + ).verifyVisibleElement("have.text", `cypress-${data.dsName}-baserow`); + cy.wait(1000); + + cy.log("Baserow Table ID:", baserowTableID); + cy.log("Row ID:", baserowRowID); + cy.log("API Key:", Apikey); + + if (!baserowTableID || !Apikey) { + throw new Error("Missing required environment variables!"); + } + + cy.request({ + method: "POST", + url: `https://api.baserow.io/api/database/rows/table/${baserowTableID}/`, + headers: { Authorization: `Token ${Apikey}` }, + body: { + field_1: "Sample Data", + field_2: "Another Value", + }, + }).then((response) => { + expect(response.status).to.eq(200); + const rowId = response.body.id; + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + // Verify delete operation (Need to uncomment after bug fixes) + + // cy.get('[data-cy="operation-select-dropdown"]').click(); + // cy.get(".react-select__option").contains("Delete row").click(); + + // cy.get(baserowSelectors.baserowTabelId).clearAndTypeOnCodeMirror(baserowTableID); + // cy.get(baserowSelectors.rowIdinputfield).clearAndTypeOnCodeMirror(rowId.toString()); + + // cy.get(dataSourceSelector.queryPreviewButton).click(); + // cy.verifyToastMessage(commonSelectors.toastMessage, `Query (${data.dsName}) completed.`); + }); + + // Verify other operations + const operations = [ + "List fields", + "List rows", + "Get row", + "Create row", + "Update row", + "Move row", + ]; + + operations.forEach((operation) => { + cy.get(pluginSelectors.operationDropdown).click(); + cy.get(".react-select__option").contains(operation).click(); + + cy.get(baserowSelectors.table).clearAndTypeOnCodeMirror(baserowTableID); + + if (operation === "Get row") { + cy.get(baserowSelectors.rowIdinputfield).clearAndTypeOnCodeMirror( + baserowRowID + ); + } + if (operation === "Move row") { + cy.get('[data-cy="before-id-input-field"]').clearAndTypeOnCodeMirror( + "1" + ); + } + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + }); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-baserow` + ); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/graphQL.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/graphQL.cy.js new file mode 100644 index 0000000000..008121b863 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/graphQL.cy.js @@ -0,0 +1,153 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { GraphQLText } from "Texts/graphQL"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source GraphQL", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + }); + + it("Should verify elements on GraphQL connection form", () => { + const Url = Cypress.env("GraphQl_Url"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource("databases", GraphQLText.GraphQL, data.dsName); + + fillDataSourceTextField( + GraphQLText.urlInputLabel, + GraphQLText.urlInputPlaceholder, + Url + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-GraphQL`); + }); + + it("Should verify the functionality of GraphQL connection form", () => { + const Url = Cypress.env("GraphQl_Url"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", GraphQLText.GraphQL, data.dsName); + + fillDataSourceTextField( + GraphQLText.urlInputLabel, + GraphQLText.urlInputPlaceholder, + Url + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-GraphQL`); + }); + + it("Should able to run the query with valid conection", () => { + const Url = Cypress.env("GraphQl_Url"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", GraphQLText.GraphQL, data.dsName); + + fillDataSourceTextField( + GraphQLText.urlInputLabel, + GraphQLText.urlInputPlaceholder, + Url + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + cy.get('[data-cy="query-input-field"]').clearAndTypeOnCodeMirror( + `{ + allFilms { + films { title director } + } + }` + ); + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-GraphQL` + ); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/harperDb.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/harperDb.cy.js new file mode 100644 index 0000000000..9ec327cf71 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/harperDb.cy.js @@ -0,0 +1,343 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { harperDbText } from "Texts/harperDb"; +import { harperDbSelectors } from "Selectors/Plugins"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); +data.dsName1 = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source HarperDB", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + }); + + it("Should verify elements on HarperDB connection form", () => { + const Host = Cypress.env("harperdb_host"); + const Port = Cypress.env("harperdb_port"); + const Username = Cypress.env("harperdb_username"); + const Password = Cypress.env("harperdb_password"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + cy.installMarketplacePlugin("HarperDB"); + + selectAndAddDataSource("databases", harperDbText.harperDb, data.dsName); + + fillDataSourceTextField( + harperDbText.hostLabel, + harperDbText.hostInputPlaceholder, + Host + ); + + fillDataSourceTextField( + harperDbText.portLabel, + harperDbText.portPlaceholder, + Port + ); + + fillDataSourceTextField( + harperDbText.userNameLabel, + harperDbText.userNamePlaceholder, + Username + ); + + fillDataSourceTextField( + harperDbText.passwordlabel, + harperDbText.passwordPlaceholder, + Password + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-HarperDB`); + }); + + it("Should verify functionality of HarperDB connection form", () => { + const Host = Cypress.env("harperdb_host"); + const Port = Cypress.env("harperdb_port"); + const Username = Cypress.env("harperdb_username"); + const Password = Cypress.env("harperdb_password"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.installMarketplacePlugin("HarperDB"); + + selectAndAddDataSource("databases", harperDbText.harperDb, data.dsName); + + fillDataSourceTextField( + harperDbText.hostLabel, + harperDbText.hostInputPlaceholder, + Host + ); + + fillDataSourceTextField( + harperDbText.portLabel, + harperDbText.portPlaceholder, + Port + ); + + fillDataSourceTextField( + harperDbText.userNameLabel, + harperDbText.userNamePlaceholder, + Username + ); + + fillDataSourceTextField( + harperDbText.passwordlabel, + harperDbText.passwordPlaceholder, + Password + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-HarperDB`); + }); + + it("Should be able to run the query with a valid connection", () => { + const Host = Cypress.env("harperdb_host"); + const Port = Cypress.env("harperdb_port"); + const Username = Cypress.env("harperdb_username"); + const Password = Cypress.env("harperdb_password"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.installMarketplacePlugin("HarperDB"); + + selectAndAddDataSource("databases", harperDbText.harperDb, data.dsName); + + fillDataSourceTextField( + harperDbText.hostLabel, + harperDbText.hostInputPlaceholder, + Host + ); + + fillDataSourceTextField( + harperDbText.portLabel, + harperDbText.portPlaceholder, + Port + ); + + fillDataSourceTextField( + harperDbText.userNameLabel, + harperDbText.userNamePlaceholder, + Username + ); + + fillDataSourceTextField( + harperDbText.passwordlabel, + harperDbText.passwordPlaceholder, + Password + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + // Verifying NoSQL Operation + + cy.get(".react-select__input") + .eq(1) + .click({ force: true }) + .wait(500) + .type(`NoSQL mode{enter}`, { force: true }); + + const operationsDB = [ + "Insert", + "Update", + "Search By Hash", + "Search By Value", + "Search By Condition", + "Delete", + ]; + + operationsDB.forEach((operation) => { + cy.get(".react-select__input") + .eq(2) + .click({ force: true }) + .wait(500) + .type(`${operation}{enter}`, { force: true }); + + const commonFields = { + "schema-input-field": harperDbText.schemaValue, + "table-input-field": harperDbText.tableValue, + }; + + Object.entries(commonFields).forEach(([field, value]) => { + cy.get(`[data-cy="${field}"]`).clearAndTypeOnCodeMirror(value); + }); + + if (["Insert", "Update"].includes(operation)) { + cy.get(harperDbSelectors.recordsInputField).clearAndTypeOnCodeMirror( + harperDbText.recordsValue + ); + } + + if (operation === "Search By Hash") { + cy.get(harperDbSelectors.hashValueInputField).clearAndTypeOnCodeMirror( + harperDbText.hashValue + ); + cy.get(harperDbSelectors.attributesInputField).clearAndTypeOnCodeMirror( + harperDbText.attributesValue + ); + } + + if (operation === "Search By Value") { + cy.get( + harperDbSelectors.searchAttributeInputField + ).clearAndTypeOnCodeMirror(harperDbText.searchAttributeValue); + + cy.get( + harperDbSelectors.searchValueInputField + ).clearAndTypeOnCodeMirror(harperDbText.searchValue); + cy.get(harperDbSelectors.attributesInputField).clearAndTypeOnCodeMirror( + harperDbText.attributesValue + ); + } + + if (operation === "Search By Condition") { + cy.get(".react-select__input") + .eq(3) + .click({ force: true }) + .wait(500) + .type("Or{enter}", { force: true }); + + cy.get(harperDbSelectors.attributesInputField).clearAndTypeOnCodeMirror( + harperDbText.attributesValue + ); + cy.get(harperDbSelectors.conditionInputField).clearAndTypeOnCodeMirror( + harperDbText.condtionValue + ); + } + + if (operation === "Delete") { + cy.get(harperDbSelectors.hashValueInputField).clearAndTypeOnCodeMirror( + harperDbText.hashValue + ); + } + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + }); + + // Verifying SQL Operation + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName1); + + cy.get(".react-select__input") + .eq(1) + .should("be.visible") + .click({ force: true }) + .wait(500) + .type(`SQL mode{enter}`, { force: true }); + + cy.wait(1000); + + cy.get(harperDbSelectors.sqlQueryInputField).clearAndTypeOnCodeMirror( + harperDbText.sqlValue + ); + + cy.get(dataSourceSelector.queryPreviewButton).click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName1}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-HarperDB` + ); + cy.uninstallMarketplacePlugin("HarperDB"); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/minio.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/minio.cy.js new file mode 100644 index 0000000000..7ea22b8693 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/minio.cy.js @@ -0,0 +1,285 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { minioText } from "Texts/minio"; +import { minioSelectors } from "Selectors/Plugins"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source minio", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + }); + + it("Should verify elements on minio connection form", () => { + const Host = Cypress.env("minio_host"); + const Port = Cypress.env("minio_port"); + const AccessKey = Cypress.env("minio_accesskey"); + const SecretKey = Cypress.env("minio_secretkey"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource("databases", minioText.minio, data.dsName); + + fillDataSourceTextField( + minioText.hostLabel, + minioText.hostInputPlaceholder, + Host + ); + + fillDataSourceTextField( + minioText.portLabel, + minioText.portPlaceholder, + Port + ); + + cy.get(`[${minioSelectors.sslToggle}]`).click(); + + fillDataSourceTextField( + minioText.labelAccesskey, + minioText.placeholderAccessKey, + AccessKey + ); + + fillDataSourceTextField( + minioText.labelSecretKey, + minioText.placeholderSecretKey, + SecretKey + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-minio`); + }); + + it("Should verify functionality of minio connection form", () => { + const Host = Cypress.env("minio_host"); + const Port = Cypress.env("minio_port"); + const AccessKey = Cypress.env("minio_accesskey"); + const SecretKey = Cypress.env("minio_secretkey"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", minioText.minio, data.dsName); + + fillDataSourceTextField( + minioText.hostLabel, + minioText.hostInputPlaceholder, + Host + ); + + fillDataSourceTextField( + minioText.portLabel, + minioText.portPlaceholder, + Port + ); + + cy.get(`[${minioSelectors.sslToggle}]`).click(); + + fillDataSourceTextField( + minioText.labelAccesskey, + minioText.placeholderAccessKey, + AccessKey + ); + + fillDataSourceTextField( + minioText.labelSecretKey, + minioText.placeholderSecretKey, + SecretKey + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-minio`); + }); + + it("Should be able to run the query with a valid connection", () => { + const Host = Cypress.env("minio_host"); + const Port = Cypress.env("minio_port"); + const AccessKey = Cypress.env("minio_accesskey"); + const SecretKey = Cypress.env("minio_secretkey"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", minioText.minio, data.dsName); + + fillDataSourceTextField( + minioText.hostLabel, + minioText.hostInputPlaceholder, + Host + ); + + fillDataSourceTextField( + minioText.portLabel, + minioText.portPlaceholder, + Port + ); + + cy.get(`[${minioSelectors.sslToggle}]`).click(); + + fillDataSourceTextField( + minioText.labelAccesskey, + minioText.placeholderAccessKey, + AccessKey + ); + + fillDataSourceTextField( + minioText.labelSecretKey, + minioText.placeholderSecretKey, + SecretKey + ); + + cy.get(postgreSqlSelector.buttonTestConnection).click(); + cy.get(postgreSqlSelector.textConnectionVerified, { + timeout: 10000, + }).should("have.text", postgreSqlText.labelConnectionVerified); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + const operationsMinio = [ + "List buckets", + "Put object", + "List objects in a bucket", + "Read object", + "Presigned url for download", + "Presigned url for upload", + "Remove object", + ]; + + operationsMinio.forEach((operation) => { + cy.get(".react-select__input") + .eq(1) + .type(`${operation}{enter}`, { force: true }); + + if (operation === "List objects in a bucket") { + cy.get(minioSelectors.bucketNameInputField).clearAndTypeOnCodeMirror( + minioText.bucketName + ); + } + if (operation === "Read object" || operation === "Remove object") { + cy.get(minioSelectors.bucketNameInputField).clearAndTypeOnCodeMirror( + minioText.bucketName + ); + cy.get(minioSelectors.objectNameInputField).clearAndTypeOnCodeMirror( + minioText.objectName + ); + } + if (operation === "Put object") { + cy.get(minioSelectors.bucketNameInputField).clearAndTypeOnCodeMirror( + minioText.bucketName + ); + cy.get(minioSelectors.objectNameInputField).clearAndTypeOnCodeMirror( + minioText.objectName + ); + cy.get(minioSelectors.contentTypeInputField).clearAndTypeOnCodeMirror( + '"string"' + ); + cy.get(minioSelectors.dataInput).clearAndTypeOnCodeMirror(`test`); + } + if ( + operation === "Presigned url for download" || + operation === "Presigned url for upload" + ) { + cy.get(minioSelectors.bucketNameInputField).clearAndTypeOnCodeMirror( + minioText.bucketName + ); + cy.get(minioSelectors.objectNameInputField).clearAndTypeOnCodeMirror( + minioText.objectName + ); + } + + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + }); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-minio` + ); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/oracleDbHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/oracleDbHappyPath.cy.skip.js index c42bda600b..e7ae4f296b 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/oracleDbHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/oracleDbHappyPath.cy.skip.js @@ -123,7 +123,7 @@ describe("Data sources", () => { ); cy.clearAndType( - '[data-cy="data-source-name-input-filed"]', + '[data-cy="data-source-name-input-field"]', postgreSqlText.psqlName ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js index 6f4ff3baaa..8217a9db60 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/redisHappyPath.cy.js @@ -11,26 +11,22 @@ import { } from "Support/utils/postgreSql"; import { - verifyCouldnotConnectWithAlert, deleteDatasource, closeDSModal, - addQuery, addDsAndAddQuery, + deleteAppandDatasourceAfterExecution, } from "Support/utils/dataSource"; -import { openQueryEditor } from "Support/utils/dataSource"; -import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; - const data = {}; data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); describe("Data source Redis", () => { beforeEach(() => { - cy.appUILogin(); - cy.intercept("POST", "/api/data_queries").as("createQuery"); + cy.apiLogin(); + cy.defaultWorkspaceLogin(); }); - it("Should verify elements on connection Redison form", () => { + it("Should verify elements on connection Redis form", () => { cy.get(commonSelectors.globalDataSourceIcon).click(); closeDSModal(); @@ -114,7 +110,7 @@ describe("Data source Redis", () => { deleteDatasource(`cypress-${data.dsName}-redis`); }); - it("Should verify the functionality of Redis connection form.", () => { + it("Should verify the functionality of Redis connection form", () => { selectAndAddDataSource("databases", redisText.redis, data.dsName); fillDataSourceTextField( @@ -143,7 +139,7 @@ describe("Data source Redis", () => { cy.get(postgreSqlSelector.buttonTestConnection).click(); cy.get('[data-cy="connection-alert-text"]').should( "have.text", - "WRONGPASS invalid username-password pair or user is disabled." + redisText.errorInvalidUserOrPassword ); fillDataSourceTextField( postgreSqlText.labelHost, @@ -176,7 +172,7 @@ describe("Data source Redis", () => { cy.get(postgreSqlSelector.buttonTestConnection).click(); cy.get('[data-cy="connection-alert-text"]').should( "have.text", - "WRONGPASS invalid username-password pair or user is disabled." + redisText.errorInvalidUserOrPassword ); fillDataSourceTextField( @@ -193,7 +189,7 @@ describe("Data source Redis", () => { cy.get(postgreSqlSelector.buttonTestConnection).click(); cy.get('[data-cy="connection-alert-text"]').should( "have.text", - "WRONGPASS invalid username-password pair or user is disabled." + redisText.errorInvalidUserOrPassword ); fillDataSourceTextField( @@ -256,5 +252,9 @@ describe("Data source Redis", () => { cy.skipWalkthrough(); addDsAndAddQuery("redis", `TIME`, `cypress-${data.dsName}-redis`); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-redis` + ); }); }); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js new file mode 100644 index 0000000000..6cebadc79d --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/restAPIHappyPath.cy.js @@ -0,0 +1,383 @@ +import { fake } from "Fixtures/fake"; +import { commonSelectors } from "Selectors/common"; +import { closeDSModal, deleteDatasource } from "Support/utils/dataSource"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { restAPISelector } from "Selectors/restAPI"; +import { restAPIText } from "Texts/restAPI"; +import { fillDataSourceTextField } from "Support/utils/postgreSql"; + +const data = {}; +const authenticationDropdownSelector = + ".dynamic-form-element > .css-nwhe5y-container > .react-select__control"; +const grantTypeDropdown = + ":nth-child(1) > :nth-child(2) > .react-select__control"; +const addAccessTokenDropdown = + ":nth-child(9) > .css-nwhe5y-container > .react-select__control"; +const clientAuthenticationDropdown = + ":nth-child(14) > .css-nwhe5y-container > .react-select__control"; + +describe("Data source Rest API", () => { + beforeEach(() => { + cy.defaultWorkspaceLogin(); + cy.intercept("GET", "/api/v2/data_sources"); + data.dataSourceName = fake.lastName + .toLowerCase() + .replaceAll("[^A-Za-z]", ""); + }); + it("Should verify elements on Rest API connection form", () => { + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { key: "url", value: "" }, + { key: "auth_type", value: "none" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { key: "client_secret", value: "", encrypted: true }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "", encrypted: false }, + { key: "password", value: "", encrypted: true }, + { key: "bearer_token", value: "", encrypted: true }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + ] + ); + cy.reload(); + cy.get(`[data-cy="cypress-${data.dataSourceName}-restapi-button"]`) + .should("be.visible") + .click(); + cy.get(restAPISelector.inputField("data-source-name")).should( + "have.value", + `cypress-${data.dataSourceName}-restapi` + ); + cy.get(restAPISelector.subHeaderLabel(restAPIText.credentialsText)).should( + "have.text", + restAPIText.credentialsText + ); + const sections = [ + restAPIText.baseUrlLabel, + restAPIText.headersLabel, + restAPIText.urlParametesLabel, + restAPIText.bodyLabel, + restAPIText.cookiesLabel, + ]; + + sections.forEach((section) => { + cy.get(restAPISelector.subHeaderLabel(section)).should( + "have.text", + section + ); + + if (section !== restAPIText.baseUrlLabel) { + cy.get(restAPISelector.keyInputField(section, 0)).should("be.visible"); + cy.get(restAPISelector.valueInputField(section, 0)).should( + "be.visible" + ); + cy.get(restAPISelector.deleteButton(section, 0)).should("be.visible"); + cy.get(restAPISelector.addMoreButton(section)).should("be.visible"); + } else { + cy.get('[data-cy="base-url-text-field"]').should("be.visible"); + } + }); + + cy.get( + restAPISelector.subHeaderLabel(restAPIText.authenticationText) + ).should("have.text", restAPIText.authenticationText); + cy.get( + restAPISelector.subHeaderLabel(restAPIText.authenticationTypeLabel) + ).should("have.text", restAPIText.authenticationTypeLabel); + + cy.get(authenticationDropdownSelector).click(); + cy.contains( + `[id*="react-select-"]`, + restAPIText.basicAuth.basicText + ).click(); + cy.get(authenticationDropdownSelector).should( + "have.text", + restAPIText.basicAuth.basicText + ); + + cy.get( + restAPISelector.subHeaderLabel(restAPIText.basicAuth.usernameLabel) + ).should("have.text", restAPIText.basicAuth.usernameLabel); + cy.get( + restAPISelector.inputField(restAPIText.basicAuth.usernameLabel) + ).should("be.visible"); + cy.get( + restAPISelector.subHeaderLabel(restAPIText.basicAuth.passwordLabel) + ).should("have.text", restAPIText.basicAuth.passwordLabel); + cy.get(restAPISelector.button(restAPIText.editButtonText)).should( + "be.visible" + ); + cy.get( + restAPISelector.inputField(restAPIText.basicAuth.passwordLabel) + ).should("be.visible"); + + cy.get(authenticationDropdownSelector).click(); + cy.contains(`[id*="react-select-"]`, restAPIText.bearerAuth.bearerText) + .should("be.visible") + .click(); + cy.get(authenticationDropdownSelector).should( + "have.text", + restAPIText.bearerAuth.bearerText + ); + cy.get( + restAPISelector.subHeaderLabel(restAPIText.bearerAuth.tokenLabel) + ).should("have.text", restAPIText.bearerAuth.tokenLabel); + cy.get( + restAPISelector.inputField(restAPIText.bearerAuth.tokenLabel) + ).should("be.visible"); + + cy.get(authenticationDropdownSelector).click(); + cy.contains(`[id*="react-select-"]`, restAPIText.oAuthText).click(); + cy.get(authenticationDropdownSelector).should( + "have.text", + restAPIText.oAuthText + ); + cy.get(restAPISelector.subHeaderLabel(restAPIText.grantTypeLabel)).should( + "have.text", + restAPIText.grantTypeLabel + ); + cy.get(grantTypeDropdown).click(); + cy.contains( + `[id*="react-select-"]`, + restAPIText.authorizationCode.authorizationCodeLabel + ) + .should("be.visible") + .click(); + cy.get(grantTypeDropdown).should( + "contain", + restAPIText.authorizationCode.authorizationCodeLabel + ); + cy.get( + restAPISelector.inputField( + restAPIText.authorizationCode.headerPrefixLabel + ) + ).should(($input) => { + expect($input.val().trim()).to.equal(restAPIText.bearerAuth.bearerText); + }); + cy.get( + restAPISelector.inputField( + restAPIText.authorizationCode.accessTokenURLLabel + ) + ) + .invoke("attr", "placeholder") + .should("eq", "https://api.example.com/oauth/token"); + cy.get( + restAPISelector.inputField(restAPIText.authorizationCode.clientIDLabel) + ).should("be.visible"); + cy.get(restAPISelector.button(restAPIText.editButtonText)).should( + "be.visible" + ); + cy.get( + restAPISelector.inputField( + restAPIText.authorizationCode.clientSecretLabel + ) + ).should("be.visible"); + Object.entries(restAPIText.authorizationCode).forEach(([key, value]) => { + if ( + key !== "authorizationCodeLabel" && + key !== "requestHeader" && + key !== "sendBasicAuthheaderOption" && + key !== "sendClientCredentialsBodyOption" + ) { + cy.get( + restAPISelector.subHeaderLabel(restAPIText.authorizationCode[key]) + ).should("have.text", value); + } + }); + cy.get(addAccessTokenDropdown) + .should("be.visible") + .and("contain", restAPIText.authorizationCode.requestHeader); + cy.get( + restAPISelector.inputField(restAPIText.authorizationCode.scopeLabel) + ).should("be.visible"); + + const authorizationCodeSections = [ + restAPIText.authorizationCode.accessTokenURLCustomHeadersLabel, + restAPIText.authorizationCode.customQueryParametersLabel, + restAPIText.authorizationCode.customAuthenticationParametersLabel, + ]; + authorizationCodeSections.forEach((authorizationCodeSections) => { + cy.get( + restAPISelector.subHeaderLabel(authorizationCodeSections) + ).verifyVisibleElement("have.text", authorizationCodeSections); + if (authorizationCodeSections !== restAPIText.baseUrlLabel) { + cy.get( + restAPISelector.keyInputField(authorizationCodeSections, 0) + ).should("be.visible"); + cy.get( + restAPISelector.valueInputField(authorizationCodeSections, 0) + ).should("be.visible"); + cy.get( + restAPISelector.deleteButton(authorizationCodeSections, 0) + ).should("be.visible"); + cy.get(restAPISelector.addMoreButton(authorizationCodeSections)).should( + "be.visible" + ); + } else { + cy.get('[data-cy="base-url-text-field"]').should("be.visible"); + } + }); + cy.get(clientAuthenticationDropdown).click(); + cy.contains( + `[id*="react-select-"]`, + restAPIText.authorizationCode.sendClientCredentialsBodyOption + ).should("be.visible"); + cy.contains( + `[id*="react-select-"]`, + restAPIText.authorizationCode.sendBasicAuthheaderOption + ) + .should("be.visible") + .click(); + cy.get(clientAuthenticationDropdown).should( + "have.text", + restAPIText.authorizationCode.sendBasicAuthheaderOption + ); + cy.get( + restAPISelector.subHeaderLabel( + restAPIText.authorizationCode.authenticationRequiredUsersToggle + ) + ).verifyVisibleElement( + "have.text", + restAPIText.authorizationCode.authenticationRequiredUsersToggle + ); + cy.get(restAPISelector.authenticationAllUsersToggleSwitch).should( + "be.visible" + ); + cy.get(grantTypeDropdown).click(); + cy.contains( + `[id*="react-select-"]`, + restAPIText.clientCredentials.clientCredentialsLabel + ) + .should("be.visible") + .click(); + cy.get(grantTypeDropdown).should( + "contain", + restAPIText.clientCredentials.clientCredentialsLabel + ); + Object.entries(restAPIText.clientCredentials).forEach(([key, value]) => { + if (key !== "clientCredentialsLabel") { + cy.get( + restAPISelector.subHeaderLabel(restAPIText.clientCredentials[key]) + ).should("have.text", value); + } + }); + + cy.get( + restAPISelector.subHeaderLabel(restAPIText.secureSocketsLayerText) + ).should("have.text", restAPIText.secureSocketsLayerText); + cy.get(restAPISelector.dropdownLabel("SSL Certificate")).should( + "have.text", + "SSL Certificate" + ); + cy.get( + restAPISelector.subHeaderLabel(restAPIText.generalSettingsText) + ).should("have.text", restAPIText.generalSettingsText); + cy.get(restAPISelector.retryNetworkToggleSwitch).should("be.visible"); + cy.get(restAPISelector.retryNetworkToggleText).should( + "have.text", + restAPIText.retryNetworkErrorsToggleLabel + ); + cy.get(restAPISelector.retryNetworkToggleSubtext).should( + "have.text", + restAPIText.retryToggleHelperText + ); + cy.get(restAPISelector.readDocumentationLinkText).should( + "have.text", + postgreSqlText.readDocumentation + ); + cy.contains("Save").click(); + cy.verifyToastMessage(commonSelectors.toastMessage, "Data Source Saved"); + deleteDatasource(`cypress-${data.dataSourceName}-restapi`); + }); + it("Should verify connection for Rest API", () => { + cy.apiCreateGDS( + `${Cypress.env("server_host")}/api/data-sources`, + `cypress-${data.dataSourceName}-restapi`, + "restapi", + [ + { key: "url", value: Cypress.env("restAPI_BaseURL") }, + { key: "auth_type", value: "none" }, + { key: "grant_type", value: "authorization_code" }, + { key: "add_token_to", value: "header" }, + { key: "header_prefix", value: "Bearer " }, + { key: "access_token_url", value: "" }, + { key: "client_id", value: "" }, + { key: "client_secret", value: "", encrypted: true }, + { key: "audience", value: "" }, + { key: "scopes", value: "read, write" }, + { key: "username", value: "", encrypted: false }, + { key: "password", value: "", encrypted: true }, + { key: "bearer_token", value: "", encrypted: true }, + { key: "auth_url", value: "" }, + { key: "client_auth", value: "header" }, + { key: "headers", value: [["", ""]] }, + { key: "custom_query_params", value: [["", ""]], encrypted: false }, + { key: "custom_auth_params", value: [["", ""]] }, + { + key: "access_token_custom_headers", + value: [["", ""]], + encrypted: false, + }, + { key: "multiple_auth_enabled", value: false, encrypted: false }, + { key: "ssl_certificate", value: "none", encrypted: false }, + { key: "retry_network_errors", value: true, encrypted: false }, + ] + ); + cy.reload(); + // cy.apiCreateApp(`${fake.companyName}-restAPI-App`); + // cy.apiAddQueryToApp( + // "restapi1", + // { + // method: "get", + // url: "", + // url_params: [["", ""]], + // headers: [["", ""]], + // cookies: [["", ""]], + // }, + // `cypress-${data.dataSourceName}-restapi`, + // "restapi" + // ); + }); +}); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js index 3e8a243c53..7a128c1470 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/s3HappyPath.cy.js @@ -19,7 +19,8 @@ const data = {}; describe("Data sources AWS S3", () => { beforeEach(() => { - cy.appUILogin(); + cy.apiLogin(); + cy.defaultWorkspaceLogin(); data.dataSourceName = fake.lastName .toLowerCase() .replaceAll("[^A-Za-z]", ""); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sapHanaHappyPath.cy.skip.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sapHanaHappyPath.cy.skip.js index 813b2663c9..c240286274 100644 --- a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sapHanaHappyPath.cy.skip.js +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/sapHanaHappyPath.cy.skip.js @@ -108,7 +108,7 @@ describe("Data sources", () => { selectAndAddDataSource(postgreSqlText.postgreSQL); cy.clearAndType( - '[data-cy="data-source-name-input-filed"]', + '[data-cy="data-source-name-input-field"]', postgreSqlText.psqlName ); diff --git a/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/twilio.cy.js b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/twilio.cy.js new file mode 100644 index 0000000000..ee2fa9a6e3 --- /dev/null +++ b/cypress-tests/cypress/e2e/happyPath/marketplace/commonTestcases/data-source/twilio.cy.js @@ -0,0 +1,197 @@ +import { fake } from "Fixtures/fake"; +import { postgreSqlSelector } from "Selectors/postgreSql"; +import { postgreSqlText } from "Texts/postgreSql"; +import { twilioText } from "Texts/twilio"; +import { twilioSelectors } from "Selectors/Plugins"; +import { commonSelectors } from "Selectors/common"; +import { commonText } from "Texts/common"; + +import { + fillDataSourceTextField, + selectAndAddDataSource, +} from "Support/utils/postgreSql"; + +import { + deleteDatasource, + closeDSModal, + deleteAppandDatasourceAfterExecution, +} from "Support/utils/dataSource"; + +import { dataSourceSelector } from "../../../../../constants/selectors/dataSource"; +import { pluginSelectors } from "Selectors/plugins"; + +const data = {}; +data.dsName = fake.lastName.toLowerCase().replaceAll("[^A-Za-z]", ""); + +describe("Data source Twilio", () => { + beforeEach(() => { + cy.apiLogin(); + cy.defaultWorkspaceLogin(); + }); + + it("Should verify elements on Twilio connection form", () => { + const AuthToken = Cypress.env("twilio_auth_token"); + const AccountSID = Cypress.env("twilio_account_SID"); + const MessageSID = Cypress.env("twilio_messaging_service_SID"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + cy.get(postgreSqlSelector.allDatasourceLabelAndCount).should( + "have.text", + postgreSqlText.allDataSources() + ); + cy.get(postgreSqlSelector.commonlyUsedLabelAndCount).should( + "have.text", + postgreSqlText.commonlyUsed + ); + cy.get(postgreSqlSelector.databaseLabelAndCount).should( + "have.text", + postgreSqlText.allDatabase() + ); + cy.get(postgreSqlSelector.apiLabelAndCount).should( + "have.text", + postgreSqlText.allApis + ); + cy.get(postgreSqlSelector.cloudStorageLabelAndCount).should( + "have.text", + postgreSqlText.allCloudStorage + ); + + selectAndAddDataSource("databases", twilioText.twilio, data.dsName); + + fillDataSourceTextField( + twilioText.authTokenLabel, + twilioText.authTokenPlaceholder, + AuthToken + ); + + fillDataSourceTextField( + twilioText.accountSidLabel, + twilioText.accountSidPlaceholder, + AccountSID + ); + + fillDataSourceTextField( + twilioText.messagingSIDLabel, + twilioText.messagingSIDPalceholder, + MessageSID + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-twilio`); + }); + + it("Should verify functionality of Twilio connection form", () => { + const AuthToken = Cypress.env("twilio_auth_token"); + const AccountSID = Cypress.env("twilio_account_SID"); + const MessageSID = Cypress.env("twilio_messaging_service_SID"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", twilioText.twilio, data.dsName); + + fillDataSourceTextField( + twilioText.authTokenLabel, + twilioText.authTokenPlaceholder, + AuthToken + ); + + fillDataSourceTextField( + twilioText.accountSidLabel, + twilioText.accountSidPlaceholder, + AccountSID + ); + + fillDataSourceTextField( + twilioText.messagingSIDLabel, + twilioText.messagingSIDPalceholder, + MessageSID + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + deleteDatasource(`cypress-${data.dsName}-twilio`); + }); + + it("Should be able to run the query with a valid connection", () => { + const AuthToken = Cypress.env("twilio_auth_token"); + const AccountSID = Cypress.env("twilio_account_SID"); + const MessageSID = Cypress.env("twilio_messaging_service_SID"); + const MessageNumber = Cypress.env("twilio_message_number"); + + cy.get(commonSelectors.globalDataSourceIcon).click(); + closeDSModal(); + + selectAndAddDataSource("databases", twilioText.twilio, data.dsName); + + fillDataSourceTextField( + twilioText.authTokenLabel, + twilioText.authTokenPlaceholder, + AuthToken + ); + + fillDataSourceTextField( + twilioText.accountSidLabel, + twilioText.accountSidPlaceholder, + AccountSID + ); + + fillDataSourceTextField( + twilioText.messagingSIDLabel, + twilioText.messagingSIDPalceholder, + MessageSID + ); + + cy.get(postgreSqlSelector.buttonSave) + .verifyVisibleElement("have.text", postgreSqlText.buttonTextSave) + .click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + postgreSqlText.toastDSSaved + ); + + cy.get(commonSelectors.dashboardIcon).click(); + cy.get(commonSelectors.appCreateButton).click(); + cy.get(commonSelectors.appNameInput).click().type(data.dsName); + cy.get(commonSelectors.createAppButton).click(); + cy.skipWalkthrough(); + + cy.get('[data-cy="show-ds-popover-button"]').click(); + cy.get(".css-4e90k9").type(`${data.dsName}`); + cy.contains(`[id*="react-select-"]`, data.dsName).click(); + cy.get('[data-cy="query-rename-input"]').clear().type(data.dsName); + + cy.get(pluginSelectors.operationDropdown).click().type("Send SMS{enter}"); + + cy.get(twilioSelectors.toNumberInputField).clearAndTypeOnCodeMirror( + MessageNumber + ); + cy.get(twilioSelectors.bodyInput).clearAndTypeOnCodeMirror( + twilioText.messageText + ); + cy.get(dataSourceSelector.queryPreviewButton).click(); + cy.verifyToastMessage( + commonSelectors.toastMessage, + `Query (${data.dsName}) completed.` + ); + deleteAppandDatasourceAfterExecution( + data.dsName, + `cypress-${data.dsName}-twilio` + ); + }); +}); diff --git a/cypress-tests/cypress/support/utils/dataSource.js b/cypress-tests/cypress/support/utils/dataSource.js index 348f563ee5..f6e63cadb3 100644 --- a/cypress-tests/cypress/support/utils/dataSource.js +++ b/cypress-tests/cypress/support/utils/dataSource.js @@ -4,6 +4,7 @@ import { cyParamName } from "Selectors/common"; import { commonSelectors, commonWidgetSelector } from "Selectors/common"; import { commonText } from "Texts/common"; import { dataSourceSelector } from "Selectors/dataSource"; +import { verifyAppDelete } from "Support/utils/dashboard"; import { dataSourceText } from "Texts/dataSource"; import { navigateToAppEditor } from "Support/utils/common"; @@ -61,6 +62,16 @@ export const deleteDatasource = (datasourceName) => { // ); }; +export const deleteAppandDatasourceAfterExecution = ( + appName, + datasourceName +) => { + cy.backToApps(); + cy.deleteApp(appName); + verifyAppDelete(appName); + deleteDatasource(datasourceName); +}; + export const closeDSModal = () => { cy.get("body").then(($body) => { cy.wait(500); @@ -96,9 +107,7 @@ export const addQueryN = (queryName, query, dbName) => { export const addQuery = (queryName, query, dbName) => { cy.get('[data-cy="show-ds-popover-button"]').click(); cy.get(".css-4e90k9").type(`${dbName}`); - cy.intercept("POST", "/api/data_queries").as( - "createQuery" - ); + cy.intercept("POST", "/api/data_queries").as("createQuery"); cy.contains(`[id*="react-select-"]`, dbName).click(); cy.get('[data-cy="query-rename-input"]').clear().type(queryName); @@ -225,7 +234,14 @@ export const createDataQuery = (appName, url, key, value) => { }); }; -export const createRestAPIQuery = (queryName, dsName, key = '', value = '', url = "", run = true) => { +export const createRestAPIQuery = ( + queryName, + dsName, + key = "", + value = "", + url = "", + run = true +) => { cy.getCookie("tj_auth_token").then((cookie) => { const headers = { "Tj-Workspace-Id": Cypress.env("workspaceId"), diff --git a/cypress-tests/cypress/support/utils/mongoDB.js b/cypress-tests/cypress/support/utils/mongoDB.js index 0ca418db9d..61107f639e 100644 --- a/cypress-tests/cypress/support/utils/mongoDB.js +++ b/cypress-tests/cypress/support/utils/mongoDB.js @@ -10,7 +10,7 @@ export const connectMongo = () => { selectAndAddDataSource(mongoDbText.mongoDb); cy.clearAndType( - '[data-cy="data-source-name-input-filed"]', + '[data-cy="data-source-name-input-field"]', mongoDbText.cypressMongoDb ); diff --git a/cypress-tests/cypress/support/utils/multipage.js b/cypress-tests/cypress/support/utils/multipage.js index 8821054af0..299986f47c 100644 --- a/cypress-tests/cypress/support/utils/multipage.js +++ b/cypress-tests/cypress/support/utils/multipage.js @@ -3,7 +3,7 @@ import { commonSelectors } from "../../constants/selectors/common"; export const searchPage = (pageName) => { cy.get('[title="Search"]').click(); - cy.get('[data-cy="search-input-filed"]').type(pageName); + cy.get('[data-cy="search-input-field"]').type(pageName); }; export const clearSearch = () => { diff --git a/cypress-tests/cypress/support/utils/postgreSql.js b/cypress-tests/cypress/support/utils/postgreSql.js index fc3f257627..227e12efa7 100644 --- a/cypress-tests/cypress/support/utils/postgreSql.js +++ b/cypress-tests/cypress/support/utils/postgreSql.js @@ -48,27 +48,25 @@ export const selectAndAddDataSource = ( dataSourceName ) => { cy.get(commonSelectors.globalDataSourceIcon).click(); - cy.wait(1000) + cy.wait(1000); cy.get(`[data-cy="${cyParamName(dscategory)}-datasource-button"]`).click(); - cy.wait(500) + cy.wait(500); cy.get(postgreSqlSelector.dataSourceSearchInputField).type(dataSource); - cy.get(`[data-cy="data-source-${(dataSource).toLowerCase()}"]`) + cy.get(`[data-cy="data-source-${dataSource.toLowerCase()}"]`) .parent() .within(() => { cy.get( - `[data-cy="data-source-${( - dataSource - ).toLowerCase()}"]>>>.datasource-card-title` + `[data-cy="data-source-${dataSource.toLowerCase()}"]>>>.datasource-card-title` ).realHover("mouse"); cy.get( `[data-cy="${cyParamName(dataSource).toLowerCase()}-add-button"]` ).click(); }); - cy.wait(1000) - cy.get(postgreSqlSelector.buttonSave).should("be.disabled") + cy.wait(1000); + cy.get(postgreSqlSelector.buttonSave).should("be.disabled"); cy.clearAndType( - '[data-cy="data-source-name-input-filed"]', + '[data-cy="data-source-name-input-field"]', cyParamName(`cypress-${dataSourceName}-${dataSource}`) ); cy.get(postgreSqlSelector.buttonSave).click(); @@ -127,7 +125,8 @@ export const fillDataSourceTextField = ( ); cy.get(`[data-cy="${cyParamName(fieldName)}-text-field"]`).then(($field) => { if ($field.is(":disabled")) { - cy.get(".datasource-edit-btn").click(); + cy.get(".datasource-edit-btn").wait(500).click(); + cy.wait(500); } }); cy.get(`[data-cy="${cyParamName(fieldName)}-text-field"]`) @@ -135,7 +134,9 @@ export const fillDataSourceTextField = ( .should("eq", placeholder.replace(/\u00a0/g, " ")); cy.get(`[data-cy="${cyParamName(fieldName)}-text-field"]`) + .wait(500) .clear() + .wait(500) .type(input, args); }; @@ -184,4 +185,4 @@ export const addWidgetsToAddUser = () => { addEventHandlerToRunQuery("add_data_using_widgets"); }; -export const addListviewToVerifyData = () => { }; \ No newline at end of file +export const addListviewToVerifyData = () => {}; diff --git a/deploy/docker/.env.internal.example b/deploy/docker/.env.internal.example index ecac28f9ff..75387df966 100644 --- a/deploy/docker/.env.internal.example +++ b/deploy/docker/.env.internal.example @@ -2,7 +2,7 @@ # The application expects a separate .env.test for test environment configuration # Get detailed information about each variable here: https://docs.tooljet.com/docs/setup/env-vars -TOOLJET_HOST=http://localhost:80 +TOOLJET_HOST=http://localhost:8082 LOCKBOX_MASTER_KEY= # replace_with_lockbox_master_key SECRET_KEY_BASE= # replace_with_secret_key_base diff --git a/docker/ee/ee-production.Dockerfile b/docker/ee/ee-production.Dockerfile index 230a2f8ebb..b69458daa1 100644 --- a/docker/ee/ee-production.Dockerfile +++ b/docker/ee/ee-production.Dockerfile @@ -62,8 +62,40 @@ FROM debian:11 RUN apt-get update -yq \ && apt-get install curl gnupg zip -yq \ && apt-get install -yq build-essential \ + && apt -y install redis \ && apt-get clean -y +# Install required dependencies for downloading and extracting files +RUN apt-get update && apt-get install -y \ + curl tar xz-utils postgresql postgresql-contrib postgresql-client && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +# Install PostgREST from official Docker image +COPY --from=postgrest/postgrest:v12.2.0 /bin/postgrest /bin + +RUN apt-get update && apt-get install -y supervisor + +# Create supervisord configuration file +RUN echo "[supervisord]\n" \ + "nodaemon=true\n" \ + "\n" \ + "[program:postgrest]\n" \ + "command=/bin/postgrest \n" \ + "autostart=true\n" \ + "autorestart=true\n" \ + "stdout_logfile=/dev/stdout\n" \ + "stderr_logfile=/dev/stderr\n" \ + "stdout_logfile_maxbytes=0\n" \ + "stderr_logfile_maxbytes=0\n" \ + "\n" | sed 's/ //' > /etc/supervisor/conf.d/supervisord.conf + +# Create a wrapper for PostgREST to prefix its logs +RUN mv /bin/postgrest /bin/postgrest-original && \ + echo '#!/bin/bash\n\ +exec /bin/postgrest-original "$@" 2>&1 | sed "s/^/[PostgREST] /"\n\ +' > /bin/postgrest && \ + chmod +x /bin/postgrest + RUN curl -O https://nodejs.org/dist/v18.18.2/node-v18.18.2-linux-x64.tar.xz \ && tar -xf node-v18.18.2-linux-x64.tar.xz \ @@ -152,6 +184,25 @@ RUN mkdir -p /tmp/.npm/npm-cache/_logs \ && chmod g+s /tmp/.npm/npm-cache/_logs \ && chmod -R g=u /tmp/.npm/npm-cache/_logs +# Create Redis data, log, and configuration directories +RUN mkdir -p /var/lib/redis /var/log/redis /etc/redis \ + && chown -R appuser:0 /var/lib/redis /var/log/redis /etc/redis \ + && chmod g+s /var/lib/redis /var/log/redis /etc/redis \ + && chmod -R g=u /var/lib/redis /var/log/redis /etc/redis + +# Set permissions for PostgREST binary +RUN chown appuser:0 /bin/postgrest && chmod u+x /bin/postgrest && chmod g=u /bin/postgrest + +RUN touch /tmp/postgrest.conf \ + && chown appuser:0 /tmp/postgrest.conf \ + && chmod 640 /tmp/postgrest.conf + +# Create PostgREST data, log, and configuration directories +RUN mkdir -p /var/lib/postgrest /var/log/postgrest /etc/postgrest \ + && chown -R appuser:0 /var/lib/postgrest /var/log/postgrest /etc/postgrest \ + && chmod g+s /var/lib/postgrest /var/log/postgrest /etc/postgrest \ + && chmod -R g=u /var/lib/postgrest /var/log/postgrest /etc/postgrest + ENV HOME=/home/appuser # Switch back to appuser diff --git a/docs/README.md b/docs/README.md index 1b387d94d6..f4e8a76fde 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,7 +3,7 @@

ToolJet Documentation

-The directory "ToolJet/docs/" holds the code and markdown source files for the ToolJet documentation website, which is accessible at [docs.tooljet.com](docs.tooljet.com) +The directory "ToolJet/docs/" holds the code and markdown source files for the ToolJet documentation website, which is accessible at [docs.tooljet.ai](docs.tooljet.ai) ## Index - [Feedback](#feedback) @@ -26,7 +26,7 @@ In case you encounter any issues with the ToolJet product, please select the rel To contribute to ToolJet documentation, you need to fork this repository and submit a pull request for the Markdown and/or image changes that you're proposing. ### Repository organization -The content in this directory follows the organization of documentation at https://docs.tooljet.com +The content in this directory follows the organization of documentation at https://docs.tooljet.ai This directory contains the following folders: @@ -41,15 +41,15 @@ This directory contains the following folders: ├── versioned_docs │ ├── version-x.x.x # Current/latest version (set it on docusauras.config.js) │ │ ├── Enterprise -│ │ │ └── multi-environment.md # https://docs.tooljet.com/docs/Enterprise/multi-environment -│ │ └── tooljet-database.md. # https://docs.tooljet.com/docs/tooljet-database +│ │ │ └── multi-environment.md # https://docs.tooljet.ai/docs/Enterprise/multi-environment +│ │ └── tooljet-database.md. # https://docs.tooljet.ai/docs/tooljet-database │ └── version-2.0.0 │ │ ├── Enterprise -│ │ │ └── multi-environment.md # https://docs.tooljet.com/docs/2.0.0/Enterprise/multi-environment +│ │ │ └── multi-environment.md # https://docs.tooljet.ai/docs/2.0.0/Enterprise/multi-environment │ │ └── tooljet-database.md │ └── version-1.0.0 │ ├── Enterprise -│ │ └── multi-environment.md # https://docs.tooljet.com/docs/1.0.0/Enterprise/multi-environment +│ │ └── multi-environment.md # https://docs.tooljet.ai/docs/1.0.0/Enterprise/multi-environment │ └── tooljet-database.md ├── versioned_sidebars # includes sidebar for the specific versions │ ├── version-x.x.x-sidebars.json diff --git a/docs/build-latest-version.sh b/docs/build-latest-version.sh index e8004f169d..ece4ff1a5c 100755 --- a/docs/build-latest-version.sh +++ b/docs/build-latest-version.sh @@ -1,31 +1,17 @@ #!/bin/bash set -e -CONFIG_FILE="docusaurus.config.js" +VERSIONS_FILE="versions.json" -# Extract lastVersion from docusaurus.config.js using sed -LAST_VERSION=$(sed -n "s/.*lastVersion: *'\\([^']*\\)'.*/\\1/p" "$CONFIG_FILE") -if [ -z "$LAST_VERSION" ]; then - echo "Error: lastVersion not found in $CONFIG_FILE" +# Ensure versions.json exists +if [ ! -f "$VERSIONS_FILE" ]; then + echo "Error: $VERSIONS_FILE not found." exit 1 fi -echo "Found lastVersion: $LAST_VERSION" -# Extract all version numbers from the entire file -ALL_VERSIONS=$(grep -oE "'[0-9]+\.[0-9]+\.[0-9]+(-[A-Za-z]+)?'" "$CONFIG_FILE" | sed "s/'//g" | sort -u -V -r) -if [ -z "$ALL_VERSIONS" ]; then - echo "Error: No versions found in $CONFIG_FILE" - exit 1 -fi -echo "Found raw versions:" -echo "$ALL_VERSIONS" - -# Convert the extracted versions into a JSON array format -VERSION_ARRAY=$(echo "$ALL_VERSIONS" | jq -R -s -c 'split("\n")[:-1] + ["'"$LAST_VERSION"'"] | unique') -echo "Updating versions.json with: $VERSION_ARRAY" - -# Update versions.json with combined data -echo $VERSION_ARRAY | jq . > versions.json +# Output existing versions from versions.json for reference +echo "Using versions from $VERSIONS_FILE:" +jq . "$VERSIONS_FILE" # Install dependencies and build the project npm i && npm run build diff --git a/docs/docs/Enterprise/_category_.json b/docs/docs/Enterprise/_category_.json deleted file mode 100644 index b9b132f890..0000000000 --- a/docs/docs/Enterprise/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Enterprise", - "position": 9, - "collapsed": true -} \ No newline at end of file diff --git a/docs/docs/Enterprise/superadmin.md b/docs/docs/Enterprise/superadmin.md deleted file mode 100644 index aa6da283a5..0000000000 --- a/docs/docs/Enterprise/superadmin.md +++ /dev/null @@ -1,320 +0,0 @@ ---- -id: superadmin -title: Super Admin ---- - -
Available on: Paid plans
- -A Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance. An instance can have more than one Super Admin. A Super Admin has full control over other users' workspaces and can create users, groups, and other super admins. - -The user details entered while setting up ToolJet will have Super Admin privileges. - -
- -## How Super Admin is Different from Admin - -|
Privilege
| Admin | Super Admin | -| --------- | ----- | ----------- | -| Manage Users in their workspace (Invite/Archive/Unarchive) | ✅ | ✅ | -| Manage Groups in their workspace (Create Group/Add or Delete Users from groups/ Modify Group Permissions) | ✅ | ✅ | -| Manage SSO in their workspace | ✅ | ✅ | -| Manage Workspace Variables in their workspace | ✅ | ✅ | -| Manage Workspace Constants in their workspace | ✅ | ✅ | -| [Manage data sources for the user group in their workspace](/docs/data-sources/overview#user-permissions) | ✅ | ✅ | -| [Access any user's personal workspace (create, edit or delete apps)](#access-any-workspace) | ❌ | ✅ | -| [Archive Admin or any user of any workspace](#archiveunarchive-users) | ❌ | ✅ | -| [Access any user's ToolJet database (create, edit or delete database)](#access-tooljet-db-in-any-workspace) | ❌ | ✅ | -| [Manage any workspace's setting (Groups/SSO/Workspace constants)](#manage-workspace-settings-groupsssoworkspace-constants) | ❌ | ✅ | -| [Manage all users from all the workspaces in the instance](#manage-all-users-in-the-instance) | ❌ | ✅ | -| [Archive/Unarchive any user from all the workspaces in the instance](#archiving-a-user-from-all-the-workspaces-instance-level) | ❌ | ✅ | -| [Reset password of any user](#reset-password-of-any-user) | ❌ | ✅ | -| [Edit name of any user](#edit-name) | ❌ | ✅ | -| [Make any user Super Admin](#make-the-user-super-admin) | ❌ | ✅ | -| [Manage all workspaces in the instance(Archive/Unarchive)](#all-workspaces) | ❌ | ✅ | -| [Restrict creation of personal workspace of users](#restrict-creation-of-personal-workspace-of-users) | ❌ | ✅ | -| [Configure instance level login](#instance-login) | ❌ | ✅ | -| [Enable Multiplayer editing](#enable-multiplayer-editing) | ❌ | ✅ | -| [Implement White Labelling](#white-labelling) | ❌ | ✅ | - -
- -
- -## Super Admin features - -### Access any workspace - -If a user is a Super Admin, they can switch to any workspace created by any user within the instance using the Workspace Switcher located in the bottom left corner of the screen. - -The dropdown will display all workspaces, including those created by both Super Admins and any other users. - -
- Superadmin: settings -
- -### Create, Edit or Delete apps from any user's personal workspace - -Once the Super Admin access the workspace of any other user, they can create, edit or delete app on the workspace. - -This also includes - modifying folders and importing, exporting, or cloning apps to any user's workspace. - -### Archive/Unarchive Users - -Super Admin can not only archive/unarchive users/admins on their workspace but also from the workspaces of any other user. - -If a user is Super Admin, they just need to open the workspace in which they want to archive or unarchive a user. Then go to the **Workspace Settings** from the sidebar -> **Manage Users** -> **Archive/Unarchive** any user/admin - -
- Superadmin: settings -
- -### Access ToolJet DB in any workspace - -Super Admins have access to the database of any user's workspace - just like Super Admins can access any application in any workspace. They have full access to modify or create any table in the ToolJet DB of any workspace. - -### Manage Workspace Settings (Groups/SSO/Workspace constants) - -Super Admins have all the privileges that an Admin of a workspace have, Super Admins can: -- **✅ Manage Groups**: Creating/Deleting/Updating a Group in any workspace -- **✅ Manage SSO**: Full control over General Settings, Password login and other SSO options -- **✅ Workspace Variables**: Adding, updating or deleting workspace variables -- **✅ Workspace Constants**: Adding, updating or deleting workspace constants -- **✅ Copilot**: Enabling or disabling Copilot -- **✅ Custom Styles**: Adding or modifying custom styles - -
- -
- -## Settings - -Only Super Admins can access the Settings. To access the Settings page, click on the **⚙️** button and select **Settings** from the dropdown. - -- **[All Users](#all-users)** -- **[All workspaces](#all-workspaces)** -- **[Manage instance settings](#manage-instance-settings)** -- **[License](#license)** -- **[White labelling](#white-labelling)** - -
- Superadmin: settings -
- -
- -
- -## All Users - -### Manage all Users in the Instance - -**All Users** settings can be used to check the list of all the users available on all the workspaces in the instance. Super Admins can also promote/demote any user to/from Super Admin from this page. They can also archive/unarchive any user at an instance level from this setting. - -
- Superadmin: settings -
- -### Archiving a User from all the Workspaces (Instance Level) - -Super Admins have the authority to deactivate any user at instance level. This will remove the user from all the workspaces in the instance. - -To archive a user, go to the **All Users** settings, click on the kebab menu next to the user that is to be archived and select **Archive** option. Once the user is archived, the status will change from **Active** to **Archived**. The user will not be able to login to any workspace in the instance. - -
- Superadmin: settings -
- -
- -**Unarchiving** a user from **All Users** settings will unarchive the user from the instance and not at workspace level. - -**Info**: The user will be unarchived from instance level automatically if a workspace admin unarchives the user from their workspace. - -
- Superadmin: settings -
- -### Reset Password of any User - -Super Admins can reset the password of any user from the **All Users** settings. To reset the password, click on the kebab menu next to the user and select **Reset Password** option. A pop-up will appear asking either to auto-generate a password or to enter a new password. - -### Edit User Details - -Super Admins can edit the details of any user from the **All Users** settings. To edit the details, click on the kebab menu next to the user and select **Edit user details** option. - -#### Edit name - -On selecting the **Edit user details** option, a drawer will open from the right. Super Admins can edit the name of the user from this drawer. Once the changes are made, click on the **Update** button. - -#### Make the user Super Admin - -From the **Edit user details** drawer, Super Admins can make any user as Super Admin or remove any Super Admin from the **All Users** settings. To make a user Super Admin, toggle on the **Super Admin** radio button. The user will become Super Admin and the Type column will update from **`Workspace`** to **`Instance`**. - -
- Superadmin: settings -
- -
- -
- -## All Workspaces - -The All Workspaces tab provides a comprehensive view of all workspaces within the ToolJet instance. Super Admins can use this functionality to monitor and manage workspaces collectively, ensuring efficient administration and organization-wide oversight. - -Super Admins have the authority to **archive** or **unarchive** workspaces of any user in the instance as needed. Archiving a workspace essentially sets it to an inactive state, removing it from active use. Conversely, unarchiving reactivates a previously archived workspace, making it accessible once again. - -
- Superadmin: settings -
- -
- -
- -### Current Workspace - -The **Current Workspace** label will be displayed next to the workspace that the Super Admin has currently opened. If the Super Admin archives the current workspace, they will be prompted to switch to another active workspace to ensure continuous accessibility. - -
- -
- -### Open Active Workspaces - -In the list of active workspaces, there is an option to open the workspace directly. This feature helps superadmins to quickly navigate to the workspace on the new tab of the browser and manage the workspace. - -
- -
- -### Archive Workspaces - -The **Archive** button on the right of the workspace name allows Super Admins to archive the workspace. Once archived, the workspace will be moved to the **Archived Workspaces** section. - -**Impact**: -- The apps on the archived workspace won't be accessable through the URL -- Users will be logged out if they don't have access to any active workspace - -
- -
- -### Archived Workspaces - -The **Archived** section displays a list of all archived workspaces. Super Admins can unarchive any workspace from this section by clicking the **Unarchive** button. - -
- Superadmin: settings -
- -
- -
- -## Manage Instance Settings - -
- Superadmin: settings -
- -
- -
- -### Restrict Creation of Personal Workspace of Users - -When a user joins a workspace, they are provided with their own personal workspace and option to create new workspaces. - -Super Admins can **control** this behavior from the Manage Settings page, they can **toggle off** the option to **Allow personal workspace**. Now whenever a user joins a workspace they won't be provided a personal workspace nor they will be able to create a new workspace in the instance. - -
- -
- -### Enable Multiplayer Editing - -Super Admins can enable multiplayer editing from the Manage Settings page. Once enabled, users will be able to edit the same app simultaneously resulting in real-time collaboration. - -
- -
- -### Comments - -Super Admins can enable comments from the Manage Settings page. Once enabled, users will be able to collaborate by adding comments anywhere on the canvas. - -
- -
- -## White Labelling -This feature allows you to customize the ToolJet instance with your own branding. You can change the logo, favicon, and the name of the instance. - -Check out the [White labelling](/docs/enterprise/white-label/) page for more details. - -
- -
- -## Instance Login - -Instance login configuration at the Settings level allows super admins to set up and manage the default login method for all workspaces within the instance. This ensures a standardized login experience unless individual workspace admins choose to configure a different method for their specific workspace. - -
- -
- -### Access and Permissions - -Only super admins have the authority to configure **Instance login** settings. This ensures centralized control over the default login method across the entire instance. - -
- -
- -### Super Admin URL - -This URL serves as a fail-safe in scenarios where password login is disabled, SSO is not configured, or a paid plan expires. Importantly, this URL exclusively supports password login and is accessible only by the super admin, preventing any unauthorized access. - -The default URL for super admin login is `https:///login/super-admin`. This URL can be accessed by the super admin to log in to the instance and manage the settings. - -
- -
- -### Enable sign-up - -The "Enable Sign Up" option allows users to sign up without being invited. It is important to note that this feature includes both password login and SSO, providing a seamless onboarding experience for users. - -
- -
- -### Password login - -Super admins can enable or disable password login for the entire instance. This setting ensures that all workspaces within the instance adhere to the same login method, unless individual workspace admins choose to configure a different method for their specific workspace. - -
- -
- -### Enable Workspace Configuration - -Turning off this option restricts workspace admins from configuring the login method for their workspace. This configuration hides the Workspace Login option from the workspace settings tab. - -
- Superadmin: settings -
- -
- -
- -## License - -Manage the instance license via the **Settings** page. Super Admins have the capability to update the instance's license key from this page. - -Check out the [License](/docs/org-management/licensing/self-hosted) page for more details. - -
\ No newline at end of file diff --git a/docs/docs/Enterprise/white-label.md b/docs/docs/Enterprise/white-label.md deleted file mode 100644 index b4277bdc40..0000000000 --- a/docs/docs/Enterprise/white-label.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -id: white-label -title: White Label ---- - -
Available on: Paid plans
- -The White Label feature allows you to completely remove ToolJet's branding from the ToolJet platform, allowing you to replace it with your own customized logo, favicon and page title. This feature grants you full control over the visual identity of your ToolJet-powered application, ensuring a seamless and personalized user experience. - -With this feature, you gain the ability to rebrand the following key elements: - -- **Application Logo**: This includes the logo displayed on the login screen, dashboard, and app-editor. - -
- ToolJet - Enterprise - White label -
- -- **Favicon**: The small icon associated with your application. It is displayed in the browser tab. - -- **Page Title**: This is the text displayed in the browser tab. - -Example, we have set a favicon image and page title as `Bon Ton` in the below image. - -
- ToolJet - Enterprise - White label -
- -
- -## Configuration - -To enable white labelling, click on the gear icon on the bottom left of the dashboard and select `Settings`. From the settings page, click on the `White labelling` tab. On the White labelling page, you'll be able to configure the following: - -- **Application Logo**: Add the URL of the image you want to use as your application logo. Preferred dimensions of the logo are: width `130px` and height `26px`. -- **Favicon**: Enter the URL of the image you want to use as your application's favicon. Preferred dimensions of the favicon are: width `32px` and height `32px` or `16px` and height `16px`. -- **Page Title**: Enter the text you want to display as your application's title. Preferred title length are 50-60 characters. - -
- ToolJet - Enterprise - White label -
- -
- -
- -## ToolJet Cloud - -If you are using ToolJet Cloud, click on the gear icon on the bottom left of the dashboard and select `Settings`. From the settings page, click on the `White labelling` tab. On the White labelling page, you'll be able to configure the following: - -- **Application Logo**: Add the URL of the image you want to use as your application logo. Preferred dimensions of the logo are: width `130px` and height `26px`. -- **Page Title**: Enter the text you want to display as your application's title. Preferred title length are 50-60 characters. -- **Favicon**: Enter the URL of the image you want to use as your application's favicon. Preferred dimensions of the favicon are: width `32px` and height `32px` or `16px` and height `16px`. - -
- ToolJet - Enterprise - White label -
- -
- diff --git a/docs/docs/actions/control-component.md b/docs/docs/actions/control-component.md index 61f653d21e..bab10a66bb 100644 --- a/docs/docs/actions/control-component.md +++ b/docs/docs/actions/control-component.md @@ -7,7 +7,7 @@ Control component action invokes the component specific actions. Component speci You can find the component specific actions for the specific component in their respective documentation. For example, you can find the component specific actions for the **Bounded Box** component in the [Bounded Box](/docs/widgets/bounded-box) documentation. -
+
Currently, Component specific actions are supported only by the below listed components.
    diff --git a/docs/docs/app-builder/anti-patterns.md b/docs/docs/app-builder/anti-patterns.md new file mode 100644 index 0000000000..096f10ad1f --- /dev/null +++ b/docs/docs/app-builder/anti-patterns.md @@ -0,0 +1,131 @@ +--- +id: anti-patterns +title: Anti-Patterns to Avoid +--- + +When building applications with ToolJet, it's essential to follow best practices to ensure your apps are efficient, maintainable, and provide a smooth user experience. This documentation outlines common anti-patterns to avoid while using ToolJet and offers solutions to optimize your applications. + +--- + +## 1. Unmanaged Component Naming + +- **Anti-Pattern**: Using default or non-descriptive names for components. +- **Solution**: **Rename all components with meaningful names to make the apps more manageable as they grow.** +- **Reason**: Descriptive names improve readability, making it easier for you and others to understand and maintain the app's structure. + +--- + +## 2. Exceeding Component Limits + +- **Anti-Pattern**: Having more than 2,500 components in a single app. +- **Solution**: **Limit each app to a maximum of 2,500 components.** +- **Reason**: Exceeding this number can slow down the app builder and live apps, impacting both development speed and user experience. + +--- + +## 3. Client-Side Operations for Large Data Sets + +- **Anti-Pattern**: Handling large data sets with client-side operations on the Table component. +- **Solution**: **Implement [server-side operations](/docs/widgets/table/serverside-operations/overview) for handling large data sets.** +- **Reason**: Server-side operations reduces the amount of data loaded at once, improving load times and performance. + +--- + +## 4. Simultaneous Execution of Multiple JavaScript Queries + +- **Anti-Pattern**: Triggering a large amount of JavaScript queries simultaneously through a single event. For example, using an event to trigger a **Run JavaScript code** query that contains code to execute 15-20 other **Run JavaScript code** queries within the application. +- **Solution**: **Limit the number of simultaneous JavaScript queries triggered by a single event.** +- **Reason**: Triggering numerous Run JavaScript queries at the same time can significantly degrade browser performance as it each JavaScript query creates **[new execution environment](https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide/In_depth#javascript_execution_contexts)** within the browser. JavaScript in browsers runs on a single main thread. When multiple scripts are executed concurrently, they compete for execution time on this thread. + +--- + +## 5. Storing Base64 Data in Variables + +- **Anti-Pattern**: Capturing and storing Base64 data directly in variables. +- **Solution**: **Store large data, like base64 images, in a database and retrieve it as needed.** +- **Reason**: Storing Base64 data in variables can consume significant memory and slow down the app. Retrieving data from a database as needed optimizes performance. + +--- + +## 6. Loading All Tabs Simultaneously + +- **Anti-Pattern**: Loading all items in the Tab component at once when there are numerous tabs. +- **Solution**: **Enable the “Render only active tabs” option.** +- **Reason**: This prevents unnecessary loading of inactive tabs, reducing initial load times and improving performance. + +--- + +## 7. Excessive Number of Pages in an App + +- **Anti-Pattern**: Including too many pages within a single app. +- **Solution**: **Limit the number of pages per app to maintain optimal performance.** +- **Reason**: An excessive number of pages can slow down the app and make it difficult to manage. Organize content efficiently and consider splitting the app if necessary. + +--- + +## 8. Using Non-Blocking Commands in JavaScript for Synchronous Operations + +- **Anti-Pattern**: Using non-blocking commands like `Promise.all` and `setTimeout` in the **Run JavaScript code** query when an accurate isLoading state is needed. +- **Solution**: **Avoid non-blocking operations in JavaScript Queries if you require an accurate isLoading status. Ensure your code is synchronous within the Run JavaScript code query.** +- **Reason**: Non-blocking operations can cause **Run JavaScript code** query to exit before these commands complete, leading to an incorrect isLoading status and potentially confusing users. + +--- + +## 9. Triggering Unnecessary Queries on Page Load + +- **Anti-Pattern**: Triggering all queries on page load, regardless of their necessity. +- **Solution**: **For multi-page apps, only trigger queries on page load that are needed for the specific page.** +- **Reason**: Loading unnecessary data consumes resources and slows down page load times. Optimizing queries enhances performance. + +--- + +## 10. Using Actions inside Loop Functions +- **Anti-Pattern**: Using actions inside loop functions. + +Example: +You have a Table displaying data from `{{page.variables.data}}` and a **Save Changes** button that updates the data. When users edit rows and click **Save Changes**, you might initially implement the update like this: + +```javascript +const data = page.variables.data; +Object.values(components.table1.dataUpdates).forEach(ele => { + data[ele.id] = ele; + actions.setPageVariable("data", data); +}); +``` + +The setPageVariable action is executed inside the loop for each row update. This causes the table to re-render every time the variable is updated, leading to significant performance degradation, especially when multiple rows or cells are updated simultaneously. + +- **Solution**: **Modify your code to update the page variable once after all changes are processed**: + +```javascript +const data = page.variables.data; +Object.values(components.table1.dataUpdates).forEach(ele => { + data[ele.id] = ele; +}); +actions.setPageVariable("data", data); +``` + +- **Reason**: By updating the variable after the loop completes, the table re-renders only once. This reduces unnecessary processing and significantly improves performance when handling multiple updates. + +--- + +## 11. Direct Mutation of Data + +- **Anti-Pattern**: Directly mutating data structures through JavaScript code, such as using `queries.getEmployees.data = []`. +- **Solution**: Always use ToolJet's built in **[actions](/docs/how-to/run-actions-from-runjs/)** to manipulate data. +- **Reason**: Direct mutation of data can lead to unexpected bugs and make debugging more complex. + +--- + +## 12. Naming Component/Query with Hyphen or Space + +- **Anti-Pattern**: Naming components or queries with hyphens or spaces in between, such as `run-py1` or `my query`. +- **Solution**: **Use names without hyphens or spaces**, or reference them using bracket notation (e.g., `{{queries['run-py1'].isLoading}}`). +- **Reason**: Hyphens and spaces can cause syntax issues. Using bracket notation or avoiding these characters ensures consistency and prevents errors in query or component references. + +--- + +## Conclusion + +Avoiding these anti-patterns when using ToolJet ensures that your applications are efficient, responsive, and maintainable. By following these best practices, you can enhance user experience and simplify app management. Always consider the impact of your development choices on both performance and scalability. + diff --git a/docs/docs/app-builder/customcss.md b/docs/docs/app-builder/customcss.md index 4356343249..73f8e1dece 100644 --- a/docs/docs/app-builder/customcss.md +++ b/docs/docs/app-builder/customcss.md @@ -3,7 +3,15 @@ id: customstyles title: Custom Styles --- -
    Available on: Paid plans
    +
    + 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 diff --git a/docs/docs/app-builder/left-sidebar.md b/docs/docs/app-builder/left-sidebar.md index 9ae50217a7..7ec0f2a275 100644 --- a/docs/docs/app-builder/left-sidebar.md +++ b/docs/docs/app-builder/left-sidebar.md @@ -60,7 +60,7 @@ Debugger consists of two main sections: To configure the app's global settings, click on the kebab menu(three vertical dots) on the left of the app name. Global settings include: -- **Unique app slug**: The unique slug of the application. This slug is used in the URL of the application. By default, the slug is the `app id` of the application. You can change the slug to a custom value. For example, if the slug is `7b56293b-be5a-401f-8806-b71625f8ee0d` you can change it to `` then the new URL of the application will be `https://app.tooljet.com//apps//` +- **Unique app slug**: The unique slug of the application. This slug is used in the URL of the application. By default, the slug is the `app id` of the application. You can change the slug to a custom value. For example, if the slug is `7b56293b-be5a-401f-8806-b71625f8ee0d` you can change it to `` then the new URL of the application will be `https://app.tooljet.ai//apps//` - **App link**: The link to the application. This link can be used to share the application with other users of the workspace. If you want to share the application with users outside the workspace, you can make the application public from the **[Share](/docs/app-builder/share)** modal. - **Hide header for launched apps**: Toggle this on to the hide the tooljet's header when the applications are launched - **Maintenance mode**: Toggle this on to put the application in maintenance mode. When in **maintenance mode**, on launching the app, the user will get an error message that **the app is under maintenance**. diff --git a/docs/docs/app-builder/overview.md b/docs/docs/app-builder/overview.md index d2f897f0b9..6340e83798 100644 --- a/docs/docs/app-builder/overview.md +++ b/docs/docs/app-builder/overview.md @@ -15,13 +15,13 @@ Getting started is straightforward – design your interface, connect your data Explore these hands-on guides to start building your first app. The step-by-step guides will walk you through the App-Builder's essential features: -- **[Create UIs Using Pre-Built Components](/docs/beta/app-builder/walkthrough/create-ui)** -- **[Create Queries to Interact With Data Sources](/docs/beta/app-builder/walkthrough/create-queries)** -- **[Use Custom Code](/docs/beta/app-builder/walkthrough/using-code)** -- **[Access and Referring Values Withing The App-Builder](/docs/beta/app-builder/walkthrough/accessing-values)** -- **[Create and Managing Variables](/docs/beta/app-builder/walkthrough/variables)** +- **[Create UIs Using Pre-Built Components](/docs/app-builder/walkthrough/create-ui)** +- **[Create Queries to Interact With Data Sources](/docs/app-builder/walkthrough/create-queries)** +- **[Use Custom Code](/docs/app-builder/walkthrough/using-code)** +- **[Access and Referring Values Within The App-Builder](/docs/app-builder/walkthrough/accessing-values)** +- **[Create and Managing Variables](/docs/app-builder/walkthrough/variables)** - **[Use Gitsync to Sync your Application with a Git Repository](/docs/gitsync)** -- **[Versioning and Release](/docs/tutorial/versioning-and-release)** -- **[Import and Export Apps](/docs/beta/app-builder/walkthrough/importing-exporting-applications)** +- **[Versioning and Release](/docs/development-lifecycle/release/version-control)** +- **[Import and Export Apps](/docs/app-builder/importing-exporting-applications)** diff --git a/docs/docs/app-builder/query-panel.md b/docs/docs/app-builder/query-panel.md index 558b52201b..c45295d913 100644 --- a/docs/docs/app-builder/query-panel.md +++ b/docs/docs/app-builder/query-panel.md @@ -3,7 +3,7 @@ id: query-panel title: Query Panel --- -The Query Panel, located at the bottom of the app-builder, allows you to create and manage queries to interact with connected **data sources**. It provides the capability to perform API requests, query **[databases](../data-sources/overview)**, and apply **[transformations](../tutorial/transformations)** or data manipulation using **[JavaScript](../data-sources/run-js)** and **[Python](../data-sources/run-py)**. +The Query Panel, located at the bottom of the app-builder, allows you to create and manage queries to interact with connected **data sources**. It provides the capability to perform API requests, query **[databases](/docs/data-sources/overview)**, and apply **[transformations](/docs/tutorial/transformations)** or data manipulation using **[JavaScript](/docs/data-sources/run-js)** and **[Python](/docs/data-sources/run-py)**. The Query Panel consists of two sections: - The **[Query Manager](#query-manager)** on the left side, which displays a list of all the created queries. @@ -72,7 +72,7 @@ For each parameter, you need to specify: **Syntax for utilizing the parameter:** Employ `parameters.` in your query. It's important to note that parameters can only be utilized within the specific query where they are defined. -Learn more about **[Using Custom Parameters](../how-to/use-custom-parameters)**. +Learn more about **[Using Custom Parameters](/docs/how-to/use-custom-parameters)**. Custom Parameters @@ -111,7 +111,7 @@ In cases where multiple data sources of the same type are connected, easily swit ### Transformation -Queries can be enhanced with transformations to modify the query results. ToolJet supports transformations using two programming languages: JavaScript & Python. Refer to the detailed documentation on **[Transformations](../tutorial/transformations)** for more information. +Queries can be enhanced with transformations to modify the query results. ToolJet supports transformations using two programming languages: JavaScript & Python. Refer to the detailed documentation on **[Transformations](/docs/tutorial/transformations)** for more information. Query Editor @@ -144,7 +144,7 @@ The Result: - The component displaying the to-do data will be update with the lates data. :::info -Learn more about [Event Handlers and Actions](../widgets/overview#component-event-handlers). +Learn more about [Event Handlers and Actions](/docs/widgets/overview#component-event-handlers). ::: Query Editor diff --git a/docs/docs/app-builder/toolbar.md b/docs/docs/app-builder/toolbar.md index bd44d63d73..0588d795f3 100644 --- a/docs/docs/app-builder/toolbar.md +++ b/docs/docs/app-builder/toolbar.md @@ -52,7 +52,7 @@ The Developer Details icon will show a profile picture of the currently active d You can use the Env dropdown menu to select an environment for your app: Development, Staging, or Production. This feature facilitates seamless transition through the app development cycle. :::tip -Learn more about multi-environment configuration **[here](/docs/release-management/multi-environment/)**. +Learn more about multi-environment configuration **[here](/docs/development-lifecycle/environment/self-hosted/multi-environment)**. :::
    @@ -64,7 +64,7 @@ Learn more about multi-environment configuration **[here](/docs/release-manageme You can manage application versions through the Version Manager. You can use this dropdown to edit a version name or adding/removing versions. :::tip -Versioning is also helpful when working with **[multiple environments](/docs/release-management/multi-environment/)** like development, staging and production. +Versioning is also helpful when working with **[multiple environments](/docs/development-lifecycle/environment/self-hosted/multi-environment)** like development, staging and production. :::
    diff --git a/docs/docs/app-builder/walkthrough/create-queries.md b/docs/docs/app-builder/walkthrough/create-queries.md index 91ad74c6a0..9046c45d56 100644 --- a/docs/docs/app-builder/walkthrough/create-queries.md +++ b/docs/docs/app-builder/walkthrough/create-queries.md @@ -80,7 +80,7 @@ You can insert values from the components in queries. For instance, the above co ```sql INSERT INTO feature_requests (id, title, description, votes, priority) -VALUES (10, `{{components.textinput1.value}}`, `{{components.textinput2.value}}`, 0, 2); +VALUES (10, '{{components.textinput1.value}}', '{{components.textinput2.value}}', 0, 2); ``` You can apply the same principles to upcoming examples. @@ -98,7 +98,7 @@ SET description = 'Updated Feature Description', votes = 15, priority = 2 -WHERE id = `{{components.table1.selectedRow.id}}`; +WHERE id = '{{components.table1.selectedRow.id}}'; ``` Update Data diff --git a/docs/docs/app-builder/walkthrough/sharing-apps.md b/docs/docs/app-builder/walkthrough/sharing-apps.md deleted file mode 100644 index 45a5bc7411..0000000000 --- a/docs/docs/app-builder/walkthrough/sharing-apps.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -id: sharing-apps -title: Preview, Test and Share Apps ---- - - ToolJet's App-Builder provides critical tools for app preview, development and deployment. Let's take a look at how you can use it throughout the development process. - -## Preview -You can use Preview to ensure the app functions correctly on both mobile and desktop platforms. - -- Open the ToolJet App-Builder and navigate to your app. -- Click the `Preview` icon located at the top-right corner to enter preview mode. -- Use the **Mobile** and **Desktop** view options to toggle between different screen settings. -- Observe component behavior and layout differences across devices. -- Adjust component visibility using the `Show on mobile` and `Show on desktop` options under the component's Properties Panel. - -## Multi-Environment Testing -Simulate app behavior in various stages of the development lifecycle (Development, Staging, Production). - -**Steps**: -1. Select the desired environment from the Env dropdown menu in the top-bar. -2. Make necessary changes and use the Version Manager to handle different versions. -3. Preview the app to ensure it behaves as expected in the chosen environment. - -## Share - -### Releasing App -To release an app to the users, you need to promote it to `Production` environment. Once you are in `Production`, the `Promote` button will have the `Release` label. Once you click on `Release` and confirm, the application will be released. - -### Making App Public -You can share the application with external users via a user-friendly, accessible URL. - -- Click the `Share` button on the top-bar. -- In the Share modal, toggle on `Make application public` to allow access without a ToolJet login. -- Edit the default URL slug to a more memorable and relevant one for easier access. -- Copy the newly customized URL and distribute it to your intended audience. - -This provides external users easy and direct access to the application, enhancing reach and usability. - - - - -### Efficient Development with Gitsync - -Gitsync can be used to maintain application version control and facilitate collaborative development. - -- Click on the `Gitsync` icon in the top-bar. -- Follow the prompts to connect your ToolJet app with a GitHub repository. -- Utilize git operations to manage app development across different branches and versions. - -Read more about Gitsync **[here](/docs/gitsync)**. \ No newline at end of file diff --git a/docs/docs/build-with-ai/ai-docs-assitant.md b/docs/docs/build-with-ai/ai-docs-assitant.md new file mode 100644 index 0000000000..47f52240b9 --- /dev/null +++ b/docs/docs/build-with-ai/ai-docs-assitant.md @@ -0,0 +1,56 @@ +--- +id: ai-docs-assistant +title: AI Docs Assistant +--- + +The **AI Docs Assistant** is an intelligent assistant designed to help you navigate ToolJet’s documentation with ease. Whether you need quick answers, step-by-step guides, or concept explanations, this assistant provides instant support by summarizing docs, troubleshooting issues, and guiding you through best practices. + +You can access the AI Docs Assistant under the **Learn** tab in the Build with AI sidebar. Simply ask a question or describe what you're looking for, and the assistant will provide relevant documentation and insights. + +
    + +tooljet ai doc assistant + +
    + +### What You Can Do with the AI Docs Assistant +- Get guidance on setting up workspaces, managing users, and configuring roles. +- Quickly understand complex topics with clear, actionable steps +- Find answers to common questions and resolve issues efficiently. +- Explore how to connect databases, APIs, and external tools. +- Discover best practices for securing your applications. +- Get up to speed with key functionalities and platform best practices. + +### Examples + +1. Custom Schema in [Form](/docs/widgets/form/) component: + + **Prompt**: Can you create a custom schema for a Form component with two input fields for name, phone number, and a dropdown for gender? + +
    + +tooljet ai doc assistant + +
    + + + 2. Dynamic columns in [Table](/docs/widgets/table/table-properties/) component: + + **Prompt**: Can you explain dynamic columns in the Table component? + +
    + +tooljet ai doc assistant + +
    + + + 3. Plotly JSON in [Chart](/docs/widgets/chart/) component: + + **Prompt**: Can you help me with the structure of the Plotly JSON that I can pass into Chart components? + +
    + +tooljet ai doc assistant + +
    diff --git a/docs/docs/build-with-ai/generate-applications.md b/docs/docs/build-with-ai/generate-applications.md new file mode 100644 index 0000000000..8a45e15b9a --- /dev/null +++ b/docs/docs/build-with-ai/generate-applications.md @@ -0,0 +1,55 @@ +--- +id: generate-applications +title: Generate Applications +--- + +This guide explains how to quickly generate and modify business applications using ToolJet. You can create an app from scratch with a single prompt or enhance an existing app with AI-powered assistance. + +## Creating Application +To create an application, follow these steps: + +1. **Enter a prompt** – Describe the business application you want to build in the prompt input on the dashboard. +
    + +tooljet generate apps + +
    + +2. **Accept or modify requirements** – After submitting your prompt, the app will be created, and you’ll be taken to the App Builder, where a list of features, a database schema, design details, and query specifications will be generated based on your prompt. +
    + +tooljet generate apps + +
    + +You can accept or modify these application requirements after reviewing them thoroughly. +
    + +tooljet generate apps + +
    + +3. **App Generation** – Once you confirm the requirements, ToolJet will build the application inside the App Builder. + +
    + +tooljet generate apps + +
    + +## Modifying Application + +You can modify any application in ToolJet with AI assistance, whether it's a newly created app or an existing one. You can update components and queries within your application with just a prompt. + +For example, if you want to add a button in your app you can write a prompt for the same. +
    + +tooljet generate apps + +
    +## Limitations +ToolJet supports generating queries with AI for the following data sources: +- [Postgres](/docs/data-sources/postgresql/) +- [MySQL](/docs/data-sources/mysql/) +- [SQL Server](/docs/data-sources/mssql/) +- [RunJS Queries](/docs/tooljet-concepts/run-js/) diff --git a/docs/docs/build-with-ai/overview.md b/docs/docs/build-with-ai/overview.md new file mode 100644 index 0000000000..e1118e3db9 --- /dev/null +++ b/docs/docs/build-with-ai/overview.md @@ -0,0 +1,40 @@ +--- +id: overview +title: Overview +--- +With ToolJet, you can build business applications effortlessly using natural language. Whether you're starting from scratch or refining an existing app, it simplifies the process with it's intelligence. + +Additionally, it comes with an AI-powered [documentation assistant](/docs/build-with-ai/ai-docs-assistant), ready to answer any questions about ToolJet's features, components, and integrations, helping you build faster. + +Follow these step-by-step instructions to create an inventory management application: +1. **Describe your application** – Provide a prompt detailing the business application you want to create. (Example: "Inventory management system for a manufacturing company.") +
    + +tooljet ai overview + +
    +2. **Refine the requirements** – Review and accept or modify the application requirements suggested. +
    + +tooljet ai overview + +
    +3. **Customize your application** – Use AI to customize the generated application to your specific needs, adjusting components and styles, and also data source queries. + +- **Generated Application** +
    + +tooljet ai overview + +
    + +- **Customizing Application** + +
    + +tooljet ai overview + +
    + + +Refer to [Generate Applications](/docs/build-with-ai/generate-applications) and [AI Docs Assistant](/docs/build-with-ai/ai-docs-assistant) documentation to learn more. diff --git a/docs/docs/contributing-guide/documentation-guidelines/introduction.md b/docs/docs/contributing-guide/documentation-guidelines/introduction.md index 5d98751925..e574a4f7b8 100644 --- a/docs/docs/contributing-guide/documentation-guidelines/introduction.md +++ b/docs/docs/contributing-guide/documentation-guidelines/introduction.md @@ -35,6 +35,6 @@ The quality of our documentation isn't just determined by how well it's written ## Next Steps... -Once you've set up your local environment, take some time to explore our [Style Guide](style-guide.md), understand our page structures, and learn how to work with Docusaurus, the framework we use for our documentation. +Once you've set up your local environment, take some time to explore our [Style Guide](/docs/contributing-guide/documentation-guidelines/style-guide), understand our page structures, and learn how to work with Docusaurus, the framework we use for our documentation. We look forward to your contributions and are excited to see how you'll help make ToolJet documentation even better! diff --git a/docs/docs/contributing-guide/documentation-guidelines/style-guide.md b/docs/docs/contributing-guide/documentation-guidelines/style-guide.md index cc9438e21c..65f70547da 100644 --- a/docs/docs/contributing-guide/documentation-guidelines/style-guide.md +++ b/docs/docs/contributing-guide/documentation-guidelines/style-guide.md @@ -215,7 +215,7 @@ ORDER BY name ASC; `[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. +`ToolJet supports [multiple environments,](https://docs.tooljet.ai/docs/#multiple-environments)` takes the user directly to the specific section. --- diff --git a/docs/docs/contributing-guide/marketplace/creating-a-plugin.md b/docs/docs/contributing-guide/marketplace/creating-a-plugin.md index 088ebff209..a7a9cdf67b 100644 --- a/docs/docs/contributing-guide/marketplace/creating-a-plugin.md +++ b/docs/docs/contributing-guide/marketplace/creating-a-plugin.md @@ -3,8 +3,6 @@ id: creating-a-plugin title: 'Marketplace: Creating plugins' --- -# Marketplace: Creating plugins - ## What are plugins ToolJet’s development has centered on extensibility, allowing developers to utilize plugins that expand their capabilities. Currently, these plugins are limited to connectors, including data source connectors like PostgreSQL, MySQL, Twilio, Stripe, and more. Using JavaScript/TypeScript, developers can develop plugins to enhance ToolJet's functionality and publish these plugins on the ToolJet Marketplace. @@ -376,6 +374,42 @@ The GitHub class has three methods: - **getConnection**: This method is a helper function that returns an authenticated octokit client, which is utilized to send requests to the GitHub API. It takes in sourceOptions as input, representing the source metadata, and returns an authenticated octokit client. +## Step 6: Add Error Handling + +In case of an error, it is necessary to return the error message received from the Plugin SDK. To achieve this, include the `errorDetails` in the **run** method within the **index.ts** file. The specific parameters of the error may vary depending on the plugin.

    +Additionally, the **data** field in the Plugin SDK corresponds to **errorDetails** in the code, and the dynamically generated **errorMessage** maps to the **description** field in the error preview. + +#### Example + +Consider the case of MongoDB. If an error occurs, such as the following: + +MongoDB Error + +You can implement error handling using the following code: + +```js +catch (error) { + let errorMessage = 'An unknown error occurred'; + let errorDetails = {}; + + if (error instanceof Error) { + errorMessage = error.message || errorMessage; + errorDetails = { + name: error.name, + code: (error as any).code || null, + codeName: (error as any).codeName || null, + keyPattern: (error as any).keyPattern || null, + keyValue: (error as any).keyValue || null, + }; + } + + throw new QueryError('Query could not be completed', errorMessage, errorDetails); +} +``` + +This code ensures that error messages and details are properly returned to the Plugin SDK, enabling meaningful error previews for the user. + +Query Error ## Delete a plugin To delete a plugin, enter the following command: diff --git a/docs/docs/contributing-guide/marketplace/marketplace-setup.md b/docs/docs/contributing-guide/marketplace/marketplace-setup.md index a8f592845c..05162870b3 100644 --- a/docs/docs/contributing-guide/marketplace/marketplace-setup.md +++ b/docs/docs/contributing-guide/marketplace/marketplace-setup.md @@ -9,9 +9,9 @@ The Marketplace offers custom plugins that can be installed in your ToolJet inst - [Node.js](https://nodejs.org/en/download/) **(v18.18.2)** - [npm](https://www.npmjs.com/get-npm) **(v9.8.1)** -## Getting started +## Getting Started -### Step 1. Setup ToolJet locally +### Step 1. Setup ToolJet Locally To obtain the ToolJet repository via git, use the command: @@ -25,11 +25,11 @@ Next, refer to the appropriate guide for your development environment to follow - **[Docker](/docs/contributing-guide/setup/docker)** - **[Ubuntu](/docs/contributing-guide/setup/ubuntu)** -### Step 2. Enabling the marketplace for your instance +### Step 2. Enabling the Marketplace for your Instance To enable the marketplace for your ToolJet instance, you need to specify the following environment variables in your **`.env`** file: -#### Marketplace feature enable +#### Marketplace Feature Enable Use this environment variable to enable/disable the feature that allows users to use the marketplace. @@ -37,7 +37,7 @@ Use this environment variable to enable/disable the feature that allows users to | -------------------------- | ----------------- | | ENABLE_MARKETPLACE_FEATURE | `true` or `false` | -#### Enable Marketplace plugin developement mode +#### Enable Marketplace Plugin Developement Mode The use of this environment variable facilitates plugin development by enabling automatic builds whenever package changes occur, thus simplifying the development process. Moreover, it also incorporates a reload button that retrieves all the recent local modifications from the file system for installed plugins, making it a valuable feature for improving the overall development experience. @@ -50,7 +50,22 @@ Please note that the marketplace is not enabled by default. After updating the v For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/contributing-guide/setup/architecture)**. You can access the marketplace by navigating to the **'/integrations'** route. -### Step 3: Installation of tooljet-cli +### Step 3: Install the Required Packages + +The required packages must be installed from the marketplace root folder. Use the following commands to install the packages: + +``` bash +cd marketplace +npm install +``` + +After the packages are installed, run the following command to build the directory: + +``` bash +npm run build +``` + +### Step 4: Installation of tooljet-cli In order to manage plugins for the ToolJet marketplace, including creating, updating, and deleting, you will need to utilize **[tooljet-cli](https://www.npmjs.com/package/@tooljet/cli)**. This can be installed via npm by entering the following command: ```bash diff --git a/docs/docs/contributing-guide/setup/architecture.md b/docs/docs/contributing-guide/setup/architecture.md index 8ae8b32726..c61fd8b0f3 100644 --- a/docs/docs/contributing-guide/setup/architecture.md +++ b/docs/docs/contributing-guide/setup/architecture.md @@ -13,7 +13,7 @@ ToolJet server is a Node.js API application. Server is responsible for authentic **Dependencies:** - **PostgreSQL** - ToolJet server persists data to a postgres database. - **Email service** (SMTP/Sendgrid/Mailgun/etc) - Required to send user invitations and password reset emails. -- **PostgREST (Optional)** - Standalone web server that converts PostgreSQL database into queryable RESTful APIs for ToolJet Database. +- **PostgREST** - Standalone web server that converts PostgreSQL database into queryable RESTful APIs for ToolJet Database. ### 2. ToolJet Client diff --git a/docs/docs/contributing-guide/setup/codespaces.md b/docs/docs/contributing-guide/setup/codespaces.md index 9529f78b98..c64aacb24a 100644 --- a/docs/docs/contributing-guide/setup/codespaces.md +++ b/docs/docs/contributing-guide/setup/codespaces.md @@ -3,7 +3,7 @@ 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.com/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.ai/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. Open the terminal and run the commands below. @@ -51,7 +51,7 @@ sudo -u postgres psql ### 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.com/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.ai/docs/setup/env-vars) **For basic set-up you add the below env variables:** diff --git a/docs/docs/contributing-guide/setup/docker.md b/docs/docs/contributing-guide/setup/docker.md index 1330cc11ce..96dcdcfc12 100644 --- a/docs/docs/contributing-guide/setup/docker.md +++ b/docs/docs/contributing-guide/setup/docker.md @@ -9,7 +9,7 @@ The following guide is intended for contributors to set up ToolJet locally. If y Docker Compose is the easiest way to set up the ToolJet server and client locally. -*If you just want to try out ToolJet locally with docker, you can follow the steps [here](https://docs.tooljet.com/docs/setup/try-tooljet).* +*If you just want to try out ToolJet locally with docker, you can follow the steps [here](/docs/setup/try-tooljet).* ## Prerequisites diff --git a/docs/docs/contributing-guide/setup/macos.md b/docs/docs/contributing-guide/setup/macos.md index 2a2439f820..74e94c7ad2 100644 --- a/docs/docs/contributing-guide/setup/macos.md +++ b/docs/docs/contributing-guide/setup/macos.md @@ -36,11 +36,11 @@ To set up and run ToolJet on macOS for development, begin by opening your termin brew install postgresql@13 ``` - 1.4 Install PostgREST(optional) + 1.4 Install PostgREST - :::info - Required only if ToolJet Database is being used. - ::: + :::info + Please use PostgREST version 12.2.0 + ::: ```bash brew install postgrest @@ -85,6 +85,10 @@ To set up and run ToolJet on macOS for development, begin by opening your termin PG_USER=postgres PG_PASS=postgres PG_DB=tooljet_development + TOOLJET_DB=tooljet_db + TOOLJET_DB_USER=postgres + TOOLJET_DB_HOST=localhost + TOOLJET_DB_PASS=postgres ORM_LOGGING=all ``` diff --git a/docs/docs/contributing-guide/setup/system-requirements.md b/docs/docs/contributing-guide/setup/system-requirements.md index 910b471b6e..7ee71bf0d1 100644 --- a/docs/docs/contributing-guide/setup/system-requirements.md +++ b/docs/docs/contributing-guide/setup/system-requirements.md @@ -19,6 +19,6 @@ For Docker setups on Mac systems, it's advisable to use a machine with 16GB RAM ## Bare-Metal Setup -For those who prefer a [bare-metal](https://docs.tooljet.com/docs/contributing-guide/setup/docker) setup over Docker, a minimum of 8GB RAM is recommended for smooth operation. +For those who prefer a [bare-metal](/docs/contributing-guide/setup/docker) setup over Docker, a minimum of 8GB RAM is recommended for smooth operation. Before initiating the installation process, please verify that your system meets these specified requirements. It's essential to customize server specifications based on the unique demands of your deployment scenario. \ No newline at end of file diff --git a/docs/docs/contributing-guide/setup/ubuntu.md b/docs/docs/contributing-guide/setup/ubuntu.md index c2af11723b..02ca21f42d 100644 --- a/docs/docs/contributing-guide/setup/ubuntu.md +++ b/docs/docs/contributing-guide/setup/ubuntu.md @@ -39,12 +39,10 @@ Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the sudo apt-get install libpq-dev ``` - 1.3 Install PostgREST (optional) + 1.3 Install PostgREST - :::info - Required only if ToolJet Database is being used. - - Please use PostgREST version 10.1.1.x + :::info + Please use PostgREST version 12.2.0 ::: Please follow the installation [PostgREST](https://postgrest.org/en/stable/install.html) guide @@ -83,6 +81,17 @@ Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the TOOLJET_HOST=http://localhost:8082 LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=localhost + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + TOOLJET_DB=tooljet_db + TOOLJET_DB_USER=postgres + TOOLJET_DB_HOST=localhost + TOOLJET_DB_PASS=postgres ``` 5. Install and build dependencies diff --git a/docs/docs/contributing-guide/testing.md b/docs/docs/contributing-guide/testing.md index d50589d75e..0439d61a9d 100644 --- a/docs/docs/contributing-guide/testing.md +++ b/docs/docs/contributing-guide/testing.md @@ -13,45 +13,50 @@ Follow the steps below to setup and run the test specifications using Cypress. W ``` ## Running Tests + #### Headed mode + - To run cypress in **headed** mode, run the following command: ```bash npm run cy:open ``` - In **headed** mode, the user will be able to choose the test specs from the test runner:
    - + Cypress headed mode - +
    #### Headless mode - To run cypress in **headless** mode, run the following command: - ```bash - npm run cy:run - ``` -- For running specific spec in headless mode, run for specific spec + ```bash + npm run cy:run + ``` + +- To run a specific spec in headless mode, run the following command: + ```bash npm run cy:run -- --spec "cypress/e2e/dashboard/multi-workspace/manageSSO.cy.js ```
    - + Cypress headless mode - +
    :::caution If some test specs need the environment variables, the user can pass them similar to the following command: + ```bash npm run cy:open -- --env='{"pg_host":"localhost","pg_user":"postgres", "pg_password":"postgres"}' ``` + or the user can add env-vars in the **cypress.config.js** file ::: - :::info Check all the Cypress commands [here](https://docs.cypress.io/guides/guides/command-line#Commands) -::: \ No newline at end of file +::: diff --git a/docs/docs/dashboard.md b/docs/docs/dashboard.md deleted file mode 100644 index f17dae7a4c..0000000000 --- a/docs/docs/dashboard.md +++ /dev/null @@ -1,352 +0,0 @@ ---- -id: dashboard -title: Dashboard ---- - -The ToolJet Dashboard is the initial landing page that you see upon logging into your workspace. This interface serves as a central hub where you can access a variety of features. Primarily, it displays all the applications you've created within ToolJet. Moreover, you have the capability to create new workspaces and applications directly from this dashboard. Additionally, it provides an option to create folders for categorizing and managing applications for easier organization, access control, and workflow management. - -Furthermore, the dashboard serves as a gateway to various essential sections, such as **[Workflows](/docs/workflows/overview)**, **[ToolJet Database](/docs/tooljet-db/tooljet-database/)**, **[Data Sources](/docs/data-sources/overview)**, **[Marketplace](/docs/marketplace/marketplace-overview)**, **[Workspace Settings](/docs/tutorial/manage-users-groups)**, **[Settings](/docs/enterprise/superadmin/#settings)**, and **[Audit logs](/docs/enterprise/audit_logs/)**. You can effortlessly navigate to these sections directly from the dashboard. - -
    - -App menu options - -
    - -
    - -## Workspace Manager - -The workspace manager is located on the bottom left corner of the dashboard. Clicking on the workspace manager will open a dropdown menu listing all the workspaces you belong to. You can switch between workspaces by clicking on the workspace name from the dropdown menu. - -
    - -Dashboard - -
    - -
    - -
    - -### Add New Workspace - -On clicking the `Add new workspace` button, a modal will open where you can enter the name of the workspace, enter the unique workspace slug, and can see the preview of the workspace URL. Click on the `+ Create Workspace` button to create a new workspace. - -Previously, the workspace slug was an automatically generated workspace ID, like this: `https://tooljet.com/262750db-b2b8-4abb-9404-8995c2ecb2a0`. Now, you can set a custom, unique slug for your workspace which will generate a more accessible or readable URL such as `https://tooljet.com/apac-team)`. - -#### Conditions for workspace slug - -- The workspace slug should be unique. -- The workspace slug should not contain any special characters except `-`. -- The workspace slug should not contain any spaces. -- The workspace slug should not contain any capital letters. -- The workspace slug should not be empty. - -
    - -Dashboard - -
    - -
    - -
    - -### Edit Workspace - -Similar to the `Add new workspace` button, clicking on the `Edit workspace` button will open a modal where you can edit the name of the workspace and the workspace slug. Click on the `Save` button to update the changes. - -
    - -
    - -## Create a New App - -To create a new app, click on the `Create new app` button on the top left corner of the dashboard. Clicking on this button will open a modal where you can enter the name of the app and then click on the `+ Create app` button to create a new app. - -
    - -Dashboard - -
    -
    - -There are three dots on the right side of the `Create new app` button. Clicking on these dots will open a dropdown menu with two options: - -- **[Choose from templates](#choose-from-templates)** -- **[Import](#import)** - -
    - -
    - -### Choose from Templates - -This option will open a modal with a list of pre-built templates. You can choose any template from this list to create a new app. - -
    - -Dashboard - -
    - -
    - -
    - -### Import - -This option will open a file picker to import a JSON file. This JSON file should contain the app data exported from ToolJet. - -
    - -Dashboard - -
    - -
    - -
    - -### Importing an App Connected to Marketplace Plugins - -When importing an app with Marketplace plugins, the Marketplace plugin should be installed in the ToolJet workspace where the app is being imported. If the Marketplace plugin is not installed, the app will be imported without the queries for that plugin. - -#### When Marketplace plugin is installed - -If Marketplace plugin is installed in the ToolJet workspace where the app is being imported, the queries connected to the Marketplace plugin will be available in the imported application. The queries will be linked to the data source with the same name if it is already present. If the data source is not present, a new data source will be created of that Marketplace plugin and linked to the queries. - -#### When Marketplace plugin is not installed - -If you have an app with a query linked to a Marketplace plugin, and you import that app in a ToolJet workspace where the Marketplace plugin is not installed as the data source, the queries will be not be available in the imported application. - -
    - -
    - -### Importing App Connected to ToolJet Table - -When the app(JSON file) that includes the table schema is imported, and the table is not present in the ToolJet database of the workspace where the app is being imported, a new table will be created in the ToolJet database with the same name as the table in the imported app. - -If the table with the same name is already present in the workspace, the new table will be created with the name `_`. Example: `_1627980000`. - - - -
    - -## Folders - -
    - -### Create a new folder - -Folders can be created to organize your apps. To create a new folder, click on the `+` button on the left drawer of the dashboard. Clicking on this button will open a modal, enter the name of the folder and click on the `Create Folder` button to create a new folder. - -
    - -
    - -### Delete or Edit Folder - -A folder can be **deleted** or **renamed**. To delete or rename a folder, click on the kebab menu on the right side of the folder name. Clicking on kebab menu will open a dropdown menu with two options: - -- **Edit folder**: This option will open a modal, enter the new name of the folder and click on the `Edit` button to rename the folder. -- **Delete folder**: This option will open a confirmation modal to delete the folder. Click on the `Delete` button to delete the folder. - -
    - -Dashboard - -
    - -
    - -
    - -### Search Folders - -Folders can be searched by clicking on the search icon on the left drawer of the dashboard. Clicking on the search icon will open a search bar, enter the name of the folder to search. - -
    - -Dashboard - -
    - -
    - -
    - -### Slug for Folders - -The folder's URL slug is generated automatically from its name, providing direct access to the folder using the slug. - -To get the URL of a specific folder, the user will have to select that folder and then copy the URL from the address bar of the browser. The copied URL can be used to share with other users of the workspace. - -Example: If the name of the folder is `Customer Support`, The folder can be accessed directly from the URL `https://tooljet.com/?folder=Customer%20Support`. - -
    - -Dashboard - -
    - -
    - -
    - -
    - -## App Cards - -The dashboard displays all the apps created in the workspace as cards. These cards are displayed in a grid layout. The app cards display the **name of the app**, the **name of the creator**, and the **date of creation**. The app cards also display the app **icon**, which can be changed by clicking on the `Change Icon` option from the app menu. - -
    - -Dashboard - -
    - -
    - -
    - -## App Menu - -The app menu is located on the top right corner of the app card. Clicking on the app menu will open a dropdown menu containing various options. These options are: - -- **[Rename app](#rename-app)** -- **[Change Icon](#change-icon)** -- **[Add to folder](#add-to-folder)** -- **[Clone app](#clone-app)** -- **[Export app](#export-app)** -- **[Delete app](#delete-app)** - -
    - -Dashboard - -
    - -
    - -
    - -### Rename App - -This option will open a modal that will allow you to rename your app. - -
    - -Dashboard - -
    - -
    - -
    - -### Change Icon - -This option will open a modal with a list of icons. You can choose any icon from this list to change the app icon. - -
    - -Dashboard - -
    - -
    - -
    - -### Add to Folder - -This option will open a modal with a list of folders. You can choose any folder from this list to add the app to the folder. - -
    - -Dashboard - -
    - -
    - -
    - -### Clone App - -Selecting this option will open a modal where you can enter the desired name for the cloned app. After providing the desired name, click on the Clone app button. This will immediately open the cloned app in the app builder with the same configuration as the original app. - -
    - -Dashboard - -
    - -
    - -
    - -### Export App - -This option downloads a JSON file containing the application data. This JSON file can be [imported](#import) to ToolJet to create a new app. The exported app will include all the queries connected to global data sources including the data source created from Marketplace plugins. - -This option allows you to select a specific version of the app to export or export all the versions of the app. To export a specific version of the app, select a version from the list of available versions in the modal and click on the `Export selected version` and to export all the versions of the app, click on the `Export All` button. - -#### Export ToolJet table schema - -Selecting this option will include the schema of the ToolJet table connected to that application in the exported JSON file. This option is available for all the apps on ToolJet however only the apps with a ToolJet table connected(includes tjdb query) will have the schema included in the exported JSON file. - -This JSON file can be used to [import](#importing-app-connected-to-tooljet-table) the application to ToolJet along with the table schema that was connected to the application. - -
    - -Dashboard - -
    - -
    - -
    - -### Delete App - -This option will open a confirmation modal to delete the app. Click on the `Delete` button to delete the app. - -
    - -Dashboard - -
    - -
    - -
    - -## App Search - -Apps can be searched by clicking on the search bar on the center of the dashboard. Click on the search bar and enter the name of the app to search. - -
    - -Dashboard - -
    - -
    - -
    - -## Current ToolJet Version - -The current version of ToolJet is displayed on the top right corner of the dashboard. - -
    - -Dashboard - -
    - -
    \ No newline at end of file diff --git a/docs/docs/data-sources/airtable.md b/docs/docs/data-sources/airtable.md index ea54e8681e..0e104540f0 100644 --- a/docs/docs/data-sources/airtable.md +++ b/docs/docs/data-sources/airtable.md @@ -82,7 +82,7 @@ Timezone and User locale are mutually dependent. If you provide a timezone, you Airtable List Records Query -
    +
    **Example Values** ```json @@ -102,7 +102,7 @@ Sort: createdTime // Select direction: Ascending or Descending
    -
    +
    **Response Example** ```json @@ -152,7 +152,7 @@ This operation fetches a specific record from the specified table. Airtable Retrieve Record Query -
    +
    **Response Example** ```json { @@ -188,7 +188,7 @@ This operation creates a new record in the specified table. } }] ``` -
    +
    **Response Example** ```json { @@ -227,7 +227,7 @@ Update a specific record by providing new data. "Email": "katrina.petersions2@example.com" } ``` -
    +
    **Response Example** ```json { @@ -258,7 +258,7 @@ This operation removes a record from the specified table. Airtable Delete Record Query -
    +
    **Response Example** ```json { diff --git a/docs/docs/data-sources/appwrite.md b/docs/docs/data-sources/appwrite.md index 84d91d8564..e491266bfc 100644 --- a/docs/docs/data-sources/appwrite.md +++ b/docs/docs/data-sources/appwrite.md @@ -9,7 +9,7 @@ ToolJet can connect to appwrite database to read/write data. ## Connection -To establish a connection with the Appwrite data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](https://docs.tooljet.com/docs/data-sources/overview)** page from the ToolJet dashboard. +To establish a connection with the Appwrite 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 requires the following to connect to your Appwrite: - **Host (API endpoint)** diff --git a/docs/docs/data-sources/athena.md b/docs/docs/data-sources/athena.md index b2910b7ba5..215d334494 100644 --- a/docs/docs/data-sources/athena.md +++ b/docs/docs/data-sources/athena.md @@ -9,7 +9,7 @@ ToolJet can connect to **Amazon Athena** which is an interactive query service t ## Connection -To establish a connection with the **Amazon Athena** data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](https://docs.tooljet.com/docs/data-sources/overview)** page from the ToolJet dashboard and choose **Amazon Athena** as the data source. +To establish a connection with the **Amazon Athena** 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 **Amazon Athena** as the data source. ToolJet requires the following to connect to your Athena. diff --git a/docs/docs/data-sources/azureblob.md b/docs/docs/data-sources/azureblob.md index b8ad543bfe..56f63d25f0 100644 --- a/docs/docs/data-sources/azureblob.md +++ b/docs/docs/data-sources/azureblob.md @@ -1,5 +1,5 @@ --- -id: azureblob +id: azureblobstorage title: Azure Blob --- diff --git a/docs/docs/data-sources/baserow.md b/docs/docs/data-sources/baserow.md index 4ba5fa9c7b..28af4a4327 100644 --- a/docs/docs/data-sources/baserow.md +++ b/docs/docs/data-sources/baserow.md @@ -60,7 +60,7 @@ This query lists all the fields in a table. Baserow list fields -
    +
    **Response Example** ```yaml @@ -114,7 +114,7 @@ This query lists all the rows in a table. Baserow list -
    +
    **Response Example** ```json @@ -162,7 +162,7 @@ This query lists all the rows in a table. Baserow get -
    +
    **Response Example** ```json @@ -197,7 +197,7 @@ This query lists all the rows in a table. } ``` -
    +
    **Response Example** ```json @@ -234,7 +234,7 @@ This query lists all the rows in a table. } ``` -
    +
    **Response Example** ```json @@ -263,7 +263,7 @@ This query lists all the rows in a table. Baserow move row -
    +
    **Response Example** ```json diff --git a/docs/docs/data-sources/couchdb.md b/docs/docs/data-sources/couchdb.md index b31873a3f1..ef7a46561d 100644 --- a/docs/docs/data-sources/couchdb.md +++ b/docs/docs/data-sources/couchdb.md @@ -57,7 +57,7 @@ This query lists all the records in a database. Couch listing -
    +
    **Response Example** ```json { @@ -101,7 +101,7 @@ This operation fetches a single record by its record ID. Couch retrieve view -
    +
    **Response Example** ```json { @@ -131,7 +131,7 @@ Inserts a new record into the database. [{"name":"tooljet"}] ``` -
    +
    **Response Example** ```json { @@ -161,7 +161,7 @@ You get the document as JSON in the response. For each update to the document, t [{"name":"tooljet"}] ``` -
    +
    **Response Example** ```json { @@ -183,7 +183,7 @@ Removes a record from the database by its record ID. Couch delete view -
    +
    **Response Example** ```json { @@ -241,7 +241,7 @@ Views are the primary tool used for querying and reporting on CouchDB documents. Couch get view -
    +
    **Response Example** ```json { diff --git a/docs/docs/data-sources/custom-js.md b/docs/docs/data-sources/custom-js.md index 71220a4de8..07cd2824fc 100644 --- a/docs/docs/data-sources/custom-js.md +++ b/docs/docs/data-sources/custom-js.md @@ -138,9 +138,9 @@ 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.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. +- 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. - [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. +- [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/docs/data-sources/elasticsearch.md b/docs/docs/data-sources/elasticsearch.md index 33b59132c6..03f06f0b92 100644 --- a/docs/docs/data-sources/elasticsearch.md +++ b/docs/docs/data-sources/elasticsearch.md @@ -320,7 +320,7 @@ This operation provides a compact, column-aligned view of indices in a cluster. Elastic cat indices -
    +
    **Response Example** ```json { @@ -414,7 +414,7 @@ This operation retrieves the status of the cluster’s health. For more details, Elastic cluster health -
    +
    **Response Example** ```json { diff --git a/docs/docs/data-sources/google.sheets.md b/docs/docs/data-sources/google.sheets.md index c6946f4148..afca7bb787 100644 --- a/docs/docs/data-sources/google.sheets.md +++ b/docs/docs/data-sources/google.sheets.md @@ -1,5 +1,5 @@ --- -id: google.sheets +id: googlesheets title: Google Sheets --- @@ -52,15 +52,17 @@ When connecting to a Google Sheets datasource, you can choose between two permis Using Google sheets data source you can perform several operations from your applications like: - 1. **[Read data from a spreadsheet](#read-data-from-a-spreadsheet)** - 2. **[Append data to a spreadsheet](#append-data-to-a-spreadsheet)** - 3. **[Update single row of a spreadsheet](#update-single-row-of-a-spreadsheet)** - 4. **[Delete row from a spreadsheet](#delete-row-from-a-spreadsheet)** + 1. **[Create a spreadsheet](#create-a-spreadsheet)** + 2. **[List all sheets of a spreadsheet](#list-all-sheets-of-a-spreadsheet)** + 3. **[Read data from a spreadsheet](#read-data-from-a-spreadsheet)** + 4. **[Append data to a spreadsheet](#append-data-to-a-spreadsheet)** 5. **[Get spreadsheet info](#get-spreadsheet-info)** + 6. **[Update single row of a spreadsheet](#update-single-row-of-a-spreadsheet)** + 7. **[Delete row from a spreadsheet](#delete-row-from-a-spreadsheet)**
    -Google Sheet Operations +Google Sheet Operations
    @@ -68,6 +70,32 @@ Using Google sheets data source you can perform several operations from your app **Spreadsheet ID** can be obtained from the URL of the spreadsheet. For example, in the URL `https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0`, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` represents the spreadsheet ID. ::: +### Create a Spreadsheet + +This operation can be used to create a new spreadsheet. + +#### Required Parameter +- **Title** + +
    + +create a spreadsheet + +
    + +### List All Sheets of a Spreadsheet + +This operation can be used to list all sheets of a spreadsheet. + +#### Required Parameter +- **Spreadsheet ID** + +
    + +create a spreadsheet + +
    + ### Read Data From a Spreadsheet This operation allows you to retrieve the table data from a spreadsheet in the form of a JSON object. @@ -129,6 +157,16 @@ Add additional rows to a table by using the append operation. ] ``` +### Get Spreadsheet Info + +This operation allows you to retrieve basic information about the spreadsheet, including the number of sheets, theme, time zone, format, and URL, among others. + +
    + +google sheets get info + +
    + ### Update Single Row of a Spreadsheet This operation allows you to update existing data in a sheet. @@ -179,14 +217,4 @@ This operation allows you to delete a specific row from the sheet. -### Get Spreadsheet Info - -This operation allows you to retrieve basic information about the spreadsheet, including the number of sheets, theme, time zone, format, and URL, among others. - -
    - -google sheets get info - -
    - diff --git a/docs/docs/data-sources/graphql.md b/docs/docs/data-sources/graphql.md index 6cae61bd5c..1f7252bb0f 100644 --- a/docs/docs/data-sources/graphql.md +++ b/docs/docs/data-sources/graphql.md @@ -75,7 +75,7 @@ Metadata is additional information about the data returned by the GraphQL query. While accessing the properties of the metadata object, which contains a hyphen, you can use the bracket notation. For example, to access the `content-length` property, you can use `{{queries.graphql1.metadata.request.headers["content-length"]}}` or `{{queries.graphql1.metadata.request.headers."content-length"}}`. ::: -
    +
    **Example Metadata** ```json diff --git a/docs/docs/data-sources/local-data-sources-migration.md b/docs/docs/data-sources/local-data-sources-migration.md new file mode 100644 index 0000000000..315732e952 --- /dev/null +++ b/docs/docs/data-sources/local-data-sources-migration.md @@ -0,0 +1,50 @@ +--- + +id: local-data-sources-migration +title: Local Data Sources Migration Guide + +--- + +Starting with ToolJet version 3.0.0, **Local Data Sources** have been fully discontinued. These were deprecated in earlier versions, and now support for them has been completely removed. This guide will help you migrate your queries that were connected to Local Data Sources to the new **Data Sources**. + +## Migration Process for Existing ToolJet 3.0.0 Users + +After upgrading to ToolJet 3.0.0, any queries connected to Local Data Sources will display an error message indicating that the Local Data Source is no longer supported. Follow these steps to resolve this issue: + +## Step-by-Step Migration Guide: + +### 1. Identify Queries with Errors: + 1. Navigate to the app where you were using Local Data Sources. + 2. Expand the Query Manager. + 3. Look for queries showing an error message related to Local Data Sources. These queries will only display the error message and the rest of content will be hidden. + +
    +Identify Queries with Errors +
    + +### 2. Create a New Data Source: + 1. Navigate to the **Data Sources** section. + 2. Create a new Data Source of the same type (e.g., if you were using a PostgreSQL Local Data Source, create a PostgreSQL Data Source). + 3. Fill in the correct required details and save the new Data Source. + +
    +Create a New Data Source +
    + +### 3. Reconnect Your Queries: + 1. Return to your app where the queries were previously using Local Data Sources. + 2. Open the query that was showing an error. + 3. You will see a dropdown under the **Source** field. + 4. Select the newly created Data Source of the same type from the dropdown. + 5. Your query will now be reconnected and functional. + +
    +Reconnect Query with Data Source +
    + +### 4. Test Your Queries: + 1. Run each updated query to ensure everything is working as expected. + +
    +Test Your Queries +
    \ No newline at end of file diff --git a/docs/docs/data-sources/mailgun.md b/docs/docs/data-sources/mailgun.md index a646b43a54..8c966906c7 100644 --- a/docs/docs/data-sources/mailgun.md +++ b/docs/docs/data-sources/mailgun.md @@ -13,7 +13,7 @@ The Mailgun API Datasource supports for interaction with the mail endpoint of th ## Connection -To establish a connection with the **Mailgun** data source, click on the **+ Add new data source** button located on the query panel or navigate to the [Data Sources](https://docs.tooljet.com/docs/data-sources/overview) page from the ToolJet dashboard. +To establish a connection with the **Mailgun** data source, 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 requires the following to connect to your Mailgun: - **API key** diff --git a/docs/docs/data-sources/mongodb.md b/docs/docs/data-sources/mongodb.md index 41cde17069..6a64b3f090 100644 --- a/docs/docs/data-sources/mongodb.md +++ b/docs/docs/data-sources/mongodb.md @@ -24,7 +24,16 @@ ToolJet requires the following to connect to your MongoDB. **Note:** It is recommended to create a new MongoDB user so that you can control the access levels of ToolJet. -ToolJet - Mongo connection +ToolJet - Mongo connection + +### Secure Sockets Layer (SSL) + +- **SSL Certificate**: SSL certificate to use with MongoDB. Supported Types: + - **None**: No SSL certificate verification. + - **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. + +MongoDB - SSL Certificate @@ -518,7 +527,7 @@ Dynamic queries in MongoDB can be used to create flexible and parameterized quer { createdAt: new Date('01/10/2020') } ``` -Reference on [mongodb extended JSON](https://docs.mongodb.com/manual/reference/mongodb-extended-json/) supported data types +Reference on [mongodb extended JSON](https://docs.mongodb.com/manual/reference/mongodb-extended-json/) supported data types. diff --git a/docs/docs/data-sources/mssql.md b/docs/docs/data-sources/mssql.md index c24c27d129..0d427cad57 100644 --- a/docs/docs/data-sources/mssql.md +++ b/docs/docs/data-sources/mssql.md @@ -21,12 +21,38 @@ ToolJet requires the following to connect to your PostgreSQL database. - **Port** - **Username** - **Password** +- **Connection Options** - **Azure** (Select this option if you are using Azure SQL databases) **Note:** It is recommended to create a new database user so that you can control the access levels of ToolJet. -ToolJet - Redis connection +ToolJet - Redis connection +### Connection Options + +You can add optional configurations in **key-value pairs** for the MS SQL data source connection. + +#### Example: +| Key | Value | +|:--------------------------|:--------| +| trustServerCertificate| true | + +These options allow you to fine-tune the connection, such as enabling encryption when using a self-signed certificate. + +### Enabling Encryption with a Self-Signed Certificate + +To enhance security during data transfer, encryption can be enabled even with a self-signed certificate. + +#### Server-Side Configuration +1. **Create and Install a Self-Signed Certificate:** + - Generate a self-signed certificate and install it on the SQL Server instance. +2. **Force Encryption:** + - Configure the SQL Server instance to force encrypted connections. + - For Azure SQL databases, turn on the **Encryption** toggle in the Azure portal. + +#### Client-Side Configuration +1. Set the connection option `trustServerCertificate` to `true`. + - This bypasses certificate chain validation and is necessary when using a self-signed certificate. @@ -54,7 +80,7 @@ SELECT * FROM users ToolJet mssql sql mode -#### **Parameterized queries**: +#### Parameterized queries: ToolJet offers support for parameterized SQL queries, which enhance security by preventing SQL injection and allow for dynamic query construction. To implement parameterized queries: @@ -64,10 +90,10 @@ ToolJet offers support for parameterized SQL queries, which enhance security by 4. The values can be static values or dynamic values using the `{{ }}` notation.
    -Postgresql parameterized SQL queries +Postgresql parameterized SQL queries
    -**Example:** +##### Example: ```yaml Query: SELECT * FROM users WHERE username = :username SQL Parameters: @@ -75,6 +101,10 @@ SQL Parameters: Value: oliver // or {{ components.username.value }} ``` +#### Query Timeout + +You can set the timeout duration for SQL queries by adding the `PLUGINS_SQL_DB_STATEMENT_TIMEOUT` variable to the environment configuration file. By default, it is set to 120,000 ms. + ### GUI Mode GUI mode can be used to query MS SQL Server / Azure SQL Databases without writing queries. diff --git a/docs/docs/data-sources/mysql.md b/docs/docs/data-sources/mysql.md index 0659b8e0f6..ec3273f5a6 100644 --- a/docs/docs/data-sources/mysql.md +++ b/docs/docs/data-sources/mysql.md @@ -92,10 +92,10 @@ ToolJet offers support for parameterized SQL queries, which enhance security by 4. The values can be static values or dynamic values using the `{{ }}` notation.
    -mysql +mysql
    -**Example:** +##### Example: ```yaml Query: SELECT * FROM users WHERE username = :username SQL Parameters: @@ -103,6 +103,9 @@ SQL Parameters: Value: oliver // or {{ components.username.value }} ``` +#### Query Timeout + +You can set the timeout duration for SQL queries by adding the `PLUGINS_SQL_DB_STATEMENT_TIMEOUT` variable to the environment configuration file. By default, it is set to 120,000 ms. ### GUI Mode diff --git a/docs/docs/data-sources/n8n.md b/docs/docs/data-sources/n8n.md index e30f64e51b..efdc669060 100644 --- a/docs/docs/data-sources/n8n.md +++ b/docs/docs/data-sources/n8n.md @@ -9,7 +9,7 @@ ToolJet can trigger n8n workflows using webhook URLs. Please refer [this](https: ## Connection -To establish a connection with the n8n data source, click on the **+ Add new Data source** button located on the query panel or navigate to the [Data Sources](https://docs.tooljet.com/docs/data-sources/overview) page from the ToolJet dashboard. +To establish a connection with the n8n data source, 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. Webhooks in n8n can be configured to operate with or without **Authentication**. If no authentication is required, select `None` as the **Authentication type**. For webhooks that require authentication, choose the appropriate method from the dropdown and provide the corresponding credentials. diff --git a/docs/docs/data-sources/notion.md b/docs/docs/data-sources/notion.md index 5bfaffbda5..5e281ad038 100644 --- a/docs/docs/data-sources/notion.md +++ b/docs/docs/data-sources/notion.md @@ -9,7 +9,7 @@ ToolJet can connect to a Notion workspace to do operations on notion pages, data ## Connection -To establish a connection with the Notion data source, click on the **+ Add new Data source** button located on the query panel or navigate to the [Data Sources](https://docs.tooljet.com/docs/data-sources/overview) page from the ToolJet dashboard. +To establish a connection with the Notion data source, 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. For integrating Notion with ToolJet we will need the API token. The API token can be generated from your Notion workspace settings. Read the official Notion docs for [Creating an internal integration with notion API](https://www.notion.so/help/create-integrations-with-the-notion-api). diff --git a/docs/docs/data-sources/overview.md b/docs/docs/data-sources/overview.md index f47d16b113..dbe19635f6 100644 --- a/docs/docs/data-sources/overview.md +++ b/docs/docs/data-sources/overview.md @@ -38,7 +38,7 @@ Data Source page is available only on **ToolJet version 2.3.0 and above**. 3. Once the data source is added, you'll be required to input the configuration details for establishing a connection. - ***Note: For paid plans, configuration entry and saving are necessary to enable availability across [multiple environments](/docs/release-management/multi-environment/).*** + ***Note: For paid plans, configuration entry and saving are necessary to enable availability across [multiple environments](/docs/development-lifecycle/environment/self-hosted/multi-environment).***
    @@ -78,7 +78,7 @@ By default, 4 data sources will be available on every app on ToolJet: ## User Permissions -Changing the **Permissions** for Data Sources is a privilege reserved for **Admins** and **[Super Admins](/docs/Enterprise/superadmin)** within the workspace. +Changing the **Permissions** for Data Sources is a privilege reserved for **Admins** and **[Super Admins](/docs/user-management/role-based-access/access-control#data-sources)** within the workspace. To configure these permissions, navigate to **Workspace Settings** -> **Groups Settings**. Admins and Super Admins have the authority to assign the following permissions to user groups: diff --git a/docs/docs/data-sources/postgresql.md b/docs/docs/data-sources/postgresql.md index c305510ec9..61c16427ac 100644 --- a/docs/docs/data-sources/postgresql.md +++ b/docs/docs/data-sources/postgresql.md @@ -29,7 +29,7 @@ To connect to PostgreSQL using Manual connection parameters, select **Manual con - **Connection Options** - **SSL Certificate** -PG connection +PG connection ### Connection String @@ -39,7 +39,7 @@ To connect to PostgreSQL using a connection string, select **Connection String** PG connection string -


    +

    **Note:** We recommend creating a new PostgreSQL database user to have control over ToolJet's access levels. @@ -75,9 +75,9 @@ ToolJet offers support for parameterized SQL queries, which enhance security by 3. The keys should match the parameter names used in the query (without the colon). 4. The values can be static values or dynamic values using the `{{ }}` notation. -Postgresql parameterized SQL queries +Postgresql parameterized SQL queries -**Example:** +##### Example: ```yaml Query: SELECT * FROM users WHERE username = :username @@ -86,6 +86,10 @@ SQL Parameters: Value: oliver // or {{ components.username.value }} ``` +#### Query Timeout + +You can set the timeout duration for SQL queries by adding the `PLUGINS_SQL_DB_STATEMENT_TIMEOUT` variable to the environment configuration file. By default, it is set to 120,000 ms. + ### GUI Mode Choose the GUI mode from the dropdown and select the operation **Bulk update using primary key**. Provide the **Table** name and the **Primary key column** name. Then, in the editor, input the **records** as an array of objects. diff --git a/docs/docs/data-sources/restapi/authentication.md b/docs/docs/data-sources/restapi/authentication.md index 724ab24746..0b4bc46afa 100644 --- a/docs/docs/data-sources/restapi/authentication.md +++ b/docs/docs/data-sources/restapi/authentication.md @@ -75,9 +75,12 @@ Google Cloud Platform provides access to more than 350 APIs and Services that ca 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. 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: - 1. `https://app.tooljet.com/oauth2/authorize` (if you’re using ToolJet cloud) +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) + +ToolJet - How To - REST API CallBack URL in OAuth 2.0 + 6. Now save and then you’ll get the **Client ID and Client secret** for your application. ToolJet - How To - REST API authentication using OAuth 2.0 @@ -97,7 +100,7 @@ Let's follow the steps to authorize ToolJet to access your Google profile data: 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.com/oauth2/authorize` if using ToolJet Cloud. + 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. 10. Keep the default selection for **Client Authentication** and **Save** the data source. ToolJet - How To - REST API authentication using OAuth 2.0 diff --git a/docs/docs/data-sources/restapi/configuration.md b/docs/docs/data-sources/restapi/configuration.md index 3a7a7f4567..d4a1c5073c 100644 --- a/docs/docs/data-sources/restapi/configuration.md +++ b/docs/docs/data-sources/restapi/configuration.md @@ -39,7 +39,7 @@ ToolJet requires the following to connect to a REST API data source: ### Authentication :::info -For a detailed explanation of the authentication types supported by REST API data sources, refer to the **[Authentication](./authentication)** section. +For a detailed explanation of the authentication types supported by REST API data sources, refer to the **[Authentication](/docs/data-sources/restapi/authentication)** section. ::: ToolJet supports the following authentication types for REST API data sources: @@ -71,8 +71,12 @@ 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
    +:::info +To interact with SOAP APIs, refer to the [SOAP API Documentation](/docs/data-sources/soap-api). +::: + \ No newline at end of file diff --git a/docs/docs/data-sources/restapi/metadata-and-cookies.md b/docs/docs/data-sources/restapi/metadata-and-cookies.md index 4d84b9cd08..d10609a995 100644 --- a/docs/docs/data-sources/restapi/metadata-and-cookies.md +++ b/docs/docs/data-sources/restapi/metadata-and-cookies.md @@ -11,7 +11,7 @@ Metadata is additional information about the data returned by the REST API. This While accessing the properties of the metadata object, which contains a hyphen, you can use the bracket notation. For example, to access the `user-agent` property, you can use `{{queries.restapi1.metadata.request.headers["user-agent"]}}` or `{{queries.restapi1.metadata.request.headers."user-agent"}}`. ::: -
    +
    **Example Metadata** ```json diff --git a/docs/docs/data-sources/restapi/querying-rest-api.md b/docs/docs/data-sources/restapi/querying-rest-api.md index 5417cb1875..18956afb32 100644 --- a/docs/docs/data-sources/restapi/querying-rest-api.md +++ b/docs/docs/data-sources/restapi/querying-rest-api.md @@ -13,7 +13,7 @@ Once you have connected to the REST API data source, you can easily write querie 4. Click **Preview** to view the data returned from the query or click **Run** to execute the query. :::tip -You can also transform the query results using the **[Transformations](/docs/how-to/transformations)** feature. +You can also transform the query results using the **[Transformations](/docs/tutorial/transformations)** feature. ::: ToolJet supports the following REST HTTP methods: @@ -49,6 +49,12 @@ For example, to send a **multipart/form-data** body, you can add the following h ToolJet - Data source - REST API ToolJet - Data source - REST API +

    + +:::info Handling OAuth Token via REST API +To obtain an OAuth token via REST API, add the following custom header:
    +`Content-Type: application/x-www-form-urlencoded` +::: ## Response Types and Handling @@ -56,7 +62,7 @@ For example, to send a **multipart/form-data** body, you can add the following h REST APIs can return data in a variety of formats, including **JSON** and **Base64**. JSON is a common format used for data exchange in REST APIs, while Base64 is often used for encoding binary data, such as images or video, within a JSON response. When the response **content-type** is **image**, the response will be a **base64** string. -
    +
    **Example JSON response** ```json @@ -120,18 +126,17 @@ You can also use JS methods like **map** to load data on components like **dropd ToolJet - Data source - REST API -
    +
    **Example base64 response** ```base64 iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAA/FBMVEVAYt79/f1AYt/9/f79/ftAY9s/Y93v/P89ZNv8/v38/f/9/vj9/vr+/Pz//P49ZNw8ZddUb86QpMlCYOX1//9AYeI6XdaXp+C1x+nL2fj+/vU2WMZVb8iPnsU3Xt00WNY7ZtU0WMuJncs8W8JDY801W986V9BTacRleMF+kNClt+CsvuFtiNYvVMRcedaZq9Lb5/eCl9K8zOJJWcqlr9xdb8C6w+w7XsCmvt3S5fs5ac1whs7l8v/6//B9j8wvVLrO2+o+Y7t6kMODotxPbL0+WOLf3/aesdVmfbvL5PentOmDl99RbtdMXcGOnNqTqdp+luIyVrLr7Pq/2/3mMzS8AAAKxUlEQVR4nO2cC1vbthrHLVmWJUuW3dlywWYkIRAorG1K6SgjgV5g3a3jbOf7f5fzygngcCvbeobN8/7a8rQl7eO/Jf3fiyV7HoIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIL8H+CBI0kSzj3OA5Gm9V8EQojAsw99dV8DUMg5tzYDLLWgktbAb4CHvrqvwWwM6zETMJJpmgqRwg9qLeXiMUisFcK4cZifqxsbvXMKmtlHpNDrjarNrWdPt3d2luZ8JzzL004rdGvNERSD5y9eLo9DMkc7yDfrAYxr8MAX+XdxvunWmfPLwf6r3VASIiVjMYkJ/IzhK/mmECLrrEKPJmm/vy5sb3i4O5FRzMg1uq2QOmMRxej13liWpWKxeWwKnXfa3ovtEPQxwvwoemwKPS6qN9+HqixjYyLHo1IIJpMV+29DCbOTMOVm6XV9XVTo4h73wD8Tz1ZnIZGRE8ZqHo/CIEhFElTfHeRSkxtm5iNQmP4gNl7v5ErFxpfSRb/HpVCAh1aHk7zUxhg91ezRKYRM5vV2Pi1Bn/HZzQbTSYVgnlDtwQB6xQ9jaUzMyrLU0Q1R/gKfkA+FCLKgGwrTxEKVIIQdHYXEj30ia//0b1EXRQxuA/ku5WC8XagtKOTZnqvcs9FZLu+cmBcKGajfTD3riYe++ntBaZCmCaXPvydTJV3h8AWdkrBS58cCbk43Jilk2Wk/Fe8PdBzrmYbaQ28zGqYNm8p3VRcm6JwAbGb9/UGuiGlG+dvWIVMmLuV2QR/6uu8PLKji/YGMIqXmqmQjVviMRX5z3rLSN2V+tNoJhbCQXDaa2c1JTPxIsplCJiM11eO1N09enB3kGuLjZWyUxDCp2eT9Q1/7/eFBulFBGFyYiFJOXg0Lm9nB8GUOsaG5Jk2sS7JbPfR13w+oJayl6XBZl5crEEYpVuGbDYgFaSq86izXrKnfmHIqj2wnJil4jLVeMlxmoEk2FJr8Q5GlPF3vwwwevpOqqdCt18l+1hmFXnq8k8NKK7XvX0QIOd7niQD1NIOJuiZVvKCQkbdVK8fQXdP8ocOcwKNi+BHK3CiS9eidx4OdHuUW5mia9pPiDdELCmUsT1rZCqYZFQIGhQ6qwWhQOYaD0fGHUF4NfYy8LJLUlRpQcFBvhUC8uPxubNTSIG3lGEL9zr3R52c7yw0gGlxLXpjeGdnz50pUHBK1cAtYfrgqaCsVJnTwfu9PKbUq6868Zlorra8KhJg+Oc4srzVQWr2UC7NU5u+q7KG13Ai1XvUxJE4TY1o5Yqa0jK4k2j6sw/zVwNLZIKZ/jBe9VOZbvcy2MeemdLgkQRJoAkCYjHy//u3VdegbGZ4EM4V8/YMslbn4BNyOn0c2pS1TSF0d7w13ZclchyKGWVp3CSHXNjd0KyKj1MFm4W6KV2z9GU/PFcInYU4/O7X9llkpzdJ1TqvvCVGs7l+fd0ChkPevVUlQIhpd5pO1/UFRHB+F7hOzWQpVhVTkx+e2bSMIK1CIZHhG3Hh9oQs6V65Vnufjt5/ejqPmFGYxfOOoeGg9V6EeDaitPkifKPWlPu8MpWB16lKD7ZaNIfYlDP7y/kMLugaYvqDFYVi7p38/hRqSz3JaSskgWrJZtsPg7qh4ctLK3gwvPo/rBprv31a5L+CEgeeC386fOs3+lR9ruTd4aDE3we1gj6j6KZl/d5u3lgdOEysF4vyYXaxbxiT8EVJy58uzHLcd0CQBl6FbOcyx6F7jdy5o4Y++0XCH1DTcKtq2S4jzhHM+3M2Z+SsCrw+sli6EbFde0rJIkXC3p+KnUM4LpL8JK6UxSv+8T2nbHlUIDgIHu1DD/kOFviFy8p5n7VOYQAKyImNtIA/9BwqVgVz1MF21om21L7iMV237cWx8yD/dZp/4fMvPPYHlC2FGxiQ/G0F2K9L22GiN6NtsM3T1EqsLQlan3sb4vpQ37bC4Thzp6dQ3U/1LL6n/y5Yp9FKe/RpeI/eZi3j3mZ8liSDzZvnusdey+VlDsyD1fjtZucpTQspS3U8hjDozcnmYijbuCKYZTUUg6Oo5s72+We/bHOra+1gP064DrA72My5a2X3i1BOCpw04FyJNh9/m7IuVlMtr/MiHSH+wX1ietHEMvZTaQCT1luxgvjHbbbrg2fDbO/eSOHyXqYMdKbI8zGgAJVgbx7DuRHjzveezn/Uv6w3W8hJKjdsdNYJcFKoLJuXS/motrp0CbwFm7/CbHIr+Ut+m0Jdag9FMIRkNvFa2R2/k/EIFzfhw7U5HZYoZCKL5WWVtG+PEzVyMBKzEzA5qR731aTbECS0nTwb9fvqQ1/w3qX2Dg6MSdrtCn+jdz6c27bctF70der7/3nPOKpI7HRWybZiiG+7sCE14J2wGErjMZQCXtnG3o0ods6erwcWxhNbjLtSd5uGurTEbkrsdNVJOYWcmaP1kBpIZqGHT/nlD8G5HjRTrlkKv3uW8QbnbfzDjbkftlMJ6TqaJ5dWvK+40z7wTcbejyg4pnFkF5KjH2/n4xIOJOpPI3Yav2lFv2kwKCklHFFIL6Tf3RNZbIkaNV/ru/CC/dFQKjqpcJ2Zhz0UcO4VFJxR6roSCL71fpCGxnGyKdO6oNTNHlQYyGLOgUMvOKAygRqS297vURkdK/7iZWueoc4XgqN5wTfpQSiwqhAKyI7PUc3u4OX8RljFzYRwmKhWXjprWjvrJGWrzkFrs2lW/d0Qh5Fw8PV6GtcZkvTt0stlwVFE76lYOCnVjezcojMizrii0VKy/IjKXkfadzrJ2VDHfJ8WdyidhqV1PNbpUaAzZ6kjhlNr++v6YESn9+rESY/5kxSbNrgR9Ehq28MjJ9aDCzW7s0ONpJtaPmp013+STTds8S2BBoSYLh0V9ow8Gqw932X8BnlpbLTd3d0FlpMZPmi1eN4ZaNhVGpJRnvVY+074CrZ9ArYSzfTMzCayMVf6f4m6FchoOW7ev5Gao109eLZS6vlH505G4TWH9FWLF3qDfyh7pFdzB8/76LjNmdt4Hph9jJv9Y9a86zeUY+u5UkByvix9sFyRCOLB/TAxziadSzEDIV5OjChK3xmcuFYLRGshvGAu3NsT6bJa23VB5kJ1IwzSLIohxUNDny5sDzwbNFlpzDCEswt3IfyoyLjoSLfjqM1lHu9ht22Ph09enGU0WbLKpMNJlSSY/VVmW8NNOKPSC3ieoAN0zFqV1tDQsAtci9LIb1mGdD+RKHmxuQCLUmU5pMFrSsdsuJPNwaWsEhYVLvPk1p6lzmpgwOdmrYAFCRSK6InHwzm3Dk2R8tjIKkoSvur6iaE7TVVBI3HEnyOv+3DsZ9hPIzGlmk9a7jOdK/OzzRJPw3aeV54V75QWft4abSTVkbao+7zNZ2no+8gJeb/PuTKc0efLfnVcrw4F7Z8lsb/O1z8AYlpHMD9ZOKtoN/2zC+/1qULjn2zaZr6trGmAdynz3qCq4O5Lxb1/hP8Zt/QLTSO56O9dKuHsyPLX1C8v+zWv7OoBpBvVLulwmessA/Xb4mvJT1xZPu6eQu/d0uQNB1rvlAL17jlGcZn337jk+exLTrZlKvfmL5O78DKUBP//44+TRCkMQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEGQr8n/ABGyzAUL7/lcAAAAAElFTkSuQmCC ```
    -Read the guide on **[loading base64 data](/docs/how-to/loading-image-pdf-from-db)** +Read the guide on **[loading base64 data](/docs/how-to/loading-image-pdf-from-db)**. ToolJet - Data source - REST API - ## Retry on Network Errors ToolJet provides an option to automatically retry REST API requests in case of certain network errors or specific HTTP status codes. By default, this feature is enabled and will retry the request up to 3 times in case of failure. This feature can be toggled on or off at both the data source level and the individual query level. When enabled, retries will occur for the following scenarios: diff --git a/docs/docs/data-sources/s3.md b/docs/docs/data-sources/s3.md index 47fa13f442..6517794bf4 100644 --- a/docs/docs/data-sources/s3.md +++ b/docs/docs/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.com/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.ai/build-an-aws-s3-broswer-with-tooljet/)**. ::: \ No newline at end of file diff --git a/docs/docs/data-sources/sample-data-sources.md b/docs/docs/data-sources/sample-data-sources.md index 0d03117a45..1189754cdb 100644 --- a/docs/docs/data-sources/sample-data-sources.md +++ b/docs/docs/data-sources/sample-data-sources.md @@ -29,7 +29,7 @@ This method allows you to add a sample data source to an existing application th
    - Connect via Canvas + Connect via Canvas
    @@ -44,7 +44,7 @@ This method allows you to connect the sample data source to an existing applicat
    - Connect via query manager + Connect via query manager
    @@ -59,7 +59,7 @@ This method enables the creation of a sample application with a pre-configured c 5. By default, this application will feature a table component with tabs. These tabs will visually display the data retrieved from your sample data source.
    - Create Sample App + Create Sample App
    ## Sample Data Source Schema @@ -68,8 +68,8 @@ The sample data source contains various tables with different data types. | Table Name | Column Names| Number of Rows | |:-------|:---------|:---------------| -| `sampledataxlsx_organizations` | `index`, `organization_id`, `name`, `website`, `country`, `description`, `founded`, `industry`, `number_of_employees` | 100 | -| `sampledataxlsx_countrygdp` | `country`, `area_sq_km, population`, `exports`, `imports, gdp`, `gdp_per_capita`, `gdp_real_growth_rate`, `inflation_rate_consumer_prices`, `investment_gross_fixed_of_gdp`, `labor_force`, `unemployment_rate` | 263 | -| `sampledataxlsx_users` | `first_name`, `last_name`, `company_name`, `address`, `city`, `county`, `state`, `zip`, `phone1`, `phone2`, `email`, `web` | 500 | -| `sampledataxlsx_orders` | `row_id`, `order_id`, `order_date`, `ship_date`, `ship_mode`, `customer_id`, `customer_name`, `segment`, `country`, `city`, `state`, `postal_code`, `region`, `product_id`, `category`, `sub_category`, `product_name`, `sales`, `quantity`, `discount`, `profit` | 500 | -| `sampledataxlsx_productlistcars` | `car`, `mpg`, `cylinders`, `displacement`, `horsepower`, `weight`, `acceleration`, `model`, `origin` | 406 | +| `public.sample_data_organizations` | `index`, `organization_id`, `name`, `website`, `country`, `description`, `founded`, `industry`, `number_of_employees` | 100 | +| `public.sample_data_country_gdp` | `country`, `area_sq_km, population`, `exports`, `imports, gdp`, `gdp_per_capita`, `gdp_real_growth_rate`, `inflation_rate_consumer_prices`, `investment_gross_fixed_of_gdp`, `labor_force`, `unemployment_rate` | 263 | +| `public.sample_data_users` | `first_name`, `last_name`, `company_name`, `address`, `city`, `county`, `state`, `zip`, `phone1`, `phone2`, `email`, `web` | 499 | +| `public.sample_data_orders` | `row_id`, `order_id`, `order_date`, `ship_date`, `ship_mode`, `customer_id`, `customer_name`, `segment`, `country`, `city`, `state`, `postal_code`, `region`, `product_id`, `category`, `sub_category`, `product_name`, `sales`, `quantity`, `discount`, `profit` | 500 | +| `public.sample_data_product_cars` | `car`, `mpg`, `cylinders`, `displacement`, `horsepower`, `weight`, `acceleration`, `model`, `origin` | 406 | diff --git a/docs/docs/data-sources/soapapi.md b/docs/docs/data-sources/soapapi.md new file mode 100644 index 0000000000..8b0984e43c --- /dev/null +++ b/docs/docs/data-sources/soapapi.md @@ -0,0 +1,62 @@ +--- +id: soap-api +title: SOAP API +--- + +ToolJet can establish connections with SOAP APIs using its REST API integration. + +
    + +## Setting up a SOAP API Data Source + +To establish a connection with a SOAP API data source, you will need to add a REST API data source, as ToolJet handles SOAP APIs using REST API configurations. + +You can refer to [REST API Configuration Documentation](/docs/data-sources/restapi/) for more information. + +
    + +
    + +## Querying SOAP API + +Once you have connected to the REST API data source, you can easily write queries and interact with the SOAP API in the ToolJet application. Follow these steps to get started: + +1. Click on the **+ Add** button in the query manager at the bottom panel of the editor. +2. Select **REST API** from the Data Source section. +3. Select the **POST** Method and enter your SOAP API endpoint. +4. Add Headers + - **Content-Type** : **text/xml** (Specifies that the request body is XML.) + - Include any other required headers (e.g., Authorization, SOAPAction). +5. Add Request **Body** in XML format. +6. Click **Preview** to view the data returned from the query or click **Run** to execute the query. + +:::tip +You can also transform the query results using the **[Transformations](/docs/tutorial/transformations)** feature. +::: + +**API Endpoint URL Example:** `http://www.dneonline.com/calculator.asmx` + +SOAP API Headers + +**Request Body Example:** + +```xml + + + + + 100 + 5 + + + +``` + +SOAP API Headers + +**Additional Notes:** +- SOAP APIs typically use the POST method. Using a different method can cause errors. +- Ensure that you have added Content-Type: text/xml header. The server requires the correct header to interpret the request as SOAP. +- Include the SOAPAction header if specified in the API documentation. + +
    \ No newline at end of file diff --git a/docs/docs/data-sources/stripe.md b/docs/docs/data-sources/stripe.md index 20a90a6f64..2352956053 100644 --- a/docs/docs/data-sources/stripe.md +++ b/docs/docs/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.com/build-a-stripe-refund-tool-using-low-code/)** +Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-stripe-refund-tool-using-low-code/)** :::
    diff --git a/docs/docs/development-lifecycle/backup/gitsync-backup.md b/docs/docs/development-lifecycle/backup/gitsync-backup.md new file mode 100644 index 0000000000..8f72c6543e --- /dev/null +++ b/docs/docs/development-lifecycle/backup/gitsync-backup.md @@ -0,0 +1,16 @@ +--- +id: gitsync-backup +title: GitSync Backup +--- + +GitSync enables users to back up their applications by pushing changes to a Git repository, ensuring a secured history. Whenever a change is pushed to the git repository, a commit is created. And this changes can be restored in ToolJet easily ensuring smooth back-up and restoring process. For details on configuring GitSync, refer to the **[GitSync Configuration](/docs/development-lifecycle/gitsync/gitsync-config)** guide. + +**Note**: Only the latest pushed version of the application is stored in the git repository, i.e. whenever a new version is pushed to the git repository, only the latest version is stored and all the previous versions are overridden. + +To know how to push changes to a git repository using GitSync, please refer to **[Push Changes to Git Repo](/docs/development-lifecycle/gitsync/push)** guide. + +## Restore Application + +Changes can be pulled from the git repository to restore an application. To know how to pull changes from a git repository using GitSync, please refer to **[Pull Changes from Git Repo](/docs/development-lifecycle/gitsync/pull)** guide. + +**Note:** A restored application from the git repository can't be edited. To edit the application you will need to create a clone of the application. \ No newline at end of file diff --git a/docs/docs/development-lifecycle/environment/cloud/example.md b/docs/docs/development-lifecycle/environment/cloud/example.md new file mode 100644 index 0000000000..dc0fda0597 --- /dev/null +++ b/docs/docs/development-lifecycle/environment/cloud/example.md @@ -0,0 +1,30 @@ +--- +id: example-configuration +title: Example Configuraiton +--- + +This guide will walk you through setting up a multi-environment in ToolJet with a practical example. Imagine **Nexora Enterprises**, a company building an internal application using ToolJet. + +## Configuring Data Source + +In ToolJet, you can configure data sources for each environment, allowing your application to connect to different databases or APIs based on the environment. + +In this case, the company uses data from a Postgres data source for their ToolJet apps, with separate databases for development, staging, and production environments. They need to configure the Postgres data source for each environment in the Data Sources section. For more details, refer to the [Data Source](/docs/data-sources/overview) Documentation. + +self-hosted-env-concept + +## Configuring Constants + +The company also uses different global and secret constants for each environment. Global Constants are reusable values that can be applied consistently across the product, while Secrets are used for securely storing sensitive data. These can be configured in the Workspace Constants section. For more details, check the [Workspace Constants and Secrets](/docs/security/constants/) Documentation. + +self-hosted-env-concept + +## Multi-Environment Setup in ToolJet +- The company can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. +- Now developers can start building applications in the **development environment**, where they create and iterate on new features. In this environment, they have access to the development database, which is configured during data source setup. +- Once the application is ready, it moves to the **staging environment**, where the QA team tests it thoroughly. If any bugs or feedback arise, developers create a new version, implement the necessary changes, and promote the updated application back to staging for further testing. +- The data sources for each environment will be connected based on the configuration set in the previous step. +- For details on managing versions, check the **Version Control Documentation**. +- After successful testing, the application is promoted to **production** and released, making it available to end users. This environment uses the production database set up during data source configuration. + +self-hosted-env-concept \ No newline at end of file diff --git a/docs/docs/development-lifecycle/environment/cloud/multi-environment.md b/docs/docs/development-lifecycle/environment/cloud/multi-environment.md new file mode 100644 index 0000000000..e8f0a03e3e --- /dev/null +++ b/docs/docs/development-lifecycle/environment/cloud/multi-environment.md @@ -0,0 +1,76 @@ +--- +id: multi-environment +title: Multi-Environment +--- +
    + Icon + Paid feature +
    + +Environments in ToolJet help manage different stages of application development, ensuring smooth transitions between development, testing, and production. This guide covers what environments are, their purpose, and how they function in ToolJet. + +Environments make it easier to develop and deploy applications without disrupting production. They keep changes isolated, so testing and debugging can happen without affecting live users. Teams can collaborate more efficiently, as different environments allow them to work independently. + +### What are Environments? + +An environment in ToolJet represents a separate configuration space where **applications**, **data** **sources**, and **constants** can be defined and managed. + +By default, ToolJet provides three environments: + +- **Development**: The Development environment is where application development and initial testing take place. It is a dedicated space for ToolJet developers to build, configure, and experiment with application features. Changes in this environment do not affect live users, allowing for frequent updates and debugging. + +- **Staging**: The Staging environment acts as a pre-production space where applications undergo thorough testing before deployment. It closely resembles the Production environment and helps ensure that all features, performance, and security aspects function as expected. Teams such as QA and product managers use this environment to validate and approve changes before releasing them to end-users. + +- **Production**: The Production environment is the final, live version of the application where end users interact with it. This environment is stable and optimized for performance after thorough testing in the Development and Staging environments. + + +### Multi-Environment Support in ToolJet + +ToolJet provides environment management across different components: + +#### Applications + +Each application has development, staging, and production environments. Developers build the application in the development environment and then move it to staging for testing. Your testing team can review the application in staging, and once it's thoroughly tested, you can promote it to production and release it to your end users. + +#### Data Sources + +Data sources can be configured separately for each environment, allowing applications to connect to different databases or APIs depending on the environment. This ensures secure and structured access to relevant data during each stage of development. + +#### Constants + +Constants such as API keys, credentials, or other configuration variables can be defined uniquely for each environment. This helps maintain security and prevents misconfigurations across different deployment stages. + +### Application Life cycle + +The application lifecycle in ToolJet involves managing applications across different environments development, staging, and production. You can build the application in development environment and promote it to staging for testing. After testing you can promote it to production and release the app for your end-users. + +You can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. + +- **Development** – Developers build and test the application in the ToolJet app builder. + +- **Staging** – The testing or product team validates requirements and tests the application using staging data. Apps and queries cannot be edited in this environment. + +- **Production** – After thorough testing in staging, the application is promoted to production. This can serve as a pre-release environment where you test with production data and constants before releasing the application to end users. Refer to [Release](/docs/development-lifecycle/release/release-rollback) documentation to learn more. + +self-hosted-env-concept + + +### Impacted behavior with environment permission + +Each environment has a different impact on your application. Please refer the following table for details. + +| Action | Development | Staging | Production | +|--------------------|------------|---------|------------| +| Edit versions | ✅ | ❌ | ❌ | +| Rename versions | ✅ | ❌ | ❌ | +| Delete versions | ✅ | ❌ | ❌ | +| Create new versions | ✅ | ❌ | ❌ | +| Promote | ✅ | ✅ | - | + + +Checkout the [Environment-Example](/docs/development-lifecycle/environment/cloud/example-configuration) guide to learn about multi-environment in ToolJet with a practical example. \ No newline at end of file diff --git a/docs/docs/development-lifecycle/environment/self-hosted/example.md b/docs/docs/development-lifecycle/environment/self-hosted/example.md new file mode 100644 index 0000000000..5879783254 --- /dev/null +++ b/docs/docs/development-lifecycle/environment/self-hosted/example.md @@ -0,0 +1,30 @@ +--- +id: example-configuration +title: Example Configuraiton +--- + +This guide will walk you through setting up a multi-environment in ToolJet with a practical example. Imagine **Nexora Enterprises**, a company building an internal application using ToolJet. + +## Configuring Data Source + +In ToolJet, you can configure data sources for each environment, allowing your application to connect to different databases or APIs based on the environment. + +In this case, the company uses data from a Postgres data source for their ToolJet apps, with separate databases for development, staging, and production environments. They need to configure the Postgres data source for each environment in the Data Sources section. For more details, refer to the [Data Source](/docs/data-sources/overview) Documentation. + +self-hosted-env-concept + +## Configuring Constants + +The company also uses different global and secret constants for each environment. Global Constants are reusable values that can be applied consistently across the product, while Secrets are used for securely storing sensitive data. These can be configured in the Workspace Constants section. For more details, check the [Workspace Constants and Secrets](/docs/security/constants/) Documentation. + +self-hosted-env-concept + +## Multi-Environment Setup in ToolJet +- The company can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. +- Now developers can start building applications in the **development environment**, where they create and iterate on new features. In this environment, they have access to the development database, which is configured during data source setup. +- Once the application is ready, it moves to the **staging environment**, where the QA team tests it thoroughly. If any bugs or feedback arise, developers create a new version, implement the necessary changes, and promote the updated application back to staging for further testing. +- The data sources for each environment will be connected based on the configuration set in the previous step. +- For details on managing versions, check the [Version Control Documentation](/docs/development-lifecycle/release/version-control). +- After successful testing, the application is promoted to **production** and released, making it available to end users. This environment uses the production database set up during data source configuration. + +self-hosted-env-concept \ No newline at end of file diff --git a/docs/docs/development-lifecycle/environment/self-hosted/multi-environment.md b/docs/docs/development-lifecycle/environment/self-hosted/multi-environment.md new file mode 100644 index 0000000000..9c8387f5f6 --- /dev/null +++ b/docs/docs/development-lifecycle/environment/self-hosted/multi-environment.md @@ -0,0 +1,76 @@ +--- +id: multi-environment +title: Multi-Environment +--- +
    + Icon + Paid feature +
    + +Environments in ToolJet help manage different stages of application development, ensuring smooth transitions between development, testing, and production. This guide covers what environments are, their purpose, and how they function in ToolJet. + +Environments make it easier to develop and deploy applications without disrupting production. They keep changes isolated, so testing and debugging can happen without affecting live users. Teams can collaborate more efficiently, as different environments allow them to work independently. + +### What are Environments? + +An environment in ToolJet represents a separate configuration space where **applications**, **data** **sources**, and **constants** can be defined and managed. + +By default, ToolJet provides three environments: + +- **Development**: The Development environment is where application development and initial testing take place. It is a dedicated space for ToolJet developers to build, configure, and experiment with application features. Changes in this environment do not affect live users, allowing for frequent updates and debugging. + +- **Staging**: The Staging environment acts as a pre-production space where applications undergo thorough testing before deployment. It closely resembles the Production environment and helps ensure that all features, performance, and security aspects function as expected. Teams such as QA and product managers use this environment to validate and approve changes before releasing them to end-users. + +- **Production**: The Production environment is the final, live version of the application where end users interact with it. This environment is stable and optimized for performance after thorough testing in the Development and Staging environments. + + +### Multi-Environment Support in ToolJet + +ToolJet provides environment management across different components: + +#### Applications + +Each application has development, staging, and production environments. Developers build the application in the development environment and then move it to staging for testing. Your testing team can review the application in staging, and once it's thoroughly tested, you can promote it to production and release it to your end users. + +#### Data Sources + +Data sources can be configured separately for each environment, allowing applications to connect to different databases or APIs depending on the environment. This ensures secure and structured access to relevant data during each stage of development. + +#### Constants + +Constants such as API keys, credentials, or other configuration variables can be defined uniquely for each environment. This helps maintain security and prevents misconfigurations across different deployment stages. + +### Application Life cycle + +The application lifecycle in ToolJet involves managing applications across different environments development, staging, and production. You can build the application in development environment and promote it to staging for testing. After testing you can promote it to production and release the app for your end-users. + +You can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. + +- **Development** – Developers build and test the application in the ToolJet app builder. + +- **Staging** – The testing or product team validates requirements and tests the application using staging data. Apps and queries cannot be edited in this environment. + +- **Production** – After thorough testing in staging, the application is promoted to production. This can serve as a pre-release environment where you test with production data and constants before releasing the application to end users. Refer to [Release](/docs/development-lifecycle/release/release-rollback) documentation to learn more. + +self-hosted-env-concept + + +### Impacted behavior with environment permission + +Each environment has a different impact on your application. Please refer the following table for details. + +| Action | Development | Staging | Production | +|--------------------|------------|---------|------------| +| Edit versions | ✅ | ❌ | ❌ | +| Rename versions | ✅ | ❌ | ❌ | +| Delete versions | ✅ | ❌ | ❌ | +| Create new versions | ✅ | ❌ | ❌ | +| Promote | ✅ | ✅ | - | + + +Checkout the [Environment-Example](/docs/development-lifecycle/environment/self-hosted/example-configuration) guide to learn about multi-environment in ToolJet with a practical example. \ No newline at end of file diff --git a/docs/docs/development-lifecycle/environment/self-hosted/multi-instance/example.md b/docs/docs/development-lifecycle/environment/self-hosted/multi-instance/example.md new file mode 100644 index 0000000000..b2e5291045 --- /dev/null +++ b/docs/docs/development-lifecycle/environment/self-hosted/multi-instance/example.md @@ -0,0 +1,81 @@ +--- +id: example-configuration +title: Example Configuration +--- + + +In this guide, you'll learn how to migrate applications using GitSync in a multi-instance ToolJet setup through a practical example. + +Vertex Solutions, a company building internal applications with ToolJet, has three ToolJet instances for **development, staging, and production** environments. They have configured Gitsync in all the three instances with GitHub by following the setup instructions given in the [GitSync](/docs/development-lifecycle/gitsync/overview) documentation. + +## Creating the App + +The company wants to create an **Inventory Management System**. A developer starts by clicking **Create New App** on the dashboard. In the modal that appears, they enter the app name and select the **Commit changes** checkbox to save the app to the configured Git repository. Upon clicking **Create App**, the app will be added to your Git repository with a commit message. + +self-hosted-env-concept + +self-hosted-env-concept + +- Developers then build the app in the App Builder by dragging and dropping components and adding relevant queries. Once the changes are complete, they can use the GitSync button in the top bar to push a commit to the Git repository. + +self-hosted-env-concept + + +- Once committed, the updates appear in the Git repository, showing the commit message, author, and timestamp. +self-hosted-env-concept +- The development is done and the app is ready to be pulled into the staging instance for testing. + + +## Importing the App in Staging + +After configuring GitSync for the staging instance with the same Git repository as the development instance, testers can import the app by following these steps: + +- Navigate to the **ToolJet dashboard** of the staging instance. + +- Click on the **three dots** next to the **Create New App** button. +- Select **Import from Git Repository** to pull the app. + self-hosted-env-concept +- Choose the app from the dropdown list. The app name and last commit details appear. + +- Click **Import App** to import it into the staging instance. +self-hosted-env-concept + +- Once the apps are imported into the staging instance, all data sources are imported as well. However, for security reasons, passwords and secrets in the data source configuration are not included. +- To ensure the app functions properly in the staging instance and can be tested with staging data, users must re-enter these details in the configuration. +- After adding the data source configuration, testers can verify the app's features and functionality. The app will open in view-only mode. + +### Iterating and Fixing Issues + +If testers find bugs or require modifications, developers create a **new version** in the development instance. + +self-hosted-env-concept + +When committing a new version via **GitSync**: + +- The JSON file inside the app folder is updated with the version name. + +- The **meta.json** file in the .meta folder is modified with the new version ID and name. +self-hosted-env-concept + +After implementing necessary changes, developers commit the updates to the Git repository. + +### Pulling Updates in Staging + +Testers in the **staging instance** update the app by: + +- Clicking the **GitSync** button in the top bar. + +- A modal appears with an option to **Check for Updates**. +self-hosted-env-concept + +- Clicking **Check for Updates** fetches the latest changes from the Git repository. + +- Commit details (message, author, date) are displayed. + +- Clicking **Pull Changes** syncs the latest updates into the staging instance. + +self-hosted-env-concept + +### Deploying to Production + +Once the application passes testing in staging, it is imported into the **production instance** using the same GitSync process. The application is then released, making it available to end users. \ No newline at end of file diff --git a/docs/docs/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment.md b/docs/docs/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment.md new file mode 100644 index 0000000000..ea4e933e91 --- /dev/null +++ b/docs/docs/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment.md @@ -0,0 +1,29 @@ +--- +id: instance-as-environment +title: Instance as Enviroment +--- + + +In this guide, you will learn to manage a Multi-Instance ToolJet deployment. A Multi-Instance setup allows you to deploy multiple isolated ToolJet instances, each functioning as a separate environment, such as development, staging, and production, to support a structured Software Development Life Cycle (SDLC). In this setup each instance operates independently with a strict isolation of resources, users, and applications. + +## Setting Up Multi-Instance Environments + +To enable a multi-instance setup, you need to deploy separate ToolJet instances on your self-hosted infrastructure. Refer to the [setup](/docs/setup/try-tooljet) guide to learn about ToolJet self-hosted deployments. + +## Migrate applications between Instances + +ToolJet’s GitSync feature helps to migrate applications between instances by pushing and pulling changes through a Git repository. It supports Git providers such as GitHub, GitLab, Gitea and Bitbucket. For setup instructions, refer to the [GitSync documentation](/docs/development-lifecycle/gitsync/overview).With GitSync, users can effortlessly transfer applications between instances by committing and pushing changes to a shared repository. This ensures that once an application is developed in development instance, it can be easily synchronized with other instances like staging and production. + +## Pushing and Pulling Apps Between Instances via GitSync + +### Pushing Changes + +GitSync enables users to commit and push updates from your instance to your Git repository. New apps, renames, and version creations are auto-committed and you can also manually commit changes using the GitSync button in the App Builder. Refer to [Push-Gitsync](/docs/development-lifecycle/gitsync/push) doc to learn more. + +### Pulling Changes + +GitSync allows you to pull updates from a Git repository into your instance. You can import apps from Git through the ToolJet dashboard. Once pulled, the app will be in view-only mode. You can also check for updates, which fetches the latest commits with details like author and date. If updates are available, you can pull changes and sync them. Refer to [Pull-Gitsync](/docs/development-lifecycle/gitsync/pull) doc to learn more.Here is the diagram showing how you can use gitsync to migrate your apps across instances. + +self-hosted-env-concept + +Checkout the [Multi-Instance-Example](/docs/development-lifecycle/environment/self-hosted/multi-instance/example-configuration) guide to learn how to use GitSync for multi-instance setup in ToolJet with a practical example. \ No newline at end of file diff --git a/docs/docs/development-lifecycle/gitsync/delete-gitsync.md b/docs/docs/development-lifecycle/gitsync/delete-gitsync.md new file mode 100644 index 0000000000..65daf8c753 --- /dev/null +++ b/docs/docs/development-lifecycle/gitsync/delete-gitsync.md @@ -0,0 +1,24 @@ +--- +id: delete-gitsync +title: Delete GitSync Configuration +--- + +In ToolJet, GitSync can be enabled, disabled, or deleted based on your requirements. + +- **Enabled**: When GitSync is enabled the users will be able to commit changes to the git repository. +- **Disabled**: + - **Non-Admin Users**: The users will not be able to commit changes to the git repository. They will see a dialogue box that the GitSync feature is not configured and they need to contact the admin to configure it. + - **For admin users**: The users will see a dialogue box with a link to configure the GitSync feature. +- **Delete GitSync Configuration**: Deleting the GitSync configuration will not delete the apps from the git repository. The apps will still be available in the git repository in the same state as they were before the GitSync configuration was deleted. + +## Enable/Disable GitSync + +To enable or disable the GitSync feature, go to the **Configure git** tab on the **Workspace settings** page, and toggle on/off the **Connect** switch. This is only available if the GitSync feature is configured. + +GitSync + +## Delete GitSync Configuration + +To delete the GitSync configuration, go to the **Configure git** tab on the **Workspace settings** page, and click on the **Delete configuration** button. This will delete the SSH key from the ToolJet configuration and the GitSync feature will be disabled. + +GitSync diff --git a/docs/docs/development-lifecycle/gitsync/gitsync-config.md b/docs/docs/development-lifecycle/gitsync/gitsync-config.md new file mode 100644 index 0000000000..1757510dac --- /dev/null +++ b/docs/docs/development-lifecycle/gitsync/gitsync-config.md @@ -0,0 +1,72 @@ +--- +id: gitsync-config +title: Configure GitSync +--- + +In this guide, we will explore how to configure GitSync using GitHub as the repository manager. By default GitSync is configured for the **master** branch, but this can be configured to a different branch as well, refer to **[Configuring GitSync on a Different Branch](#configuring-gitsync-on-a-different-branch)** section for more information. + +For more information on using other repository managers, such as GitLab or Gitea, refer to the **[SSH Configuration for Git Repo Manager](/docs/development-lifecycle/gitsync/ssh-config)** guide. + +## Setting up GitSync in ToolJet + +Role Required: **Admin** + +1. **Create a New Repository**
    + Create a new repository on your GitHub. The repository can be public or private. You can also use an existing repository. Make sure that the repository is empty. + GitSync + +2. **Obtain the SSH URL**
    + When a repository is created, GitHub shows a screen with the SSH URL. + GitSync + + OR + + If you are using an existing repository, then you can obtain the URL by clicking on the **Code** button. + GitSync + + To generate the SSH URL for other git repository manager, such as GitLab and Gitea, follow the **[SSH Configuration](/docs/development-lifecycle/gitsync/ssh-config#generating-ssh-url)** guide. + +3. Go to the **Workspace settings**, and click on the **Configure git** tab.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/configure-git`) + + GitLab Repo + +4. Enter the **SSH URL** of the repository in the **Git repo URL** field. + +5. Click on the **Generate SSH key** button, and copy the SSH key that is generated. The SSH key is used to authenticate ToolJet with the repository. + + GitSync + + There are two types of generated SSH keys: + - **ED25519**: This is a secure and efficient algorithm that is used for generating SSH keys. It is recommended to use this key type. VCS providers like GitHub and GitLab recommend using this key type + - **RSA**: This is an older algorithm that is used for generating SSH keys. It is not recommended to use this key type. Providers like Bitbucket recommend using this key type.

    + + GitSync + +6. Go to the **Settings** tab of the GitHub repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. + GitSync + +7. Enter a title for the SSH key in the **Title** field. + +8. Paste the SSH key generated from the ToolJet. + +9. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). + +10. Finally, click on the **Add key** button. + GitSync + + To deploy the SSH key for other git repository manager, such as GitLab and Gitea, follow the **[SSH Configuration](/docs/development-lifecycle/gitsync/ssh-config#deploy-the-ssh-key)** guide. + +11. After deploying the SSH Key, go to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message. + GitSync + +## Configuring GitSync on a Different Branch + +Starting from version **v3.5.3-ee-lts**, GitSync in ToolJet supports custom branches. This feature is available only in the Self-Hosted version of ToolJet. The custom branch for GitSync is configured at the instance level via an environment variable. + +Different repositories can be configured for different workspaces, but the custom branch set in the **.env** file must be present in all configured repositories to ensure smooth operation. The branch specified in the **.env** file will apply to all workspaces with GitSync support. + +To configure a custom branch for GitSync, you need to set the following environment variable in your **.env** file:
    +`GITSYNC_TARGET_BRANCH` = **branch-name** + +**Note:** **Existing GitSync users** who want to use a custom Git branch must first create a new custom branch from the master branch in the Git repository manager. Then, they must configure the branch name in the **.env** file to ensure all operations work smoothly. \ No newline at end of file diff --git a/docs/docs/development-lifecycle/gitsync/overview.md b/docs/docs/development-lifecycle/gitsync/overview.md new file mode 100644 index 0000000000..779f42aa80 --- /dev/null +++ b/docs/docs/development-lifecycle/gitsync/overview.md @@ -0,0 +1,26 @@ +--- +id: overview +title: GitSync Overview +--- + +
    + Icon + Paid feature +
    + +The GitSync feature in ToolJet allows seamless synchronization of workspace applications with a Git repository, enhancing version control, environment migration, and backup management. It supports both cloud-based and self-hosted Git providers offering flexibility in managing application development and deployment. GitSync can also be configured for a custom branch. Refer to **[Configure GitSync](/docs/development-lifecycle/gitsync/gitsync-config)** guide for more information. + +## Key Use-Cases + +### Application Migration + +GitSync can be used to facilitate the movement of application across different ToolJet instances such as from development to staging to production. Users can effortlessly transfer their applications across instances by pushing changes to a Git repository. This means that once an application is developed in one instance, it can be easily moved to another by simply syncing with the repository, ensuring a smooth transition without the need for manual configurations. Refer to the **[multi-instance](/docs/development-lifecycle/gitsync/gitsync-config)** guide for detailed steps. + +### Backup of Apps + +GitSync provides a straightforward solution for creating backups of your applications. By pushing changes to a Git repository, users can ensure a secure and versioned history of their application. This serves as a reliable backup mechanism, safeguarding against accidental application/version deletion or corruption. Refer to **[GitSync Backup](/docs/development-lifecycle/backup/gitsync-backup)** guide for more information. diff --git a/docs/docs/development-lifecycle/gitsync/pull.md b/docs/docs/development-lifecycle/gitsync/pull.md new file mode 100644 index 0000000000..ff8e42bd87 --- /dev/null +++ b/docs/docs/development-lifecycle/gitsync/pull.md @@ -0,0 +1,34 @@ +--- +id: pull +title: Pull Changes from Git Repo +--- + +Once the GitSync is configured and the changes are committed to the git repository, after that the changes can be pulled from the git repository to restore the application or to use multi instance as multi environment. + +## Restore Application + +To restore an application from a git repository, click on the kebab menu (three dots) on the right side of the **Create new app** button on the dashboard. Click on the **Import from git repository** option. + +GitSync + +On clicking the **Import from git repository** option, a modal will open with the dropdown to select the app to be imported from the git repository. Once the app is selected, the app name and the last commit will be displayed. Click on the **Import app** button to import the app from the git repository. + +GitSync + +**Note**: +- The app imported from the git repository cannot be edited. To edit the application, you will need to clone it. +- The app imported from the Git repository should have a unique name. If the app's name is the same as that of an existing app in the workspace, the user will need to either rename the existing app or delete it to successfully import another app with the same name. +- Workspace constants are not synced with the git repository. After pulling the app, if the app throws an error, the user will need to manually add the workspace constants. + +## Pull Changes + +You can check for updates and pull changes from the git repository by following these steps: + +1. Click on the **GitSync** button, a modal will open with the option to **Check for updates**. + +2. Click on the **Check for updates** button to check for updates in the git repository. If there are any updates, you will see the details of the updates such as commit message, author, and the date in the modal. + +3. Click on the **Pull changes** button to pull the changes from the git repository. + + GitSync + diff --git a/docs/docs/development-lifecycle/gitsync/push.md b/docs/docs/development-lifecycle/gitsync/push.md new file mode 100644 index 0000000000..31d359c11d --- /dev/null +++ b/docs/docs/development-lifecycle/gitsync/push.md @@ -0,0 +1,134 @@ +--- +id: push +title: Push Changes to Git Repo +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Once the GitSync feature is configured, you can start pushing changes to the git repository on following points: + +- [App Creation](#app-creation) +- [Manual Commit Using GitSync Button](#manual-commit-using-gitsync-button) +- [Auto Commit on App Rename](#auto-commit-on-app-rename) +- [App Version Update](#app-version-update) +- [Auto Commit on Promoting Environment](#auto-commit-on-promoting-environment) +- [App Deletion](#app-deletion) + +## App Creation + +Whenever you create a new app, you will see an option to select the **Commit changes**. If you select the **commit changes** option, the changes will be committed to the git repository. + +**Note**: If the app name is same as the name of an existing app in the git repo, it will overwrite the existing app in the git repo. + +GitLab SSH Key + +Selecting the **Commit changes** option will create a new commit in the git repository. The commit message will be `App creation` and the author will be the user who created the app. + +During app creation, a **.meta** folder is generated, containing a **meta.json** file with details of the last commit. Then, an app folder is also created, storing **v1.json**, which holds app-specific details of v1 version. + + + + + + GitSync + + + + + + GitSync + + + + + +## Manual Commit Using GitSync Button + +Whenever a user makes a change in an app, they can make a commit to the git repository by following these steps: + +1. After making the changes, click on the **GitSync** button on the topbar. + GitSync Button + +2. On clicking the **GitSync** button, a modal will open with the option to enter the commit message. + GitSync Commit Message + +3. Enter the commit message and click on the **Commit changes** button to commit the changes to the git repository. + +Along with the commit message, the user can also see the connected **Git repo URL** and the last commit details. **Last commit details** helps the user to know the last commit message, author, date, and time. This helps the user to know the last commit details and make the commit message accordingly. + +Once the changes are committed, the user can see the commit message, author, and date in the git repository. + + + + + + GitSync + + + + + + GitSync + + + + + +## Auto Commit on App Rename + +Whenever an app is renamed, the changes will be automatically committed to the git repository. The commit message will be `App is renamed` and the author will be the user who renamed the app. Similarly an auto commit is generated whenever the version is renamed. + + + + + + GitSync + + + + + + GitSync + + + + + +## App Version Update + +Whenever a user creates a new version of an app, there will be an option to select **Commit changes**. If the user selects **commit changes** option, the new version of the app will be committed to the git repository and the old version will be overridden. + +GitLab SSH Key + +The **JSON** file in the app folder will be replaced with the new version of the app, the **meta.json** file in the **.meta** folder gets updated with the new version id and version name. The commit message will be **Version creation** and the author will be the user who created the new version of the app. + + + + + + GitSync + + + + + + GitSync + + + + + +## Auto Commit on Promoting Environment + +When you promote an environment, from **Development to Staging**, the changes will be automatically committed to the git repository. The commit message will be ` Version of promoted from to `. The author will be the user who promoted the environment. When you promote an environment, from **Staging to Production**, no changes will be committed to the git repository. + +GitSync + +This option can be enabled or disabled from the **Configure git** tab on the **Workspace settings** page. By default, this option is disabled. + +GitSync + +## App Deletion + +Whenever a user delete an app from the workspace, the app will not be deleted from the git repository. The app will be available in the git repository in the same state as it was before the app was deleted. diff --git a/docs/docs/development-lifecycle/gitsync/ssh-config.md b/docs/docs/development-lifecycle/gitsync/ssh-config.md new file mode 100644 index 0000000000..7968b77f3f --- /dev/null +++ b/docs/docs/development-lifecycle/gitsync/ssh-config.md @@ -0,0 +1,119 @@ +--- +id: ssh-config +title: SSH Configuration for Git Repo Manager +--- + +To configure a Git Manager with ToolJet using GitSync, you need the SSH URL from the Git Manager and then deploy the SSH key generated by ToolJet. You can use any Git Manager (cloud-based or self-hosted) that follows standard Git protocols. In this guide, we will cover the configuration for GitHub, GitLab, and Gitea. + +## Generating SSH URL + +### GitHub + +1. **Create a New Repository**
    + Create a new repository on your GitHub. The repository can be public or private. You can also use an existing repository. Make sure that the repository is empty and the default branch name should be **master**. + GitSync + +2. **Obtain the SSH URL**
    + When a repository is created, GitHub shows a screen with the SSH URL. + GitSync + + OR + + If you are using an existing repository, then you can obtain the URL by clicking on the **Code** button. + GitSync + +### GitLab + +1. **Create a New Repository**
    + Create a new repository on your GitLab. The repository can be public or private. You can also use an existing repository. Make sure that the repository is empty and the default branch name should be **master**. + GitSync + +2. **Obtain the SSH URL**
    + On GitLab, you can obtain the URL by clicking on the **Clone** button and selecting the **SSH** option. + GitSync + +### Gitea + +1. **Create a New Repository**
    + Create a new repository on your Gitea. You can also use an existing repository. Make sure that the repository is empty and the default branch name should be **master**. + GitSync + +2. **Obtain the SSH URL**
    + When a repository is created, Gitea shows a screen with the SSH URL. + GitSync + + +## Deploy the SSH Key + +### GitHub + +1. Go to the **Settings** tab of the GitHub repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. + GitSync + +2. Enter a title for the SSH key in the **Title** field. + +3. Paste the SSH key generated from the ToolJet. + +4. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). + +5. Finally, click on the **Add key** button. + GitSync + +### GitLab + +You have two options for adding the SSH key to GitLab, you can either add it globally to access all your repositories or deploy it for a specific repository. + +#### Option 1: Add as a User-Wide SSH Key + +Use this option for access to all your repositories. + +1. Click on your avatar in the top-left corner and select **Edit Profile**. + +2. Navigate to the **SSH Keys** tab and click the **Add new key** button. + GitLab SSH Key + +3. In the **Key** field, paste the SSH key you generated from the ToolJet. + +4. Give your key a descriptive title. + +5. Set **Usage type** to **Authentication & signing**. + +6. Optionally, set an expiration date. + +7. Click **Add key** to save. + GitLab SSH Key + +#### Option 2: Add as a Deploy Key + +Use this option for access to a specific repository only. + +1. Navigate to the repository you want to add the key to. + +2. Click on the **Settings** tab and select **Repository**. + +3. Once you are in the **Repository Settings**, expand the **Deploy Keys** section. + +4. Click on the **Add new deploy key** button. + +5. Give your key a descriptive title. + +6. In the **Key** field, paste the SSH key you generated in ToolJet's Configure Git tab during the previous step. + +7. Enable the **Grant write permissions to this key** checkbox. We need this permission to push changes to the repository. + +8. Click **Add key** to save. + GitLab Deploy Key + +### Gitea + +1. Go to the **Settings** tab of the Gitea repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. + GitSync + +2. Enter a title for the SSH key in the **Title** field. + +3. Paste the SSH key generated from the ToolJet. + +4. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). + +5. Finally, click on the **Add Deploy key** button. + GitSync diff --git a/docs/docs/development-lifecycle/overview.md b/docs/docs/development-lifecycle/overview.md new file mode 100644 index 0000000000..334eda3073 --- /dev/null +++ b/docs/docs/development-lifecycle/overview.md @@ -0,0 +1,27 @@ +--- +id: overview +title: Overview +--- + +This guide outlines the development life cycle for ToolJet deployments, explaining its importance and how ToolJet manages it efficiently. + +A development life cycle (also known as the software development life cycle or SDLC) is a structured framework that ensures software is built, deployed, and maintained efficiently. It helps teams manage changes, collaborate effectively, and maintain stability in production environments. A well-defined development life cycle enhances software quality, improves efficiency, facilitates better collaboration between teams, reduces costs by catching issues early, and ensures long-term maintainability. + +## Development Life Cycle in ToolJet + +ToolJet enables teams to manage application changes and deployments effectively through its Environment and Version Management system. Key aspects of managing the development life cycle in ToolJet include: + +### Release Management + +Using ToolJet's release management, you can create multiple **[versions](/docs/development-lifecycle/release/version-control)** of your application and easily **[release](/docs/development-lifecycle/release/release-rollback)** the latest version with new features, fixes, and enhancements. ToolJet also enables you to **[roll back](#)** to a previous stable version if needed. Additionally, ToolJet lets you **[share your application](/docs/development-lifecycle/release/share-app)** in multiple ways. + +### GitSync + +In ToolJet, you can use **[GitSync](/docs/development-lifecycle/gitsync/overview)** to maintain a history and **[backup](/docs/development-lifecycle/backup/gitsync-backup)** of your application. By integrating with Git repositories, you can ensure that your application remains secure, organized, and easily manageable over time. + +### Environment Management +ToolJet comes with three predefined environments: **development, staging, and production**. These environments apply to applications, data sources, and constants, ensuring controlled testing before deployment.For more details, refer to the [Environments Documentation](/docs/development-lifecycle/environment/self-hosted/multi-environment) + + +### Multi-Instance Environments +You can deploy multiple ToolJet instances where each acts as a different environment. This setup isolates all resources as well as users across the instances. For more details, refer to the [Multi-Instance Environments](/docs/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment) Documentation. \ No newline at end of file diff --git a/docs/docs/development-lifecycle/release/release-rollback.md b/docs/docs/development-lifecycle/release/release-rollback.md new file mode 100644 index 0000000000..caacf1e544 --- /dev/null +++ b/docs/docs/development-lifecycle/release/release-rollback.md @@ -0,0 +1,39 @@ +--- +id: release-rollback +title: Release and Rollback +--- + +ToolJet allows you to **[release and share](#release)** your application and **[rollback](#rollback)** to a stable version whenever needed. + +## Release + +Releasing an app in ToolJet makes the selected version available to end users, allowing them to access and use the application for their tasks. This ensures a controlled rollout of features and bug fixes while ensuring that users have access to the latest version of the app. After an application is released it can be accessed in multiple ways, refer to **[Share an Application](/docs/development-lifecycle/release/share-app)** guide for more information. + +### Steps to Release an App + +1. Promote the required version to the **[production environment](/docs/development-lifecycle/environment/self-hosted/multi-environment)**. + +2. Click on the Release button at the top-right corner. + release + +3. A confirmation dialog will popup that prompts you to decide whether to release the current version of the app. Clicking on the **Release** button will release the current version of the app. + release + +## Rollback + +The Rollback feature in ToolJet allows you to revert to a previously stable version of your app whenever needed. Whether fixing bugs, resolving errors, or addressing unexpected issues after a release, rollback ensures minimal disruption to end users. It instantly restores a prior version while keeping the application's URL the same, allowing the team to maintain application stability while debugging the faulty version offline. + +For example, after releasing a new version v1.2.0, users report failures of the form component. Using ToolJet’s version rollback, the team can quickly rollback to the stable version v1.1.0, restoring functionality within minutes. This minimizes downtime, and allows developers to debug the faulty version offline. + +### Steps to Rollback + +1. Go to the **App Version Manager** from the toolbar and click on the dropdown. It will display all the available versions of the app. The released version name will be in green color. + app version + +2. Choose the desired stable version from the dropdown. + +3. Click on the Release button at the top-right corner. + release + +4. A confirmation dialog will popup that prompts you to decide whether to release the current version of the app. Clicking on the **Release** button will release the current version of the app. + release diff --git a/docs/docs/development-lifecycle/release/share-app.md b/docs/docs/development-lifecycle/release/share-app.md new file mode 100644 index 0000000000..eefc5d6c1c --- /dev/null +++ b/docs/docs/development-lifecycle/release/share-app.md @@ -0,0 +1,30 @@ +--- +id: share-app +title: Share Application +--- + +Once the application is released, it can be shared with the end users in multiple ways, including via a direct URL, through the ToolJet dashboard, or by embedding it into another application. + +## Share Application via URL + +Once the application is released, it can be accessed via a URL, and the URL slug can be customized. ToolJet also provides an option to make the application public or private. + +- **Public Application**: Allows anyone on the internet to access the application without signing up for ToolJet. +- **Private Application**: Private applications are restricted to workspace users with the necessary **[access permissions](/docs/user-management/role-based-access/access-control)**. + +The latest released version of the application is always accessible through the same URL, ensuring a consistent access point across updates. + +Share Application Modal + +## Access Application via Dashboard + +Users can launch the released version of the application from the dashboard. The application can also be hidden from the dashboard for end users. Refer to the **[Access Control](/docs/user-management/role-based-access/access-control)** guide for more details. + +Access Application via Dashboard + +## Embed Application + +ToolJet applications can be embedded into other web applications using iframes. To embed an application, make the app public, after which ToolJet will automatically generate an iframe code snippet for integration. + +Embed application using Iframe + diff --git a/docs/docs/development-lifecycle/release/version-control.md b/docs/docs/development-lifecycle/release/version-control.md new file mode 100644 index 0000000000..b5c0320ff3 --- /dev/null +++ b/docs/docs/development-lifecycle/release/version-control.md @@ -0,0 +1,38 @@ +--- +id: version-control +title: Version Control +--- + +Version Control in ToolJet helps you to maintain multiple versions of the application, do iterative development, and deploy updates systematically. It ensures stability, and allows seamless rollout of new features or fixes. + +For example, to experiment a new feature, you can create a new version of the application and try it out, without disturbing the released application. And after through testing you can release this version. This minimizes downtime, and allows developers to experiment and debug the new feature without disrupting users. + +Each version is isolated from the others and can have different environments, such as development, staging, or production. Check out the **[Multi-Environment](/docs/development-lifecycle/environment/self-hosted/multi-environment)** guide for more information. Versions can also be used to rollback to a stable version if needed, checkout **[release and rollback](/docs/development-lifecycle/release/release-rollback)** guide for more information. + +## Creating a Version + +You can create new versions from App Version Manager in the top. It displays the current version of the app and can be used to switch between the different versions of the app. To create a new version: + +1. Go to the **App Version Manager** from the toolbar and click on the dropdown. It will display all the available versions of the app. The released version name will be in green color. + app version + +2. Click on **Create new version** button at the bottom of the dropdown and a modal will pop-up. + +3. Enter a **Version Name**. + +4. Select the **Create version from** dropdown that will include all the versions of the app, choose a version from the dropdown that you want to use for your new version or ToolJet will automatically select the last created version. + +5. Click on **Create new version** button to add a new version. + modal + +## Renaming a Version + +To change the name of an app version, navigate to the version manager and select the version you wish to rename. From there, you can click on the rename icon located beside the version name. This will open a modal where you can modify the version name to your desired choice. + +version dropdown + +## Deleting a Version + +To remove an app version, go to the version manager and locate the version you wish to delete from the dropdown menu. Next to the version, you will find a delete icon. Click on it to delete the version. Released version cannot be deleted. + +version dropdown diff --git a/docs/docs/doc-home-page.mdx b/docs/docs/doc-home-page.mdx new file mode 100644 index 0000000000..eeb88f4018 --- /dev/null +++ b/docs/docs/doc-home-page.mdx @@ -0,0 +1,343 @@ +--- +description: Home Page +hide_table_of_contents: true +sidebar_label: Home +title: Home +slug: / +--- + +import './homepage.css'; +import { ArrowRight } from 'lucide-react'; +import gettingStartedImage from '../src/pages/getting-started.png'; +import { + textLabels, + featureCards, + setupCards, + deployOptions, + dataCards, + organizationCards, + releaseCards, + resourceCards, + sectionCards +} from './homePageData'; +import Link from '@docusaurus/Link'; + +{/* // Reusable components */} +export const Card = ({ className = '', href, children }) => { + const cardContent = ( +
    +
    +
    +
    + {children} +
    +
    + ); + + return href ? ( + + {cardContent} + + ) : cardContent; +}; + +export const CardHeader = ({ className = '', children }) => ( +
    + {children} +
    +); + +export const CardContent = ({ className = '', children }) => ( +
    + {children} +
    +); + +export const CardTitle = ({ className = '', children }) => ( +

    + {children} +

    +); + +export const Button = ({ + variant = "default", + className = '', + children, +}) => { + const baseStyles = "cursor-pointer inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background"; + const variantStyles = { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + outline: "border border-input hover:bg-accent hover:text-accent-foreground", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary border-none", + }; + + return ( +
    + +
    + ); +}; + +export const IconCard = ({ icon: Icon, title, content, color, href }) => ( + +
    + +
    + +
    + {title} +
    + +

    {content}

    +
    +
    +
    +); + +export const SmallCard = ({ icon: Icon, title, href }) => ( + +
    +
    +
    + +
    + {title} +
    +
    +
    +); + +export const SectionContainer = ({ title, description, children }) => ( +
    +

    {title}

    +

    {description}

    + {children} +
    +); + +{/* // Main component */} + +# +
    +
    +
    +
    + + {/* Background shapes */} +
    + {/* Child component 1 */} +
    + {/* Child component 2 */} +
    + {/* Child component 3 */} +
    +
    +{/* ToolJet Documentation Section */} +
    +
    +

    + {textLabels.title.prefix} {textLabels.title.highlight} +

    +

    + {textLabels.subtitle} +

    +
    + +
    + {featureCards.map((card, index) => ( + + ))} +
    + + {/* Getting Started Section */} + +
    + {/* Hover Gradient Overlay */} +
    + + {/* Image Container */} +
    + Getting Started +
    + + {/* Text Container */} +
    +

    + {sectionCards.gettingStarted.title} +

    +

    + {sectionCards.gettingStarted.description} +

    +
    +
    + + + +
    +
    + +
    + {/* Setup ToolJet Section */} + +
    + {setupCards.map((card, index) => ( + + ))} +
    +
    + + {/* Deploy on Section */} + +
    + {deployOptions.map((option, index) => ( + + ))} +
    +
    + + {/* Explore more details link */} +
    + + + +
    + + {/* Bring your data to ToolJet section */} + +
    + {dataCards.map((card, index) => ( + + ))} +
    +
    + + {/* Manage your organization section */} + + +
    + {organizationCards.map((card, index) => ( + + ))} +
    +
    + + {/* Manage releases section */} + + +
    + {releaseCards.map((card, index) => ( + + ))} +
    +
    + + {/* Additional resources section */} + + +
    + {resourceCards.map((card, index) => ( + + ))} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/docs/docs/getting-started/platform-overview.md b/docs/docs/getting-started/platform-overview.md index 574ee4b397..df27034b88 100644 --- a/docs/docs/getting-started/platform-overview.md +++ b/docs/docs/getting-started/platform-overview.md @@ -1,7 +1,6 @@ --- id: platform-overview title: Platform Overview -slug: / ---
    @@ -15,9 +14,9 @@ ToolJet is a low-code platform that enables developers to rapidly build and depl ## How ToolJet Works: -
    - Platform Overview -
    + +Platform Overview + **With ToolJet, you can streamline app development with 4 core steps:**
    diff --git a/docs/docs/getting-started/quickstart-guide.md b/docs/docs/getting-started/quickstart-guide.md index 75fd7560b4..134845be9f 100644 --- a/docs/docs/getting-started/quickstart-guide.md +++ b/docs/docs/getting-started/quickstart-guide.md @@ -21,7 +21,7 @@ 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.com/signup)** account and follow the steps below. +To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and follow the steps below.
    diff --git a/docs/docs/gitsync.md b/docs/docs/gitsync.md deleted file mode 100644 index 5a417ffb3e..0000000000 --- a/docs/docs/gitsync.md +++ /dev/null @@ -1,379 +0,0 @@ ---- -id: gitsync -title: GitSync ---- - -import Tabs from '@theme/Tabs'; -import TabItem from '@theme/TabItem'; - -
    Available on: Paid plans
    - - -The GitSync feature enables synchronization of workspace applications with a git repository, streamlining application management and version control on ToolJet. - -
    - -## Overview - -ToolJet applications can be synchronized with a Git repository, offering the flexibility to tailor your application development and deployment processes across various environments while aligning with best practices for the application development lifecycle. - -#### Key Use-Cases - -**Backup of Apps** - -GitSync provides a straightforward solution for creating backups of your applications. By pushing changes to a Git repository, users can ensure a secure and versioned history of their application. This serves as a reliable backup mechanism, safeguarding against accidental application/version deletion or corruption. - -**Environment Migration** - -Facilitating the movement of applications across different ToolJet deployments (e.g., from development to staging to production), GitSync acts as a pivotal tool for environment migration. Users can effortlessly transfer their applications across environments by pushing changes to a Git repository. - -GitSync - -
    - -
    - -## Setting up GitSync - -:::info -- ToolJet support git repo managers like GitHub, GitLab, Bitbucket, AWS CodeCommit, and Azure Repos. -- Only Admins have the permission to configure the GitSync feature on workspace level. -- The default branch name for the git repository should be **master**. -::: - -### 1. Create a New Repository - -Create a new repository on your git repo manager. The repository can be public or private. You can also use an existing repository. **Make sure that the repository is empty.** - - - - - - GitSync - - - - - - GitSync - - - - - -### 2. Obtain the Repository URL - -Obtain the **SSH URL** of your repository. - - - - - - When a repository is created, GitHub shows a screen with the repository URL. If the repository is already created, you can obtain the URL by clicking on the **Clone or download** button. - GitSync - - - - - - On GitLab, you can obtain the URL by clicking on the **Clone** button and selecting the **SSH** option. - GitSync - - - - - -### 3. Configure the GitSync Feature on ToolJet - - 1. Go to the **Workspace settings**, and click on the **Configure git** tab. - - GitLab Repo - - 2. Enter the **SSH URL** of the repository (obtained in [Step 2](#2-obtain-the-repository-url)) in the **Git repo URL** field. - 3. Click on the **Generate SSH key** button, and copy the SSH key that is generated. The SSH key is used to authenticate ToolJet with the repository. - - GitSync - - There are two types of generated SSH keys: - - **ED25519**: This is a secure and efficient algorithm that is used for generating SSH keys. It is recommended to use this key type. VCS providers like GitHub and GitLab recommend using this key type - - **RSA**: This is an older algorithm that is used for generating SSH keys. It is not recommended to use this key type. Older VCS providers like Bitbucket recommend using this key type. - - GitSync - -### 4. Deploy the SSH Key - - - - - - Follow the following steps to deploy the SSH key to GitHub Repository: - - 1. Go to the **Settings** tab of the GitHub repository that you created in [Step 1](#1-create-a-new-repository), and click on the **Deploy keys** tab. Click on the **Add deploy key** button. - - GitSync - - 2. Enter a title for the SSH key in the **Title** field. - 3. Paste the SSH key that you copied in [Step 3](#3-configure-the-gitsync-feature-on-tooljet) in the **Key** field. - 4. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](#pushing-changes-to-git-repo). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](#pulling-changes-from-git-repo). - 5. Finally, click on the **Add key** button. - - GitSync - - - - - - You have two options to add the SSH key to GitLab, depending on your needs: - - #### Option 1: Add as a User-Wide SSH Key - - Use this option for access to all your repositories. - - 1. Click on your avatar in the top-left corner and select **Edit Profile**. - 2. Navigate to the **SSH Keys** tab and click the **Add new key** button. - - GitLab SSH Key - - 3. In the **Key** field, paste the SSH key you generated in [Step 3](#3-configure-the-gitsync-feature-on-tooljet). - 4. Give your key a descriptive title. - 5. Set **Usage type** to **Authentication & signing**. - 6. Optionally, set an expiration date. - 7. Click **Add key** to save. - - GitLab SSH Key - - #### Option 2: Add as a Deploy Key - - Use this option for access to a specific repository only. - - 1. Navigate to the repository you want to add the key to. - 2. Click on the **Settings** tab and select **Repository**. - 3. Once you are in the **Repository Settings**, expand the **Deploy Keys** section. - 4. Click on the **Add new deploy key** button. - 5. Give your key a descriptive title. - 6. In the **Key** field, paste the SSH key you generated in ToolJet's Configure Git tab during the previous step. - 7. Enable the **Grant write permissions to this key** checkbox. We need this permission to push changes to the repository. - 8. Click **Add key** to save. - - GitLab Deploy Key - - - - - -### 5. Finish the GitSync Configuration on ToolJet - -Go back to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message. - -GitSync - -
    - -
    - -## Auto-commit on Promoting Environment - -When you promote an environment, from **Developement to Staging**, the changes will be automatically committed to the git repository. The commit message will be ` Version of promoted from to `. The author will be the user who promoted the environment. When you promote an environment, from **Staging to Production**, no changes will be committed to the git repository. - -GitSync - -This option can be enabled or disabled from the **Configure git** tab on the **Workspace settings** page. By default, this option is disabled. - -GitSync - -
    - -
    - -## Enable/Disable GitSync - -To enable or disable the GitSync feature, go to the **Configure git** tab on the **Workspace settings** page, and toggle on/off the **Connect** switch. This is only available if the GitSync feature is configured. - -#### When Enabled - -On clicking the GitSync button, the users will be able to commit changes to the git repository. - -#### When Disabled - -1. **For non-admin users**: The users will not be able to commit changes to the git repository. They will see a dialogue box that the GitSync feature is not configured and they need to contact the admin to configure it. -2. **For admin users**: The users will see a dialogue box with a link to configure the GitSync feature. - -GitSync - -
    - -
    - -## Delete GitSync Configuration - -To delete the GitSync configuration, go to the **Configure git** tab on the **Workspace settings** page, and click on the **Delete configuration** button. This will delete the SSH key from the ToolJet configuration and the GitSync feature will be disabled. - -**Note:** Deleting the GitSync configuration will not delete the apps from the git repository. The apps will still be available in the git repository in the same state as they were before the GitSync configuration was deleted. - -GitSync - -
    - -
    - -## Git Repo - -Once the initial commit is made, you can see the app files in the git repository. The repository will have the individual app folders and a **.meta** folder. The app folders will be named as the app name and will have the respective **JSON** file of the application. The **.meta** folder will have the **meta.json** file that contains the meta information of each application synced to git repo. - -The **meta.json** file holds information about apps such as the **App name**, **last commit message**, **last commit user**, **last commit date**, **version name**, and **version id**. - - - - - - GitSync - - - - - - GitSync - - - - - -
    - -
    - -## Pushing Changes to Git Repo - -Once the GitSync feature is configured, you can start pushing changes to the git repository. - -#### App Creation - -When you create a new app, you will see an option to select the **Commit changes**. If you select the **commit changes** option, the changes will be committed to the git repository. - -:::info -If the app name is same as the name of the existing app in the git repo, it will overwrite the existing app in the git repo. -::: - -GitLab SSH Key - -Selecting the **Commit changes** option will create a new commit in the git repository. The commit message will be `App creation` and the author will be the user who created the app. - - - - - - GitSync - - - - - - GitSync - - - - - -#### App Rename - -Whenever an app is renamed, the changes will be automatically committed to the git repository. The commit message will be `App is renamed` and the author will be the user who renamed the app. - - - - - - GitSync - - - - - - GitSync - - - - - -#### App Updates - -Whenever a user makes a change in an app, they can make a commit to the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to enter the commit message. The user can enter the commit message and click on the **Commit changes** button to commit the changes to the git repository. Along with the commit message, the user can also see the connnected **Git repo URL** and the **last commit details**. - -**Last commit details** helps the user to know the last commit message, author, date, and time. This helps the user to know the last commit details and make the commit message accordingly. - -GitLab SSH Key - -Once the changes are committed, the user can see the commit message, author, and date in the git repository. - - - - - - GitSync - - - - - - GitSync - - - - - -#### App Deletion - -Whenever a user deleted an app from the workspace, the app will not be deleted from the git repository. The app will be available in the git repository in the same state as it was before the app was deleted. - -#### App Version Update - -When a user creates a new version of an app, there will be an option to select the **Commit changes**. If you select the **commit changes** option, the new version of the app will be committed to the git repository. - -GitLab SSH Key - -The **JSON** file in the app folder will be replaced with the new version of the app, the **meta.json** file in the **.meta** folder gets updated with the new version id and version name. The commit message will be `Version creation` and the author will be the user who created the new version of the app. - - - - - - GitSync - - - - - - GitSync - - - - - -
    - -
    - -## Pulling Changes from Git Repo - -You can configure the GitSync feature on another workspace to pull the changes from the git repository. To configure the GitSync feature on another workspace, follow the steps mentioned in the [Setting up GitSync](#setting-up-gitsync) section. - -Once the GitSync feature is configured, go to the ToolJet dashboard and click on the three dots on the right side of the **Create new app** button. Click on the **Import from git repository** option. - -GitSync - -On clicking the **Import from git repository** option, a modal will open with the dropdown to select the app to be imported from the git repository. Once the app is selected, the app name and the last commit will be displayed. Click on the **Import app** button to import the app from the git repository. - -:::caution -- The app imported from the git repository cannot be edited. -- The app imported from the Git repository should have a unique name. If the app's name is the same as that of an existing app in the workspace, the user will need to either rename the existing app or delete it to successfully import another app with the same name. -- Workspace constants are not synced with the git repository. After pulling the app, if the app throws an error, the user will need to manually add the workspace constants. -::: - -GitSync - -#### Checking for Updates - -You can check for updates in the git repository by clicking on the **GitSync** button on the topbar. On clicking the **GitSync** button, a modal will open with the option to **Check for updates**. Click on the **Check for updates** button to check for updates in the git repository. If there are any updates, you will see the details of the updates such as commit message, author, and the date in the modal. Click on the **Pull changes** button to pull the changes from the git repository. - -GitSync - -
    diff --git a/docs/docs/homePageData.js b/docs/docs/homePageData.js new file mode 100644 index 0000000000..52e8db770a --- /dev/null +++ b/docs/docs/homePageData.js @@ -0,0 +1,219 @@ +import { + BrainCircuit, Grid3x3, Database, Workflow, Cog, Target, Scale, + Layers, FileSpreadsheet, Folder, Wand2, LayoutDashboard, Users, UserCheck, + Lock, UserPlus, ScrollText, Megaphone, Gem, Mail, GitBranch, + Box, GitMerge, ShoppingBag, Wand, Flag, ShieldCheck, Cloud, Container, Boxes, Server, Telescope, Globe +} from 'lucide-react'; + +export const featureCards = [ + { + icon: BrainCircuit, + title: "Build with AI", + color: "text-blue-500", + content: "Build applications effortlessly using natural language to generate and customize apps.", + href: "/docs/beta/build-with-ai/overview" + }, + { + icon: Grid3x3, + title: "App Builder", + color: "text-blue-500", + content: "Design and create applications with ToolJet's intuitive app builder, featuring a drag-and-drop interface and powerful pre-built components to streamline development.", + href: "/docs/beta/app-builder/overview" + }, + { + icon: Database, + title: "ToolJet Database", + color: "text-blue-500", + content: "Powered by PostgreSQL, offering a user-friendly UI editor. ToolJet Database allows you to manage, edit, and interact with your data directly within the platform.", + href: "/docs/beta/tooljet-db/tooljet-database" + }, + { + icon: Workflow, + title: "Workflows", + color: "text-blue-500", + content: "Automate processes and define workflows with precision, allowing your apps to handle tasks intelligently.", + href: "/docs/beta/workflows/overview" + } +]; + +export const setupCards = [ + { + icon: Cog, + title: "Try ToolJet", + color: "text-blue-500", + content: "Get started with ToolJet in under 2 minutes by running it with Docker. Experience a seamless setup and explore the full capabilities of ToolJet.", + href: "/docs/beta/setup/try-tooljet" + }, + { + icon: Cog, + title: "System Requirements", + color: "text-blue-500", + content: "Ensure your system meets the requirements for running ToolJet. Check hardware and software specifications to get the best performance.", + href: "/docs/beta/setup/system-requirements" + }, + { + icon: Target, + title: "Choose Your ToolJet", + color: "text-blue-500", + content: "Discover the ideal ToolJet version for your development needs. Choose between our LTS versions or explore Pre-Release versions.", + href: "/docs/beta/setup/choose-your-tooljet/" + }, + { + icon: Scale, + title: "Upgrade to LTS", + color: "text-blue-500", + content: "Upgrade to the Long Term Support (LTS) version of ToolJet for extended support, stability, and access to critical updates.", + href: "/docs/beta/setup/upgrade-to-lts" + } +]; + +export const deployOptions = [ + { icon: Cloud, title: "DigitalOcean", href: "/docs/beta/setup/digitalocean" }, + { icon: Container, title: "Docker", href: "/docs/beta/setup/docker" }, + { icon: Server, title: "AWS EC2", href: "/docs/beta/setup/ec2" }, + { icon: Server, title: "AWS ECS", href: "/docs/beta/setup/ecs" }, + { icon: Server, title: "Openshift", href: "/docs/beta/setup/openshift" }, + { icon: Telescope, title: "Helm", href: "/docs/beta/setup/helm" }, + { icon: Boxes, title: "Kubernetes", href: "/docs/beta/setup/kubernetes" }, + { icon: Globe, title: "Kubernetes (GKE)", href: "/docs/beta/setup/kubernetes-gke" }, + { icon: Globe, title: "Kubernetes (AKS)", href: "/docs/beta/setup/kubernetes-aks" }, + { icon: Globe, title: "Kubernetes (EKS)", href: "/docs/beta/setup/kubernetes-eks" }, + { icon: Globe, title: "Azure Container Apps", href: "/docs/beta/setup/azure-container" }, + { icon: Globe, title: "Google Cloud Run", href: "/docs/beta/setup/google-cloud-run" }, + + +]; + +export const dataCards = [ + { + icon: Layers, + title: "Overview", + color: "text-blue-500", + content: "Gain a broad understanding on connecting various data sources to ToolJet.", + href: "/docs/beta/data-sources/overview" + }, + { + icon: FileSpreadsheet, + title: "Sample Data Source", + color: "text-blue-500", + content: "Explore sample data sources to quickly integrate with ToolJet. Test features and workflows using predefined datasets.", + href: "/docs/beta/data-sources/sample-data-sources" + }, + { + icon: Folder, + title: "Data Source Library", + color: "text-blue-500", + content: "Browse ToolJet's data source library to connect with databases, APIs, and external services seamlessly.", + href: "/docs/beta/tooljet-concepts/what-are-datasources/" + }, + { + icon: Wand2, + title: "Transformation", + color: "text-blue-500", + content: "Leverage ToolJet's transformation capabilities to manipulate and format data from various sources with ease.", + href: "/docs/beta/tutorial/transformations/" + } +]; + +export const organizationCards = [ + { icon: Users, title: "Workspaces", href: "/docs/beta/tj-setup/workspaces" }, + { icon: UserCheck, title: "User authentication", href: "/docs/beta/user-management/authentication/self-hosted/overview" }, + { icon: Lock, title: "Permissions", href: "/docs/beta/user-management/role-based-access/access-control" }, + { icon: UserPlus, title: "Users and groups", href: "/docs/beta/user-management/role-based-access/user-roles" }, + { icon: ScrollText, title: "Audit logs", href: "/docs/beta/security/audit-logs" }, + { icon: Megaphone, title: "White label", href: "/docs/beta/tj-setup/org-branding/white-labeling" }, + { icon: Gem, title: "Super admin", href: "/docs/beta/user-management/role-based-access/super-admin" }, + { icon: Mail, title: "Licensing", href: "/docs/beta/tj-setup/licensing/self-hosted" } +]; + +export const releaseCards = [ + { + icon: GitBranch, + title: "Git Sync", + color: "text-blue-500", + content: "Sync your ToolJet projects with Git repositories, enabling version control and collaboration across teams.", + href: "/docs/beta/development-lifecycle/gitsync/overview" + }, + { + icon: Box, + title: "Multi-Environment", + color: "text-blue-500", + content: "Easily manage and deploy applications across multiple environments, ensuring smooth transitions between development, staging, and production.", + href: "/docs/beta/development-lifecycle/environment/self-hosted/multi-environment" + }, + { + icon: GitMerge, + title: "Versioning and Release", + color: "text-blue-500", + content: "Implement version control and release management to track changes, roll back updates, and maintain stable app deployments.", + href: "/docs/beta/development-lifecycle/release/version-control" + } +]; + +export const resourceCards = [ + { + icon: ShoppingBag, + title: "Marketplace", + color: "text-blue-500", + content: "Discover a variety of plugins, extensions and integrations in ToolJet's marketplace to enhance your app-building experience.", + href: "/docs/beta/marketplace/marketplace-overview" + }, + { + icon: Flag, + title: "Tracking", + color: "text-blue-5000", + content: "ToolJet ensures privacy by acting as a proxy, never storing data, and offers anonymous tracking with feature controls.", + href: "/docs/beta/tracking" + }, + { + icon: ShieldCheck, + title: "Security", + color: "text-blue-500", + content: "ToolJet ensures data security with SOC 2 compliance, encryption, and secure credential handling, never storing your data.", + href: "/docs/beta/security/compliance" + } +]; + +export const textLabels = { + title: { + prefix: "ToolJet", + highlight: "Documentation" + }, + subtitle: "Learn how to get up and running with ToolJet", + gettingStarted: { + title: "Getting Started", + description: "Discover how to create and publish apps within minutes" + }, + setupToolJet: { + title: "Setup ToolJet", + description: "Learn about the different methods you can use to deploy ToolJet" + }, + deployOn: { + title: "Deployment" + }, + exploreMore: "Explore more", + bringData: { + title: "Bring your data to ToolJet", + description: "Learn how to connect your data sources to ToolJet" + }, + manageOrganization: { + title: "Manage your organization", + description: "Learn how to secure your apps and manage user authentication in ToolJet." + }, + manageReleases: { + title: "Manage releases", + description: "Learn how you can efficiently control the release cycle in ToolJet" + }, + additionalResources: { + title: "Additional resources", + description: "Learn more about Marketplace Plugins, ToolJet Copilot, App Performance, and Security." + } +}; + +export const sectionCards = { + gettingStarted: { + title: "Getting Started", + description: "Discover how to create and publish apps within minutes", + link: "/docs/beta/getting-started/quickstart-guide", + } +}; \ No newline at end of file diff --git a/docs/docs/homepage.css b/docs/docs/homepage.css new file mode 100644 index 0000000000..bd6213e1df --- /dev/null +++ b/docs/docs/homepage.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/docs/docs/how-to/access-users-location.md b/docs/docs/how-to/access-users-location.md index c97ecd5a1b..1341dea5ef 100644 --- a/docs/docs/how-to/access-users-location.md +++ b/docs/docs/how-to/access-users-location.md @@ -17,7 +17,7 @@ To uphold user privacy, the Geolocation API requests permission before locating How to: Access User's Location
    -2. In the app editor, navigate to the query panel at the bottom and create a **[RunJS query](/docs/data-sources/run-js/#runjs-query-examples)** by selecting **Run JavaScript Code** as the datasource: +2. In the app editor, navigate to the query panel at the bottom and create a **[RunJS query](/docs/data-sources/run-js/#runjs-example-queries)** by selecting **Run JavaScript Code** as the datasource:
    How to: Access User's Location
    diff --git a/docs/docs/how-to/display-listview-record-new-page.md b/docs/docs/how-to/display-listview-record-new-page.md new file mode 100644 index 0000000000..55f9b3a656 --- /dev/null +++ b/docs/docs/how-to/display-listview-record-new-page.md @@ -0,0 +1,61 @@ +--- +id: display-listview-record-on-new-page +title: Display Listview Record Details on a New Page +--- + +This guide explains how to display details of a selected record from a **Listview** component on a different page in ToolJet. + +
    + +## Build the App + +1. Drag a **Listview** component and setup other required components. +Build the app +2. Add another page in the application. +Add a new page +3. Setup the second page with required fields and components. +Setup the second page + +
    + +
    + +## Setting up Event Handlers + +Add a new event handler to the **Listview** component with the following configurations: +- Event: **Record Clicked** +- Action: **Set variable** +- Key: **selectedEmp** *(Enter your desired variable name.)* +- Value: + ```json + {{[{ + name: components.listview1.selectedRecord.text17.text, + designation: components.listview1.selectedRecord.text15.text, + department: components.listview1.selectedRecord.text14.text + }]}} + ``` + +This event will save the record value in the specified variable, which can be accessed on another page. + +Add event handler to set variables + +Create one more event and configure it with the following settings to switch the page when a record is clicked: + - Event: **Record Clicked** + - Action: **Switch page** + - Page: **Employee Details** *(Select your desired page from the dropdown.)* + +This event will switch the page whenever a record is clicked. + +Add event handler to switch page + +
    + +
    + +## Displaying Info on Another Page + +Now, you can reference the values stored in the variables from the previous page. For instance, you can set the default value of the **Text input** component using `{{variables.selectedEmp[0].name}}`. + +Display data on the new page + +
    \ No newline at end of file diff --git a/docs/docs/how-to/pass-values-in-rest-api.md b/docs/docs/how-to/pass-values-in-rest-api.md index bdc8b47f46..a371f9b3cd 100644 --- a/docs/docs/how-to/pass-values-in-rest-api.md +++ b/docs/docs/how-to/pass-values-in-rest-api.md @@ -51,5 +51,5 @@ 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: -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/)** \ No newline at end of file +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 diff --git a/docs/docs/how-to/setup-syslog.md b/docs/docs/how-to/setup-syslog.md index 778c7623a1..6c6cdd3993 100644 --- a/docs/docs/how-to/setup-syslog.md +++ b/docs/docs/how-to/setup-syslog.md @@ -63,7 +63,7 @@ The **log file** serves as a comprehensive record of audit logs, capturing cruci The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata. -
    +
    Example Log file data ```bash diff --git a/docs/docs/how-to/use-axios.md b/docs/docs/how-to/use-axios.md index 87efa06d47..4ac9556aae 100644 --- a/docs/docs/how-to/use-axios.md +++ b/docs/docs/how-to/use-axios.md @@ -62,7 +62,7 @@ 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.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**. +**[Build GitHub star history tracker](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
    \ No newline at end of file diff --git a/docs/docs/how-to/use-custom-parameters.md b/docs/docs/how-to/use-custom-parameters.md index a0b0bd9c20..369bb32ef4 100644 --- a/docs/docs/how-to/use-custom-parameters.md +++ b/docs/docs/how-to/use-custom-parameters.md @@ -91,7 +91,7 @@ In this example, we will demonstrate how to use custom parameters in a query by 3. **Execute the REST API query and observe the new row created in the ToolJetDB table.** -**Note:** You can also use parameters in JavaScript queries. Learn more about [JS Query Parameter](/docs/data-sources/run-js/#js-parameters). +**Note:** You can also use parameters in JavaScript queries. Learn more about [JS Query Parameter](/docs/data-sources/run-js/#parameters-in-run-javascript-code).
    How to: use custom parameters diff --git a/docs/docs/how-to/use-inspector.md b/docs/docs/how-to/use-inspector.md index 3d9dc85be6..62aa7f43c8 100644 --- a/docs/docs/how-to/use-inspector.md +++ b/docs/docs/how-to/use-inspector.md @@ -83,7 +83,7 @@ Page lets you view page-specific properties like page name, handle and variables ### Constants -Under **[Constants](/docs/org-management/workspaces/workspace_constants/)**, you can find the predefined values (usually tokens/secret keys/API keys) that can be used across your application to maintain consistency and facilitate easy updates. +Under **[Constants](/docs/security/constants/)**, you can find the predefined values (usually tokens/secret keys/API keys) that can be used across your application to maintain consistency and facilitate easy updates. :::info The **environment** and **mode** variables are only available in **ToolJet Enterprise Edition v2.2.3** and above. diff --git a/docs/docs/marketplace/marketplace_overview.md b/docs/docs/marketplace/marketplace_overview.md index de2b16d442..e32c2bb7dc 100644 --- a/docs/docs/marketplace/marketplace_overview.md +++ b/docs/docs/marketplace/marketplace_overview.md @@ -73,22 +73,32 @@ To remove a plugin, follow these steps: - On the `Installed` page, click on the `Remove` button of the related plugin that you wish to remove. ## Available Plugins -- **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-redshift)** +- **[Anthropic](/docs/marketplace/plugins/marketplace-plugin-anthropic)** +- **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-awsredshift)** - **[AWS Textract](/docs/marketplace/plugins/marketplace-plugin-textract)** - **[AWS Lambda](/docs/marketplace/plugins/marketplace-plugin-aws-lambda)** +- **[Cohere](/docs/marketplace/plugins/marketplace-plugin-cohere)** - **[Engagespot](/docs/marketplace/plugins/marketplace-plugin-engagespot)** +- **[Gemini](/docs/marketplace/plugins/marketplace-plugin-gemini)** - **[GitHub](/docs/marketplace/plugins/marketplace-plugin-github)** - **[HarperDB](/docs/marketplace/plugins/marketplace-plugin-harperdb)** +- **[Hugging Face](/docs/marketplace/plugins/marketplace-plugin-hugging_face)** - **[Jira](/docs/marketplace/plugins/marketplace-plugin-jira)** +- **[Mistral AI](/docs/marketplace/plugins/marketplace-plugin-mistral_ai)** - **[OpenAI](/docs/marketplace/plugins/marketplace-plugin-openai)** +- **[Pinecone](/docs/marketplace/plugins/marketplace-plugin-pinecone)** - **[Plivo](/docs/marketplace/plugins/marketplace-plugin-plivo)** - **[Pocketbase](/docs/marketplace/plugins/marketplace-plugin-pocketbase)** - **[Portkey](/docs/marketplace/plugins/marketplace-plugin-portkey)** -- **[PrestoDB](/docs/marketplace/plugins/marketplace-plugin-prestodb)** +- **[PrestoDB](/docs/marketplace/plugins/marketplace-plugin-Presto)** +- **[Qdrant](/docs/marketplace/plugins/marketplace-plugin-qdrant)** - **[Salesforce](/docs/marketplace/plugins/marketplace-plugin-salesforce)** +- **[Sharepoint](/docs/marketplace/plugins/marketplace-plugin-sharepoint)** - **[Supabase](/docs/marketplace/plugins/marketplace-plugin-supabase)** +- **[Weaviate](/docs/marketplace/plugins/marketplace-plugin-weaviate)** + :::info For Plugin Developers Refer to the **[Plugin Development guide](/docs/contributing-guide/marketplace/marketplace-setup)** to learn how to create plugins for the ToolJet Marketplace. ::: -
    \ No newline at end of file + diff --git a/docs/docs/marketplace/plugins/amazon-redshift.md b/docs/docs/marketplace/plugins/amazon-redshift.md index 9d31d3ddcd..c3681fa367 100644 --- a/docs/docs/marketplace/plugins/amazon-redshift.md +++ b/docs/docs/marketplace/plugins/amazon-redshift.md @@ -1,5 +1,5 @@ --- -id: marketplace-plugin-redshift +id: marketplace-plugin-awsredshift title: Amazon Redshift --- diff --git a/docs/docs/marketplace/plugins/anthropic.md b/docs/docs/marketplace/plugins/anthropic.md new file mode 100644 index 0000000000..431a0f5f69 --- /dev/null +++ b/docs/docs/marketplace/plugins/anthropic.md @@ -0,0 +1,53 @@ +--- +id: marketplace-plugin-anthropic +title: Anthropic +--- + +Integrating Anthropic with ToolJet enables the creation of interactive chatbots that analyze past messages to generate context-aware responses. These bots can also be customized with defined roles, making them suitable for tasks such as customer support, serving as virtual assistants, or enabling personalized conversations. + +## Connection + +To connect with Anthropic, you will need the **API Key**, which can be generated from **[Anthropic Console](https://console.anthropic.com/)**. + +Anthropic Configuration + +## Supported Operations + +### Chat + +This operation processes the user's input and generates appropriate, context-aware responses, simulating a natural, human-like conversation. It can handle multiple interactions while maintaining the flow of dialogue, enabling dynamic and engaging conversations. + +**Required Parameters** + +- **Model**: The model to use for generating the chat response. The available models are: + - claude-3-5-sonnet-20241022 + - claude-3-5-haiku-20241022 + - claude-3-opus-20240229 + - claude-3-sonnet-20240229 + - claude-3-haiku-20240307 + +- **Message**: Messages act as input interactions between the user and the model. In the Roles parameter, you can choose either User or Assistant. + +- **Max Size**: Maximum tokens used in response. + +**Optional Parameters** + +- **System Prompt**: Defines the role and context of the model to evaluate messages and generate a response. + +- **Temperature**: Controls the randomness of the response. Accepts values between 0 and 1, with a default of 1. + +Anthropic Query + +
    +**Response Example** + +```json +[ + { + "type": "text", + "text": "AI has numerous significant benefits in healthcare. Here are some key advantages:nn1. Diagnosis and Disease Detectionn- Faster and more accurate diagnosis through image analysis (X-rays, MRIs, CT scans)n- Early detection of diseases like cancern- Pattern recognition in patient symptoms and medical historynn2. Treatment Planningn- Personalized treatment recommendationsn- Drug interaction predictionsn- Treatment outcome forecastingn- Precision medicine based on patient datann3. Administrative Tasksn- Automated appointment schedulingn- Medical record managementn- Billing and insurance processingn- Reducing paperwork and administrative burdennn4. Patient Caren- Remote patient monitoringn- Virtual health assistantsn- Personalized care recommendationsn- Medication adherence trackingnn5. Research and Drug Developmentn- Accelerated drug discoveryn- Clinical trial matchingn- Analysis of medical research datan- Identification of new treatment approachesnn6. Preventive Caren- Risk prediction and assessmentn- Population health managementn- Lifestyle recommendationsn- Early intervention opportunitiesnn7. Cost Reductionn- Improved efficiencyn- Reduced medical errorsn- Better resource allocationn- Streamlined operationsnn8. Accessibilityn- 24/7 availability of basic healthcare informationn- Improved access to healthcare in remote areasn- Reduced wait timesn- Better distribution of medical expertisennThese benefits continue to expand as AI technology advances and becomes more integrated into healthcare systems." + } +] +``` + +
    diff --git a/docs/docs/marketplace/plugins/cohere.md b/docs/docs/marketplace/plugins/cohere.md new file mode 100644 index 0000000000..190ee047c6 --- /dev/null +++ b/docs/docs/marketplace/plugins/cohere.md @@ -0,0 +1,168 @@ +--- +id: marketplace-plugin-cohere +title: Cohere +--- + +Cohere can be integrated with ToolJet to use its advanced AI models for tasks such as text generation or building a chatbot assistant by configuring parameters to optimize results. + +## Connection + +To connect with Cohere, you will need the **Access token**, which can be generated from **[Cohere Dashboard](https://dashboard.cohere.com/api-keys)**. + +Cohere Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate creative text content by selecting the desired model and defining additional parameters. + +**Required Parameters** + +- **Model**: The model to use for generating the text. The available models are: + - command-r7b-12-2024 + - command-r-plus-08-2024 + - command-r-plus-04-2024 + - command-r-plus + - command-r-08-2024 + - command-r-03-2024 + - command-r + - command + - command-nightly + - command-light + - command-light-nightly + - c4ai-aya-expanse-8b + - c4ai-aya-expanse-32b + +- **Message**: The main user input for generating response. + +**Optional Parameter** + +- **Advanced parameters**: Additional parameters to configure the model response. Refer [Advanced Parameters](#advanced-parameters) for more information. + +Example Parameters: + +```js +{ + "response_format": {"type": "text"}, + "temperature": 0.3, + "max_tokens": 512, + "seed": 3, + "p": 0.3, + "k": 1, + "frequency_penalty": 0.3, + "presence_penalty": 0.3, + "citation_options": {"mode": "fast"}, + "safety_mode": "off", + "stop_sequences": ["spam", "fraud"] +} +``` + +Cohere Text generation + +
    +**Response Example** + +ToolJet is an open-source no-code platform that allows you to build your own tools and automate your workflows in minutes. It is built on top of the powerful Airbyte open-source standard for data integration, focusing on user-friendliness and extensibility. With ToolJet, you can create custom solutions for your business without any prior coding knowledge. + +Here's a high-level overview of the features and capabilities of ToolJet: + +1. **No-Code Builder**: ToolJet offers a visual interface where you can quickly create powerful applications, workflows, and automation scripts without writing a single line of code. + +2. **Data Integration**: ToolJet leverages Airbyte to provide seamless data integration capabilities. You can sync data from various sources like databases, APIs, or SaaS applications to build custom dashboards, data pipelines, or extensions. + +3. **Visual Automation Builder**: Create automated workflows using a drag-and-drop interface. Connect various tools, apps, and APIs to automate tasks, notifications, data manipulation, and more. + +4. **Open Source**: Being open-source means you get full transparency over the platform's underlying code. Plus, you can contribute to the project and customize or extend it according to your needs. + +5. **Extensions & APIs**: ToolJet provides a marketplace for sharing and discovering extensions, APIs, and pre-built workflows. You can extend the functionality of ToolJet with community-built solutions. + +6. **Dashboard & Reports**: Create interactive dashboards and reports using the built-in charting and visualization tools. Visualize data from various sources in one place and share insights with your team. + +7. **Forms & UI**: Easily create forms and user interfaces using ToolJet's intuitive form builder. Collect data, feedback, or insights from your users or systems. + +8. **Collaboration & Security**: Control user access and permissions with robust security features. Collaborate with team members on different projects and ensure data privacy and compliance. + +9. **Integration with External Tools**: ToolJet integrates with popular productivity, collaboration, and data tools, including Slack, Google Workspace, Microsoft Office, Airbyte, and more. + +10. **Open API & Extensibility**: ToolJet has a robust application programming interface (API), which allows developers to extend its capabilities. You can customize and connect any external service or application. + +ToolJet is a versatile platform that spans several use cases, including business process automation, data management, workflow optimization + +
    + +### Chat + +Use this operation for a chat-like conversation, where the model responds based on the given prompts and instructions. It provides relevant and context-appropriate answers, maintaining a smooth conversational flow. + +**Required Parameters** + +- **Model**: Specifies the model to use for generating responses in the chat. The available models are: + - command-r7b-12-2024 + - command-r-plus-08-2024 + - command-r-plus-04-2024 + - command-r-plus + - command-r-08-2024 + - command-r-03-2024 + - command-r + - command + - command-nightly + - command-light + - command-light-nightly + - c4ai-aya-expanse-8b + - c4ai-aya-expanse-32b + +- **History**: Keeps track of previous interactions to maintain context in the conversation. + +- **Message**: The main user input for generating response in the chat. + +**Optional Parameter** + +- **Advanced parameters**: Additional parameters to configure the model response. Refer [Advanced Parameters](#advanced-parameters) for more information. + +Example Parameters: + +```js +{ + "response_format": {"type": "text"}, + "temperature": 0.3, + "max_tokens": 512, + "seed": 3, + "p": 0.3, + "k": 1, + "frequency_penalty": 0.3, + "presence_penalty": 0.3, + "citation_options": {"mode": "fast"}, + "safety_mode": "off", + "stop_sequences": ["spam", "fraud"] +} +``` + +Cohere Chat + +
    +**Response Example** + +ToolJet is a no-code platform that allows you to build custom internal tools with drag and drop functionality. You can integrate Cohere with ToolJet to enable an added advantage of AI features in your apps built on ToolJet. + +To integrate Cohere AI into your ToolJet app, you should have a Cohere AI API key. If you don't have one, you can sign up for a free Cohere AI account and get your API key. + +As a next step, you can refer to our documentation to see a step-by-step guide to integrate Cohere AI with ToolJet. If you have any further questions, please let me know! + +
    + +## Advanced Parameters + +| Parameter| Description | +|----------|-------------| +| Response Format | Configure the model to give output in specified format. | +| Temperature | Controls the degree of randomness of the output. | +| Max Tokens | The maximum number of tokens the model will generate as part of the response. | +| Seed | Set to ensure consistent results by initializing the generator. | +| P | Use to limit randomness by setting a probability threshold. | +| K | Defines the use of the top k most likely tokens for generation at each step. | +| Frequency Penalty | Use to discourage frequent word usage for more varied responses. | +| Presence Penalty | Use to reduce repetition of words or phrases. | +| Citation Options | Options for controlling citation generation. | +| Safety Mode | Use to select the safety instruction inserted into the prompt. Allowed values: CONTEXTUAL, STRICT, OFF | +| Stop Sequences | Defines a list of up to 5 strings that, when matched, will stop the generation and return the text generated so far. | \ No newline at end of file diff --git a/docs/docs/marketplace/plugins/gemini.md b/docs/docs/marketplace/plugins/gemini.md new file mode 100644 index 0000000000..55866d8a1a --- /dev/null +++ b/docs/docs/marketplace/plugins/gemini.md @@ -0,0 +1,115 @@ +--- +id: marketplace-plugin-gemini +title: Gemini +--- + +Google Gemini can be integrated with ToolJet to build context-aware, intelligent chatbots or generate creative text content. + +## Connection + +To connect with Gemini, you will need the **API Key**, which can be generated from **[Google AI Studio](https://aistudio.google.com/apikey)**. + +Gemini Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate text based on the prompt, system instructions, and model settings. It provides information or explanations tailored to the given context. + +**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. + +**Optional Parameter** + +- **System Prompt**: A predefined instruction guiding the model's tone and behavior. + +- **Max Tokens**: Limits the maximum number of tokens (words and characters) in the response. + +- **Temperature**: Defines the randomness of the response. It takes a value between 0 and 1, with a default of 1. + +Gemini Query + +
    +**Response Example** + +Connecting ToolJet to a database involves several steps, and the specific method depends on the type of database you're using. ToolJet primarily uses database connections through its built-in features, avoiding the need for complex configuration files or external tools. Here's a general guide, focusing on common scenarios: + +**1. Choose Your Database and Connection Method:** + +ToolJet supports various database systems, including: + +* **PostgreSQL:** A powerful, open-source relational database management system. +* **MySQL:** Another popular open-source relational database system. +* **SQLite:** A lightweight, file-based database system, often suitable for smaller projects. +* **MongoDB:** A NoSQL database system, ideal for handling unstructured or semi-structured data. + +**2. Setting Up the Database:** + +* **Ensure the database server is running and accessible.** This includes having the database software installed and configured. +* **Create a database:** Within the database server, you'll need to create a new database. +* **Create a user account with appropriate privileges:** This user account needs permissions to connect to the database and perform read/write operations. Crucially, ensure the user has the necessary permissions for your application's needs. For example, you will need `SELECT`, `INSERT`, `UPDATE`, and `DELETE` permissions if you're performing CRUD operations. +* **Determine the database credentials:** You'll need the database server's hostname/IP address, the database name, the username, and the password for the user account. + +**3. Connecting in ToolJet:** + +* **Navigate to the relevant ToolJet app/page where database interaction is needed.** +* **Utilize ToolJet's database connectors:** Look for sections or widgets in ToolJet that allow you to interact with databases. This is typically integrated into the data sources, data manipulation features, or custom functions. +* **Provide the database connection details:** Input the database server details (hostname/IP, port, database name, username, password). ToolJet will validate the connection. +* **Choose the database type:** Select the correct database type (e.g., PostgreSQL, MySQL, SQLite, MongoDB). +* **Test the connection:** ToolJet will attempt to connect to the database. Verify the success of the connection. If successful, you should be able to query the database within ToolJet's + +
    + +### Chat + +Use this operation for a chat-like conversation, where the model responds based on the given prompts and instructions. It provides relevant and context-appropriate answers, maintaining a smooth conversational flow. + +**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. + +**Optional Parameter** + +- **System Prompt**: Provides the model with guidance on the style and type of responses expected. + +- **History**: Keeps track of previous interactions to maintain context in the conversation. + +- **Max Tokens**: Limits the maximum number of tokens (words and characters) in the response. + +- **Temperature**: Defines the randomness of the response. It takes a value between 0 and 1, with a default of 1. + +Gemini Query + +
    +**Response Example** + +Integrating an API into ToolJet involves several steps, depending on the API's specifics (REST, GraphQL, etc.) and the desired functionality within your ToolJet application. Here's a breakdown of the process: + +**1. Understanding Your API:** + +* **Authentication:** How does the API authenticate requests? (API Key, OAuth 2.0, Basic Auth, etc.) This is crucial and will directly impact your ToolJet configuration. +* **Endpoints:** Identify the specific API endpoints you need to interact with. Note the HTTP methods (GET, POST, PUT, DELETE) for each endpoint. +* **Request Parameters:** Understand what parameters (query parameters, request body) each endpoint expects. Data types are important (string, integer, JSON, etc.). +* **Response Format:** Determine the format of the API's response (usually JSON or XML). ToolJet primarily works with JSON. + +
    + + + + + + diff --git a/docs/docs/marketplace/plugins/github.md b/docs/docs/marketplace/plugins/github.md index 096a3cee9a..02e80198da 100644 --- a/docs/docs/marketplace/plugins/github.md +++ b/docs/docs/marketplace/plugins/github.md @@ -12,9 +12,7 @@ To connect to GitHub, you need the following credential: You'll need a Personal Access Token to access data from private repositories. Public repository data remains accessible without a Personal Access Token. -
    - Marketplace: GitHub -
    +Marketplace: GitHub ## Supported Queries @@ -27,39 +25,53 @@ You'll need a Personal Access Token to access data from private repositories. Pu This operation fetches details for a specified user. -#### Required Parameters: +#### Required Parameter - **Username**: Specify the GitHub username or organization to retrieve their details. -
    - Marketplace: GitHub -
    +Marketplace: GitHub ### Get Repository Fetches detailed information about a specific repository. -#### Required Parameters: +#### Required Parameters - **Owner**: Name of the repository's owner, which can be either a GitHub user or an organization. - **Repository**: The exact name of the repository. +Marketplace: GitHub + ### Get Repository Issues Generates a list of issues associated with a repository, with options to filter them by their status. -#### Required Parameters: +#### Required Parameters - **Owner**: The name of the repository's owner. The owner can either be a GitHub organization or a user. - **Repository**: The repository name for which the issues are to be retrieved. - **State**: Filter the issues by their status: All, Open, or Closed. +#### Optional Parameters + +- **Page size**: Desired number of issues per page. Default is 30. +- **Page number**: Desired page number to fetch issues from. Default is 1. + +Marketplace: GitHub + ### Get Repository Pull Requests Generates a list of pull requests from a repository, with options to filter them by their status. -#### Required Parameters: +#### Required Parameters - **Owner**: The name of the repository's owner. The owner can either be a GitHub organization or a user. - **Repository**: The repository name for which the pull requests are to be retrieved. -- **State**: Filter the pull requests by their status: All, Open, or Closed. \ No newline at end of file +- **State**: Filter the pull requests by their status: All, Open, or Closed. + +#### Optional Parameters + +- **Page size**: Desired number of issues per page. Default is 30. +- **Page number**: Desired page number to fetch pull requests from. Default is 1. + +Marketplace: GitHub diff --git a/docs/docs/marketplace/plugins/huggingface.md b/docs/docs/marketplace/plugins/huggingface.md new file mode 100644 index 0000000000..a478ffa909 --- /dev/null +++ b/docs/docs/marketplace/plugins/huggingface.md @@ -0,0 +1,112 @@ +--- +id: marketplace-plugin-hugging_face +title: Hugging Face +--- + +Hugging Face integration with ToolJet enables you to use advanced natural language processing capabilities. With Hugging Face's state-of-the-art models, you can generate high-quality content and summarize text seamlessly. + +This plugin leverages the Inference API from Hugging Face to ensure seamless integration with supported models. To confirm if a model is supported, refer to the Inference API section on its page on the **[Hugging Face](https://huggingface.co/models)**. + +Hugging Face Configuration + + +## Connection + +To connect with Hugging Face, you will need the **Personal access token**, which can be generated from **[Hugging Face Platform](https://huggingface.co/settings/tokens)**. + +You can use the following toggles: +- **Use Cache**: Use this to enable the cache layer on the inference API to accelerate response times for repeated requests. By default it is enabled. +- **Wait for Model**: Use this to wait for the model to load if it is not ready, avoiding any errors. By default it is off. + +Hugging Face Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate text based on the input and model settings. It provides information or explanations tailored to the given context. Check out all the available text generation models on [Hugging Face](https://huggingface.co/models?pipeline_tag=text-generation&sort=trending). + +**Required Parameters** + +- **Model**: Specifies the model to use for generating responses. + + Example Models - + - [google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it) + - [tiiuae/falcon-7b-instruct](https://huggingface.co/tiiuae/falcon-7b-instruct) + - [HuggingFaceH4/zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta) + - [mistralai/Mistral-7B-Instruct-v0.2](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2) + +- **Input**: The user input for generating responses. + +**Optional Parameter** + +- **Operation Parameters**: Additional parameters to configure the model response. These parameters might change based on model being used. + +Gemini Query + +
    +**Response Example** + +AI integration with ToolJet: + +**Benefits of ToolJet Integration:** + +* **Faster Development:** Streamline the development process with pre-built integrations and templates for common workflows. +* **Reduced Costs:** Automate tasks and reduce the need for custom coding, saving development time and money. +* **Increased Productivity:** Empower your team to build and deploy tools faster, allowing them to focus on more strategic tasks. +* **Improved Collaboration:** Enable seamless collaboration between developers and business users by providing a unified platform for tool creation. + +**ToolJet Integration with Existing Tooling:** + +* **Integration with Popular Tools:** ToolJet can integrate with various tools, including Slack, Jira, Google Drive, and more. +* **Customizability:** Customize the integration to fit your specific workflows and requirements. + +**How ToolJet Integrates with Existing Tooling:** + +* **APIs:** Leverage open APIs to connect ToolJet to other tools and services. +* **Webhook Integration:** Integrate ToolJet with external services via webhooks to trigger actions based on events. +* **ToolJet Plugins:** Explore a library of plugins that expand ToolJet's functionality and facilitate integrations. + +**Example Use Cases:** + +* **Automated Data Pipeline:** Connect ToolJet to a data warehousing platform like Snowflake to automate data extraction and transformation. +* **Workflow Management:** Integrate ToolJet with a project management tool like Jira to create automated workflows for tasks and approvals. +* **Customizable Reporting:** Connect ToolJet to a reporting tool like Google Analytics to generate custom reports based on data analytics. +* **Automatic Notifications:** Integrate ToolJet with a communication platform like Slack to trigger notifications for completed tasks or system updates. + +**Conclusion:** + +ToolJet's integration capabilities significantly enhance the power and flexibility of your development workflows, enabling you to build custom tools faster and more effectively. By leveraging pre-built integrations, customizability, and APIs, ToolJet empowers your team to achieve greater productivity and streamline their processes across various stages of the development lifecycle. + +
    + +### Summarisation + +Use this operation to create a summary of the input text based on the model settings. Check out all the available summarisation models on [Hugging Face](https://huggingface.co/models?pipeline_tag=summarization&sort=trending). + +**Required Parameters** + +- **Model**: Specifies the model to use for generating summary. + + Example Models - + - [facebook/bart-large-cnn](https://huggingface.co/facebook/bart-large-cnn) + - [philschmid/bart-large-cnn-samsum](https://huggingface.co/philschmid/bart-large-cnn-samsum) + - [google/pegasus-xsum](https://huggingface.co/google/pegasus-xsum) + - [ainize/bart-base-cnn](https://huggingface.co/ainize/bart-base-cnn) + - [Falconsai/text_summarization](https://huggingface.co/Falconsai/text_summarization) + + +- **Input**: Input text that needs to be summarized. + +**Optional Parameter** + +- **Operation Parameters**: Additional parameters to configure the model response. These parameters might change based on model being used. + +Gemini Query + +
    +**Response Example** + +ToolJet can integrate with various tools, including Slack, Jira, Google Drive, and more. AI integration with ToolJet: capabilities significantly enhance the power and flexibility of your development workflows. By leveraging pre-built integrations, customizability, and APIs, ToolJet empowers your team to achieve greater productivity. + +
    diff --git a/docs/docs/marketplace/plugins/mistral.md b/docs/docs/marketplace/plugins/mistral.md new file mode 100644 index 0000000000..b9cb0869cc --- /dev/null +++ b/docs/docs/marketplace/plugins/mistral.md @@ -0,0 +1,100 @@ +--- +id: marketplace-plugin-mistral_ai +title: Mistral AI +--- + +Mistral AI can be integrated with ToolJet to generate high-quality text content. By defining various roles, it enables the creation of contextually relevant and dynamic content. + +## Connection + +To connect with Mistral AI, you will need an **API Key**, which can be generated from **[Mistral AI Console](https://console.mistral.ai/api-keys/)**. + +Mistral Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate text content by controlling various parameters to achieve precise results. + +**Required Parameters** + +- **Model**: Use to specify the AI model for generating content. The available models are: + + - mistral-large-latest + - ministral-3b-latest + - ministral-8b-latest + - open-mistral-nemo + - mistral-small-latest + +- **Messages**: Provide structured input to define the context or conversation.
    + +:::info + +1. A message object with the role **assistant** should always have both a prefix and suffix message object in the messages array. +2. If a message object with the role **assistant** is the last in the array then set `prefix: true` in that object. +::: + +**Optional Parameters** + +- **Max size**: Set the maximum length for the generated content. +- **Temperature**: Adjust to control the creativity and diversity of the output. +- **Top P**: Use to limit randomness by setting a probability threshold. +- **Stop token(s)**: Specify tokens or phrases to end the content generation. +- **Random seed**: Set to ensure consistent results by initializing the generator. +- **Response format**: Choose between plain text or structured JSON output. +- **Presence penalty**: Apply to reduce repetition of words or phrases. +- **Frequency penalty**: Use to discourage frequent word usage for more varied responses. +- **Completions (N)**: Set the number of response variations to generate. +- **Safe prompt**: Ensure the prompt is free of inappropriate or sensitive content. + +Mistral Query + +
    +**Response Example** + +"While I can't provide personalized financial advice, I can certainly help you understand some common investment options that may offer tax benefits. Here are some strategies to consider: + +#### 1. **Retirement Accounts** +- **401(k) or 403(b):** These are employer-sponsored retirement plans. Contributions are made with pre-tax dollars, reducing your taxable income. Employer matching contributions can also boost your savings. +- **Traditional IRA:** Contributions may be tax-deductible, depending on your income and whether you have access to a workplace retirement plan. Withdrawals are taxed as ordinary income. +- **Roth IRA:** Contributions are made with after-tax dollars, but qualified withdrawals are tax-free. This can be beneficial for those who expect to be in a higher tax bracket in retirement. + +#### 2. **Health Savings Accounts (HSAs)** +- **HSAs:** These are available to individuals with high-deductible health plans. Contributions are tax-deductible, earnings grow tax-free, and withdrawals for qualified medical expenses are tax-free. + +#### 3. **Tax-Loss Harvesting** +- **Selling Losing Investments:** You can sell investments that have lost value to offset gains from other investments, reducing your capital gains tax liability. + +#### 4. **Municipal Bonds** +- **Muni Bonds:** These are issued by state and local governments and are often exempt from federal taxes and sometimes state taxes as well. + +#### 5. **Education Savings Accounts** +- **529 Plans:** Contributions grow tax-free, and withdrawals are tax-free if used for qualified education expenses. Some states offer tax deductions or credits for contributions. +- **Coverdell ESAs:** Similar to 529 plans but with more restrictions on contributions and uses. + +#### 6. **Real Estate Investments** +- **Rental Income:** Income from rental properties can be offset by depreciation, reducing your taxable income. +- **1031 Exchanges:** Allows you to defer capital gains taxes by reinvesting the proceeds from the sale of an investment property into a similar property. + +#### 7. **Tax-Efficient Investments** +- **Index Funds and ETFs:** These often have lower turnover rates, which can reduce capital gains distributions and therefore tax liabilities. +- **Dividend-Paying Stocks:** Qualified dividends are taxed at lower rates than ordinary income. + +#### 8. **Charitable Contributions** +- **Donations:** Contributions to qualified charities can be tax-deductible, reducing your taxable income. +- **Donor-Advised Funds:** Allow you to make a charitable contribution and receive an immediate tax deduction, while deciding later where to allocate the funds. + +#### 9. **Energy-Efficient Home Improvements** +- **Tax Credits:** Certain energy-efficient home improvements may qualify for tax credits. + +#### 10. **Business Ownership** +- **Sole Proprietorships, LLCs, S-Corps:** Different business structures offer various tax benefits, such as pass-through income and deductions for business expenses. + +#### Steps to Create a Plan: +1. **Assess Your Financial Goals:** Determine what you want to achieve with your investments (e.g., retirement savings, education funding). +2. **Evaluate Your Tax Situation:** Understand your current and future tax brackets to choose the right investment vehicles. +3. **Diversify Your Portfolio:** Spread your investments across different asset classes to manage risk. +4. **Consult a Professional:** Consider working with a financial advisor or tax professional to tailor a plan to your specific needs." + +
    diff --git a/docs/docs/marketplace/plugins/openai.md b/docs/docs/marketplace/plugins/openai.md index ecae124326..9869b09560 100644 --- a/docs/docs/marketplace/plugins/openai.md +++ b/docs/docs/marketplace/plugins/openai.md @@ -3,7 +3,7 @@ id: marketplace-plugin-openai title: OpenAI --- -ToolJet integrates with OpenAI to utilize its AI capabilities. This integration enables ToolJet to generate text based on user prompts, facilitate chat interactions, and create images tailored to specific inputs. +ToolJet integrates with OpenAI to utilize its AI capabilities. This integration enables ToolJet to generate text based on user prompts, facilitate chat interactions, create images tailored to specific inputs, and generate vector embeddings. :::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)**. @@ -17,20 +17,21 @@ For connecting to OpenAI, the following credentials are required: - **Organization ID**: Find the Organization ID [here](https://platform.openai.com/account/org-settings).
    - Configuring OpenAI in ToolJet + Configuring OpenAI in ToolJet
    -## Supported queries +## Supported Operations - **[Chat](#chat)** - **[Completions](#completions)** - **[Generate AI Image(s)](#generate-ai-images)** +- **[Generate embedding](#generate-embedding)** ### Chat -The function of this query is to examine the user's input and generate a suitable response that simulates human-like conversation. +The function of this operation is to examine the user's input and generate a suitable response that simulates human-like conversation. -#### Required parameters: +#### Required Parameters - **Model**: The model to use for generating the chat response. The available models are: - GPT-4.0 @@ -39,7 +40,7 @@ The function of this query is to examine the user's input and generate a suitabl - GPT-3.5 Turbo - **Prompt**: A prompt is the initial message or question that is provided as input to the chatbot model to start a conversation. -#### Optional parameters: +#### Optional Parameters - **Max Tokens**: This parameter specifies the maximum number of tokens to generate in the text completion output. For example, if you set it to 50, then it will generate a text completion that contains up to 50 tokens. - **Temperature**: Temperature is used to control the creativity and randomness of the generated text. It ranges from 0 to 2, a higher value such as 0.8 will increase the randomness of the output, whereas a lower value such as 0.2 will make it more focused and deterministic. @@ -47,10 +48,10 @@ The function of this query is to examine the user's input and generate a suitabl - **Suffix**: The suffix that follows the inserted text completion.
    - Chat Operation + Chat Operation
    -
    +
    **Example Values** ```yaml @@ -64,7 +65,7 @@ Suffix: \n
    -
    +
    **Response Example** ```json @@ -75,15 +76,15 @@ Suffix: \n ### Completions -The purpose of this query is to generate text completions based on a given prompt. +The purpose of this operation is to generate text completions based on a given prompt. -#### Required parameters: +#### Required Parameters - **Model**: The model to use for generating the text completion. The available models are: - GPT-3.5 Turbo - **Prompt**: OpenAI uses the prompt as a starting point to generate a continuation or completion of the text, which can be in the form of a sentence, paragraph, or even an entire article. The quality and relevance of the generated text output can depend on the quality and specificity of the prompt provided. -#### Optional parameters: +#### Optional Parameters - **Max Tokens**: This parameter specifies the maximum number of tokens to generate in the text completion output. For example, if you set it to 50, then it will generate a text completion that contains up to 50 tokens. - **Temperature**: Temperature is used to control the creativity and randomness of the generated text. It ranges from 0 to 1, a higher value such as 0.8 will increase the randomness of the output, whereas a lower value such as 0.2 will make it more focused and deterministic. @@ -91,10 +92,10 @@ The purpose of this query is to generate text completions based on a given promp - **Suffix**: The suffix that follows the inserted text completion.
    - Completions Operation + Completions Operation
    -
    +
    **Example Values** ```yaml @@ -108,7 +109,7 @@ Suffix: \n
    -
    +
    **Response Example** ``` json @@ -119,26 +120,26 @@ Suffix: \n ### Generate AI Image(s) -This query generates AI images based on the given prompt. +This operation generates AI images based on the given prompt. -#### Required parameters: +#### Required Parameters - **Model**: The model to use for generating the image. The available models are: - DALL-E 3 - DALL-E 2 - **Prompt**: The prompt is the initial message or question that is provided as input to the AI model to generate an image. -#### Optional parameters: +#### Optional Parameters - **Size (in pixels)**: The size of the image to be generated in pixels. The default value is 1024x1024. The allowed sizes depend on the model: - **DALL-E 2**: Must be one of `256x256`, `512x512`, or `1024x1024`. - **DALL-E 3**: Must be one of `1024x1024`, `1792x1024`, or `1024x1792`.
    - Generate AI Images Operation + Generate AI Images Operation
    -
    +
    **Example Values** ```yaml @@ -149,7 +150,7 @@ Size(in pixels): 1024x1024
    -
    +
    **Response Example** ```json @@ -162,4 +163,57 @@ Size(in pixels): 1024x1024 } ``` +
    + +### Generate Embedding + +This operation is used to generate vector embeddings from the given text, which can be used to build AI applications. + +#### Required Parameters + +- **Model**: The model to use for generating the vector embedding. The available models are: + - text-embedding-3-small + - text-embedding-3-large + - text-embedding-ada-002 + +- **Input**: The text input used for generating the vector embedding. + +#### Optional Parameters + +- **Encoding format**: Specifies the output format of the vector embedding from the dropdown, float or base64. +- **Dimensions**: Defines the number of values in the generated embedding vector, affecting its size and level of detail. + +Generate Vector Embedding + +
    +**Example Values** + +```yaml +Model: text-embedding-3-large +Input: ToolJet is a low code platform used to build internal tools +Encoding format: Float +Dimensions: 10 +``` + +
    + +
    +**Response Example** + +```json +{ + "embedding": [ + -0.49750686, + -0.7019393, + -0.23043627, + -0.12421317, + -0.076866604, + 0.2191516, + 0.2548046, + 0.1453106, + -0.20050736, + 0.10516006 + ] +} +```
    \ No newline at end of file diff --git a/docs/docs/marketplace/plugins/pinecone.md b/docs/docs/marketplace/plugins/pinecone.md new file mode 100644 index 0000000000..12d9b2cb29 --- /dev/null +++ b/docs/docs/marketplace/plugins/pinecone.md @@ -0,0 +1,224 @@ +--- +id: marketplace-plugin-pinecone +title: Pinecone +--- + +ToolJet integrates with Pinecone to utilize its vector database capabilities. This integration enables ToolJet to perform vector operations such as updating, querying, and managing vector embeddings in Pinecone indexes. + +:::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 + +For connecting to Pinecone, the following credential is required: + +- **API Key**: API key for Pinecone can be generated from the [Pinecone Console](https://app.pinecone.io/organizations/-/projects/-/keys). + +Configuring Pinecone in ToolJet + + +## Supported Operations + +- **[Get Index Stats](#get-index-stats)** +- **[List Vector IDs](#list-vector-ids)** +- **[Fetch Vectors](#fetch-vectors)** +- **[Upsert Vectors](#upsert-vectors)** +- **[Update Vector](#update-a-vector)** +- **[Delete Vectors](#delete-vectors)** +- **[Query Vectors](#query-vectors)** + +### Get Index Stats + +This operation retrieves statistics about a specific index in your Pinecone database. + +#### Required Parameter + +- **Index**: The name of the index to get statistics for. + +Get Index Stats Operation + +
    +**Example Response** + +```json +{ + "namespaces":{ + "":{ + "recordCount":100 + } + }, + "dimension":1024, + "indexFullness":0, + "totalRecordCount":100 +} +``` +
    + +### List Vector IDs + +This operation retrieves a list of vector IDs from a specified index. + +#### Required Parameter + +- **Index**: The name of the index to list vector IDs from. + +#### Optional Parameters + +- **Prefix**: Filter vector IDs by prefix. +- **Limit**: Maximum number of vector IDs to return. +- **Pagination Token**: Token for retrieving the next page of results. +- **Namespace**: Specific namespace to query within the index. + +List Vector IDs Operation + +
    +**Example Response** + +```yaml +{ + "vectors":[ + {"id":"0"}, + {"id":"1"}, + {"id":"10"}, + {"id":"11"}, + {"id":"12"}, + {"id":"13"}, + {"id":"14"}, + {"id":"15"}, + {"id":"16"}, + {"id":"17"} + ], + "pagination":{ + "next":"eyJza2lwX3Bhc3QiOiIxNyIsInByZWZpeCI6bnVsbH0=" + }, + "namespace":"", + "usage":{ + "readUnits":1 + } +} +``` +
    + +### Fetch Vectors + +This operation retrieves specific vectors by their IDs from an index. + +#### Required Parameters + +- **Index**: The name of the index to fetch vectors from. +- **IDs**: Array of vector IDs to fetch. + +#### Optional Parameters + +- **Namespace**: Specific namespace to fetch vectors from. + +Fetch Vectors Operation + +
    +**Example Response** + +```yaml +{ + "records":{}, + "namespace":"", + "usage":{ + "readUnits":1 + } +} +``` +
    + +### Upsert Vectors + +This operation inserts or updates vectors in an index. + +#### Required Parameters + +- **Index**: The name of the index to upsert vectors into. +- **Vectors**: Array of vectors to upsert, including IDs and values. + +#### Optional Parameters + +- **Namespace**: Specific namespace to upsert vectors into + +Upsert Vectors Operation + +
    +**Example Response** + +```yaml +Upsert Successful +``` +
    + +### Update a Vector + +This operation updates a single vector's values or metadata. + +#### Required Parameters + +- **Index**: The name of the index containing the vector. +- **ID**: ID of the vector to update. + +#### Optional Parameters + +- **Values**: Updated vector values as an array. +- **Sparse Vector**: Sparse vector representation. +- **Metadata**: Additional metadata for the vector. +- **Namespace**: Specific namespace containing the vector. + +Update Vector Operation + +
    +**Example Response** + +```yaml +Update Successful +``` +
    + +### Delete Vectors + +This operation deletes vectors from an index. + +#### Required Parameters + +- **Index**: The name of the index to delete vectors from. + +#### Optional Parameters + +- **IDs**: Array of vector IDs to delete. +- **Delete All**: Boolean flag to delete all vectors. +- **Namespace**: Specific namespace to delete vectors from. +- **Filter**: Filter condition for selective deletion. + +Delete Vectors Operation + +
    +**Example Response** + +```yaml +Delete Successful +``` +
    + +### Query Vectors + +This operation queries vectors in an index based on similarity. + +#### Required Parameters + +- **Index**: The name of the index to query. +- **Vectors**: Query vector values. +- **Top K**: Number of most similar vectors to return. + +#### Optional Parameters + +- **Namespace**: Specific namespace to query. +- **Filter**: Filter condition for the query. +- **Include Values**: Boolean to include vector values in results. +- **Include Metadata**: Boolean to include metadata in results. +- **Sparse Vector**: Sparse vector for hybrid search. + +Query Vectors Operation diff --git a/docs/docs/marketplace/plugins/portkey.md b/docs/docs/marketplace/plugins/portkey.md index 1a1bbd26b2..5f2624c0cd 100644 --- a/docs/docs/marketplace/plugins/portkey.md +++ b/docs/docs/marketplace/plugins/portkey.md @@ -53,7 +53,7 @@ This operation generates text completions based on a given prompt. Completion Operation for Portkey -
    +
    **Response Example** ```json { @@ -96,7 +96,7 @@ This operation generates chat completions based on a series of messages. Chat Operation for Portkey -
    +
    **Response Example** ```json { @@ -141,7 +141,7 @@ This operation generates completions based on a pre-defined prompt. Prompt Completion Operation for Portkey -
    +
    **Response Example** ```json { @@ -185,7 +185,7 @@ This operation creates embeddings for given input text. Create Embedding Operation for Portkey -
    +
    **Response Example** ```json { diff --git a/docs/docs/marketplace/plugins/prestodb.md b/docs/docs/marketplace/plugins/prestodb.md index a3927a852e..4db59a764e 100644 --- a/docs/docs/marketplace/plugins/prestodb.md +++ b/docs/docs/marketplace/plugins/prestodb.md @@ -1,5 +1,5 @@ --- -id: marketplace-plugin-prestodb +id: marketplace-plugin-Presto title: PrestoDB --- diff --git a/docs/docs/marketplace/plugins/qdrant.md b/docs/docs/marketplace/plugins/qdrant.md new file mode 100644 index 0000000000..4cf73ee5de --- /dev/null +++ b/docs/docs/marketplace/plugins/qdrant.md @@ -0,0 +1,169 @@ +--- +id: marketplace-plugin-qdrant +title: Qdrant +--- + +Qdrant is a vector database which can be integrated with ToolJet to enable efficient vector search at scale. It supports AI applications with advanced technology for finding similar vectors. + +At its core, Qdrant operates with points, which are records consisting of a vector and an optional payload which allows you to store additional context or metadata alongside the vectors for more meaningful searches. + +## Connection + +To connect with Qdrant, you will need Qdrant URL and an API key, which can be generated from [Qdrant Cloud Dashboard](https://qdrant.to/cloud). + +Qdrant Configuration + +## Supported Operations + +### Get Collection Info + +Use this operation to retrieve metadata and configuration details about a specific collection in Qdrant. + +**Required Parameter** + +- **Collection Name:** Refers to the specific dataset stored in Qdrant. + +Get Collection Info + +
    +**Example Response** +```yaml +{ + "status": "green", + "optimizer_status": "ok", + "indexed_vectors_count": 5417, + "points_count": 5412, + "segments_count": 2, + "config": { + "params": { + "vectors": { + "size": 512, + "distance": "Cosine" + }, + "shard_number": 1, + "replication_factor": 1, + "write_consistency_factor": 1, + "on_disk_payload": true + }, + "hnsw_config": { + "m": 16, + "ef_construct": 100, + "full_scan_threshold": 10000, + "max_indexing_threads": 0, + "on_disk": false + }, + "optimizer_config": { + "deleted_threshold": 0.2, + "vacuum_min_vector_number": 1000, + "default_segment_number": 2, + "max_segment_size": null, + "memmap_threshold": null, + "indexing_threshold": 1000, + "flush_interval_sec": 5, + "max_optimization_threads": null + }, + "wal_config": { + "wal_capacity_mb": 1, + "wal_segments_ahead": 0 + }, + "quantization_config": null, + "strict_mode_config": { + "enabled": false + } + }, + "payload_schema": {} +} +``` +
    + +### Get Points + +Use this operation to retrieve specific data points from a collection using their unique identifiers. + +**Required Parameters** + +- **Collection Name:** Refers to the specific dataset stored in Qdrant. +- **IDs:** Unique identifiers for individual data points within the collection. They are used to locate and retrieve specific entries from the collection. + +Get Points + +
    +**Example Response** + +```yaml +[{ + "id": 1, + "payload": { + "file_name": "text.jpeg", + "image_url": "https://storage.googleapis.com/demo-midjourney/.jpeg", + "name": "Catherine Hyde", + "url": "/styles/catherine-hyde" + }, + "vector": [0.043383807, -0.06374442, -0.013710048, -0.0332631, 0.013115806, -0.018017521, -0.01306308, -0.030214038, 0.009868348, 0.02169504, -0.009813371, -0.033448037, 0.004893773, -0.009090395...] +}] +``` +
    + +### Delete Points + +Use this operation to remove specific data points from a collection using their unique identifiers. + +**Required Parameters** + +- **Collection Name:** Refers to the specific dataset stored in Qdrant. +- **IDs:** Unique identifiers for individual data points within the collection. They are used to locate and retrieve specific entries from the collection. + +**Optional Parameter** + +- **Filter:** Used to set conditions when searching or retrieving points. + +Delete Points + +### Query Points + +Use this operation to search data points in a collection using a query, typically based on vector similarity or filtering conditions. + +**Required Parameters** + +- **Collection Name:** Identifies the dataset where the query will be executed. +- **Limit:** Specifies the maximum number of results to return. +- **Query:** A vector representing the query input used for similarity-based search. + +**Optional Parameters** + +- **With Vectors:** Indicates whether the vector data for the retrieved points should be included in the response (true or false). +- **Include Metadata:** Specifies if metadata associated with the points should be returned (true or false). +- **Filter:** Defines conditions to narrow down the search. + +Query Points + +
    +**Example Response** + +```yaml +[{ + "id": 2589, + "version": 124, + "score": 0.1293197 +}, { + "id": 2274, + "version": 111, + "score": 0.12669206 +}, { + "id": 2612, + "version": 124, + "score": 0.12196793 +}] +``` +
    + +### Upsert Points + +Use this operation to add new data points or update existing ones in a collection based on their unique identifiers. + +**Required Parameters** + +- **Collection Name:** Represents the group of data points where the new or updated points will be stored. +- **Points:** The actual data being added or updated. Each point contains a unique identifier and optional attributes. + +Upsert Points diff --git a/docs/docs/marketplace/plugins/sharepoint.md b/docs/docs/marketplace/plugins/sharepoint.md new file mode 100644 index 0000000000..ebb95dce8e --- /dev/null +++ b/docs/docs/marketplace/plugins/sharepoint.md @@ -0,0 +1,770 @@ +--- +id: marketplace-plugin-sharepoint +title: Sharepoint +--- + +ToolJet allows you to connect to Microsoft Sharepoint to perform various operations like managing sites, lists, and items using Microsoft Graph API. + +:::info +**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 + +To connect to a Sharepoint data source in ToolJet, you can either click the **+ Add new data source** button on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page in the ToolJet dashboard. + +:::info +You'll need to register your application in Azure Active Directory to get the required credentials. The application needs appropriate Microsoft Graph API permissions. +::: + +To connect to Sharepoint, you need the following details: +- **Client ID** +- **Client Secret** +- **Tenant ID** + +
    + Sharepoint Connect +
    + +## Querying Sharepoint + +1. Click the **+ Add** button in the query manager at the bottom of the editor and select the Sharepoint data source added earlier. +2. Choose the operation you want to perform on your Sharepoint instance. + +:::tip +Query results can be transformed using transformations. Refer to our transformations documentation for more details: **[link](/docs/tutorial/transformations)** +::: + +## Supported Operations + +ToolJet supports the following Sharepoint operations: + +- **[Get All Sites](#get-all-sites)** +- **[Get Site](#get-site)** +- **[Get Analytics](#get-analytics)** +- **[Get Pages Of a Site](#get-pages-of-a-site)** +- **[Get All Lists](#get-all-lists)** +- **[Get Metadata Of a List](#get-metadata-of-a-list)** +- **[Create a List](#create-a-list)** +- **[Get Items Of a List](#get-items-of-a-list)** +- **[Update Item Of a List](#update-item-of-a-list)** +- **[Delete Item Of a List](#delete-item-of-a-list)** +- **[Add Item To a List](#add-item-to-a-list)** + +### Get All Sites + +This operation retrieves all available Sharepoint sites. For more details, see the Microsoft Graph API documentation **[here](https://learn.microsoft.com/en-us/graph/api/site-search)**. + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get All Sites +
    + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites", + "value": [ + { + "createdDateTime": "2024-09-08T15:54:30Z", + "id": "tooljetxxxx.sharepoint.com,bcxxxx-4b3a-xxxxxx-dfe229c34311,2a4ac5da-xxx-xxxx-b047-18dece61fb95", + "lastModifiedDateTime": "2024-08-17T18:50:05Z", + "name": "appcatalog", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/appcatalog", + "displayName": "Apps", + "root": {}, + "siteCollection": { + "hostname": "tooljetxxxx.sharepoint.com" + } + } + ] +} +``` +
    + +### Get Site + +This operation retrieves information about a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site to retrieve + +
    + Get Site +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites/$entity", + "createdDateTime": "2024-10-22T13:21:10.623Z", + "description": "Internal DIA Guidelines", + "id": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb", + "lastModifiedDateTime": "2024-10-24T13:35:39Z", + "name": "NewStyle", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle", + "displayName": "NewStyle", + "root": {}, + "siteCollection": { + "hostname": "tooljetxxxx.sharepoint.com" + } +} +``` +
    + +### Get Analytics + +This operation retrieves analytics for a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site +- **Time Interval**: + - **Last 7 Days** + - **All Time** + +
    + Get Analytics +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Time Interval: Last 7 Days +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.itemActivityStat", + "aggregationInterval": "None", + "startDateTime": "2024-10-30T00:00:00Z", + "endDateTime": "2024-11-05T00:00:00Z", + "isTrending": false, + "access": { + "actionCount": 0, + "actorCount": 0, + "timeSpentInSeconds": 0 + }, + "incompleteData": { + "wasThrottled": false, + "resultsPending": false, + "notSupported": false + } +} +``` +
    + +### Get Pages Of a Site + +This operation retrieves all pages from a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get Pages +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/pages", + "@odata.nextLink": "https://graph.microsoft.com/v1.0/sites/tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb/pages?$top=1&$skiptoken=UGFnZWQ9VFJVRSZwX0ZpbGVMZWFmUmVmPUV2ZW50UGxhbkhvbWUuYXNweCZwX0lEPTc", + "value": [ + { + "@odata.type": "#microsoft.graph.sitePage", + "@odata.etag": ""{2095ED1D-AC76-4480-BBDC-8D63EBAAE2AF},6"", + "createdDateTime": "2024-10-22T13:21:33Z", + "eTag": ""{2095ED1D-AC76-4480-BBDC-8D63EBAAE2AF},6"", + "id": "2095ed1d-ac76-4480-bbdc-8d63ebaae2af", + "lastModifiedDateTime": "2024-10-22T13:21:35Z", + "name": "EventPlanHome.aspx", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/SitePages/EventPlanHome.aspx", + "title": "Home", + "pageLayout": "home", + "thumbnailWebUrl": "https://tooljetxxxx.sharepoint.com/_layouts/15/getpreview.ashx?guidSite=887cb371-e930-4e5b-a726-8d5769e6b946&guidWeb=6d653d09-1613-4663-99ab-1bb72ff6ceeb&guidFile=bb423735-7402-47df-ab2e-729bddfe6f23", + "promotionKind": "page", + "showComments": false, + "showRecommendedPages": false, + "contentType": { + "id": "0x0101009D1CB255DA76424F860D91F20E6C4118004CC245E37669F3438CDDEB01FCEAE890", + "name": "Site Page" + }, + "createdBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "lastModifiedBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "parentReference": { + "siteId": "887cb371-e930-4e5b-a726-8d5769e6b946" + }, + "publishingState": { + "level": "published", + "versionId": "1.0" + }, + "reactions": {} + } + ] +} +``` +
    + +### Get All Lists + +This operation retrieves all lists from a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site + +#### Optional Parameters +- **Page**: The page number to retrieve + +
    + Get All Lists +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Page: 1 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists", + "value": [ + { + "@odata.etag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "createdDateTime": "2024-10-24T11:11:10Z", + "description": "", + "eTag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "id": "1a64ae23-9cb6-4521-b489-61d558dde9f7", + "lastModifiedDateTime": "2024-10-24T11:11:17Z", + "name": "Test_table_query", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query", + "displayName": "Test_table_query", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + } + } + ] +} +``` +
    + +### Get Metadata Of a List + +This operation retrieves metadata for a specific list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List Name**: The name of the list, only used if List ID is not provided +- **List ID**: The ID of the list, required if List Name is not provided + +
    + Get List Metadata +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists/$entity", + "@odata.etag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "createdDateTime": "2024-10-24T11:11:10Z", + "description": "", + "eTag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "id": "1a64ae23-9cb6-4521-b489-61d558dde9f7", + "lastModifiedDateTime": "2024-11-05T10:27:04Z", + "name": "Test_table_query", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query", + "displayName": "Test_table_query", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + }, + "columns@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/columns", + "columns": [ + { + "columnGroup": "Custom Columns", + "description": "", + "displayName": "USER_NAME", + "enforceUniqueValues": false, + "hidden": false, + "id": "fa564e0f-0c70-4ab9-b863-0177e6ddd247", + "indexed": false, + "name": "Title", + "readOnly": false, + "required": false, + "text": { + "allowMultipleLines": false, + "appendChangesToExistingText": false, + "linesForEditing": 0, + "maxLength": 255 + } + } + ], + "items@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items", + "items": [ + { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "createdDateTime": "2024-10-24T11:11:11Z", + "eTag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "id": "1", + "lastModifiedDateTime": "2024-10-24T11:11:11Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/1_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('1')/fields/$entity", + "fields": { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "Title": "Null_test", + "id": "1", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Null_test", + "LinkTitle": "Null_test", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "" + } + } + ] +} +``` +
    + +### Create a List + +This operation creates a new list in a Sharepoint site. + +#### Required Parameters +- **Site ID**: The ID of the site +- **Body**: The list configuration in JSON format + +
    + Create List +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Body: +{ + "displayName": "Project Tasks", + "columns": [ + { + "name": "TaskName", + "text": { } + }, + { + "name": "DueDate", + "dateTime": { } + }, + { + "name": "Priority", + "choice": { + "choices": ["High", "Medium", "Low"] + } + } + ], + "list": { + "template": "genericList" + } +} +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists/$entity", + "@odata.etag": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b,10", + "createdDateTime": "2024-11-05T10:48:51Z", + "description": "", + "eTag": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b,10", + "id": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b", + "lastModifiedDateTime": "2024-11-05T10:48:52Z", + "name": "Project Tasks", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Project%20Tasks", + "displayName": "Project Tasks", + "createdBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + } +} +``` +
    + +### Get Items Of a List + +This operation retrieves items from a specific list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get List Items +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Top: 1 +Page: 1 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items(fields())", + "@odata.nextLink": "https://graph.microsoft.com/v1.0/sites/tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb/lists/1a64ae23-9cb6-4521-b489-61d558dde9f7/items?$expand=fields&$top=1&$skiptoken=UGFnZWQ9VFJVRSZwX0lEPTE", + "value": [ + { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "createdDateTime": "2024-10-24T11:11:11Z", + "eTag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "id": "1", + "lastModifiedDateTime": "2024-10-24T11:11:11Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/1_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('1')/fields/$entity", + "fields": { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "Title": "Null_test", + "field_2": 10, + "field_3": 123.32, + "field_4": 1, + "id": "1", + "ContentType": "Item", + "Modified": "2024-10-24T11:11:11Z", + "Created": "2024-10-24T11:11:11Z", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Null_test", + "LinkTitle": "Null_test", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "" + } + } + ] +} +``` +
    + +### Update Item Of a List + +This operation updates an existing item in a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Item ID**: The ID of the item to update +- **Body**: The updated values in JSON format + +
    + Update Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 1a64ae23-9cb6-4521-b489-61d558dde9f7 +Item ID: 1 +Body: +{ + "TaskName": "Update Documentation", + "Priority": "Medium", + "DueDate": "2023-11-15T00:00:00Z" +} +``` + +
    +**Response Example** + +```json +{ + "id": "1", + "fields": { + "TaskName": "Update Documentation", + "Priority": "Medium", + "DueDate": "2023-11-15T00:00:00Z" + } +} +``` +
    + +### Delete Item Of a List + +This operation removes an item from a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Item ID**: The ID of the item to delete + +
    + Delete Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,da60e844-ba1d-49bc-b4d4-d5e36bae9019 +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Item ID: 1 +``` + +
    +**Response Example** + +```json +{ + "code": 204, + "status": "No Content", + "message": "Item having id '1' in List '1a64ae23-9cb6-4521-b489-61d558dde9f7' has been deleted." +} +``` +
    + +### Add Item To a List + +This operation adds a new item to a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Body**: The new item's data in JSON format + +
    + Add Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,da60e844-ba1d-49bc-b4d4-d5e36bae9019 +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Body: +{ + "fields": { + "Title": "Prepare Presentation" + } +} +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items/$entity", + "@odata.etag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "createdDateTime": "2024-11-05T11:40:52Z", + "eTag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "id": "69", + "lastModifiedDateTime": "2024-11-05T11:40:52Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/69_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "application": { + "id": "0dc94ee2-9788-443c-8e67-ce714f0fe579", + "displayName": "Microsoft Graph" + }, + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('69')/fields/$entity", + "fields": { + "@odata.etag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "Title": "Prepare Presentation", + "id": "69", + "ContentType": "Item", + "Modified": "2024-11-05T11:40:52Z", + "Created": "2024-11-05T11:40:52Z", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Prepare Presentation", + "LinkTitle": "Prepare Presentation", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "", + "AppAuthorLookupId": "3", + "AppEditorLookupId": "3" + } +} +``` +
    \ No newline at end of file diff --git a/docs/docs/marketplace/plugins/supabase.md b/docs/docs/marketplace/plugins/supabase.md index 7e5adc7fc8..0113b5f250 100644 --- a/docs/docs/marketplace/plugins/supabase.md +++ b/docs/docs/marketplace/plugins/supabase.md @@ -76,6 +76,26 @@ You can create query for Supabase data source to perform several operations such Get Rows +
    +**Example Response** + +```yaml +[ + { + "id": 1, + "created_at": "2025-02-12T08:50:25.780412+00:00", + "likes": 99, + "content": "CFBR!" + }, + { + "id": 4, + "created_at": "2025-02-12T11:34:26.624735+00:00", + "likes": 108, + "content": "Saved!" + } +] +``` +
    ### Create Row(s) @@ -89,6 +109,14 @@ You can create query for Supabase data source to perform several operations such Create Rows +
    +**Example Response** + +```yaml +created: true +``` +
    + ### Update Row(s) #### Required parameters: @@ -103,6 +131,20 @@ You can create query for Supabase data source to perform several operations such Update Rows +
    +**Example Response** + +```yaml +[ + { + "id": 4, + "created_at": "2025-02-12T11:34:26.624735+00:00", + "likes": 50, + "content": "Saved!" + } +] +``` +
    ### Delete Row(s) @@ -114,6 +156,13 @@ You can create query for Supabase data source to perform several operations such Delete Rows +
    +**Example Response** + +```yaml +deleted: true +``` +
    ### Count Rows @@ -128,7 +177,13 @@ You can create query for Supabase data source to perform several operations such
    Count Rows
    -
    +
    +**Example Response** +```yaml +count: 2 +``` +
    +
    \ No newline at end of file diff --git a/docs/docs/marketplace/plugins/weaviate.md b/docs/docs/marketplace/plugins/weaviate.md new file mode 100644 index 0000000000..893515a551 --- /dev/null +++ b/docs/docs/marketplace/plugins/weaviate.md @@ -0,0 +1,523 @@ +--- +id: marketplace-plugin-weaviate +title: Weaviate +--- + +Weaviate is a vector database, integrating Weaviate with ToolJet enables efficient vector search and semantic querying, allowing applications to retrieve relevant information based on meaning rather than exact keywords. This integration is ideal for building AI-powered search engines, recommendation systems, and knowledge retrieval applications that enhance user experience with context-aware results. + +## Connections + +### Cloud + +To connect with Weaviate Cloud, you will need the **Instance URL** and the **API Key**, which can be generated from **[Weaviate Console](https://weaviate.io/developers/wcs/connect)**. + +Weaviate Configuration + +### Local + +To connect ToolJet with Weaviate Local, you will need the **Host** and the **Port**. + +Run the following Docker command to start the container locally. This will set the host to `localhost` and port to `8080`. + +```yaml +docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:1.28.4 +``` + +Weaviate Configuration + +## Supported Operations + +## Data Type - Schema + +### Get Database Schema + +Run this opetation to get the database schema. + +**Optional Patameter** + +- **Consistency**: Ensures the request is handled by the leader node to maintain accuracy. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "classes": [ + { + "class": "Createcollection", + "description": "Test collection create", + "invertedIndexConfig": { + "bm25": { + "b": 0.75, + "k1": 1.2 + }, + "cleanupIntervalSeconds": 300, + "indexNullState": true, + "indexPropertyLength": true, + "indexTimestamps": true, + "stopwords": { + "additions": [ + "custom1" + ], + "preset": "en", + "removals": [ + "the" + ] + } + }, + "moduleConfig": { + "text2vec-contextionary": { + "vectorizeClassName": true + } + }, + "multiTenancyConfig": { + "autoTenantActivation": false, + "autoTenantCreation": false, + "enabled": false + }, + "properties": [ + { + "dataType": [ + "text" + ], + "description": "Main text field", + "indexFilterable": true, + "indexRangeFilters": false, + "indexSearchable": true, + "name": "content", + "tokenization": "word" + } + ], + "replicationConfig": { + "asyncEnabled": true, + "deletionStrategy": "NoAutomatedResolution", + "factor": 1 + }, + "shardingConfig": { + "virtualPerPhysical": 128, + "desiredCount": 1, + "actualCount": 1, + "desiredVirtualCount": 128, + "actualVirtualCount": 128, + "key": "_id", + "strategy": "hash", + "function": "murmur3" + }, + "vectorIndexConfig": { + "skip": false, + "cleanupIntervalSeconds": 300, + "maxConnections": 64, + "efConstruction": 128, + "ef": -1, + "dynamicEfMin": 100, + "dynamicEfMax": 500, + "dynamicEfFactor": 8, + "vectorCacheMaxObjects": 1000000000000, + "flatSearchCutoff": 40000, + "distance": "cosine", + "pq": { + "enabled": false, + "bitCompression": false, + "segments": 0, + "centroids": 256, + "trainingLimit": 100000, + "encoder": { + "type": "kmeans", + "distribution": "log-normal" + } + }, + "bq": { + "enabled": false + }, + "sq": { + "enabled": false, + "trainingLimit": 100000, + "rescoreLimit": 20 + }, + "filterStrategy": "sweeping" + }, + "vectorIndexType": "hnsw", + "vectorizer": "none" + } + ] +} +``` + +
    + +## Data Type - Collection + +### Get Collection + +**Required Parameter** + +- **Collection Name**: Name of the desired collection to fetch details. + +**Optional Parameter** + +- **Consistency**: Ensures the request is handled by the leader node to maintain accuracy. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ +[ + { + "dataType":["text"], + "description":"Main text field", + "indexFilterable":true, + "indexRangeFilters":false, + "indexSearchable":true, + "name":"content", + "tokenization":"word" + } +], +"replicationConfig":{ + "asyncEnabled":true, + "deletionStrategy":"NoAutomatedResolution", + "factor":1 +}, +"shardingConfig":{ + "virtualPerPhysical":128, + "desiredCount":1, + "actualCount":1, + "desiredVirtualCount":128, + "actualVirtualCount":128, + "key":"_id", + "strategy":"hash", + "function":"murmur3" +}, +"vectorIndexConfig":{ + "skip":false, + "cleanupIntervalSeconds":300, + "maxConnections":64, + "efConstruction":128, + "ef":-1, + "dynamicEfMin":100, + "dynamicEfMax":500, + "dynamicEfFactor":8, + "vectorCacheMaxObjects":1000000000000, + "flatSearchCutoff":40000, + "distance":"cosine", + "pq":{ + "enabled":false, + "bitCompression":false, + "segments":0, + "centroids":256, + "trainingLimit":100000, + "encoder":{ + "type":"kmeans", + "distribution":"log-normal" + } + }, + "bq":{ + "enabled":false + }, + "sq":{ + "enabled":false, + "trainingLimit":100000, + "rescoreLimit":20 + }, + "filterStrategy":"sweeping" +}, +"vectorIndexType":"hnsw", +"vectorizer":"none" +} +``` + +
    + +### Create Collection + +Use this operation to create a new collection. + +**Required Parameters** + +- **Collection Name**: The name of the collection. +- **Vectorizer**: Vectorizer to use for data objects added to this collection. +- **Vector index config**: Vector index type specific settings, including distance metric. +- **Module config**: Module-specific settings. +- **Description**: A description for your reference. +- **Properties**: An array of the properties you are adding, same as a Property Object. + +**Required Parameters** + +- **Consistency**: Ensures the request is handled by the leader node to maintain accuracy. +- **Sharding config**: Controls behavior of the collection in a multi-node setting. +- **Stop words**: Controls which words should be ignored in the inverted index. +- **Index time stamps**: Maintains inverted indexes for each object by its internal timestamps. +- **Index null state**: Maintains inverted indexes for each property regarding its null state. +- **Index property length**: Maintains inverted indexes for each property by its length. +- **Bm 25**: Search ranking method that boosts result accuracy using adjustable k1 and b values. By default, k1 = 1.2 and b = 0.75. +- **Factor**: Controls replication or sharding behavior for scaling. +- **Async enabled**: Runs operations in the background for better performance. +- **Deletion strategy**: Defines how deleted data is handled (e.g., immediate or delayed). +- **Cleanup interval seconds**: Sets how often old or deleted data is removed. + +Refer to **[weaviate documentation](https://weaviate.io/developers/weaviate/config-refs/schema)** for more information. + +Weaviate Configuration + +
    +**Response Example** + +```json + +{ + "class":"Newcollection", + "description":"Test collection create", + "invertedIndexConfig":{ + "bm25":{ + "b":0.75, + "k1":1.2 + }, + "cleanupIntervalSeconds":300, + "indexNullState":true, + "indexPropertyLength":true, + "indexTimestamps":true, + "stopwords":{ + "additions":[ + "custom1" + ], + "preset":"en", + "removals":[ + "the" + ] + } + }, + "moduleConfig":{ + "text2vec-contextionary":{ + "vectorizeClassName":true + } + }, + "multiTenancyConfig":{ + "autoTenantActivation":false, + "autoTenantCreation":false, + "enabled":false + }, + "properties":[ + { + "dataType":[ + "text" + ], + "description":"Main text field", + "indexFilterable":true, + "indexRangeFilters":false, + "indexSearchable":true, + "name":"content", + "tokenization":"word" + } + ], + "replicationConfig":{ + "asyncEnabled":true, + "deletionStrategy":"NoAutomatedResolution", + "factor":1 + }, + "shardingConfig":{ + "virtualPerPhysical":128, + "desiredCount":1, + "actualCount":1, + "desiredVirtualCount":128, + "actualVirtualCount":128, + "key":"_id", + "strategy":"hash", + "function":"murmur3" + }, + "vectorIndexConfig":{ + "skip":false, + "cleanupIntervalSeconds":300, + "maxConnections":64, + "efConstruction":128, + "ef":-1, + "dynamicEfMin":100, + "dynamicEfMax":500, + "dynamicEfFactor":8, + "vectorCacheMaxObjects":1000000000000, + "flatSearchCutoff":40000, + "distance":"cosine", + "pq":{ + "enabled":false, + "bitCompression":false, + "segments":0, + "centroids":256, + "trainingLimit":100000, + "encoder":{ + "type":"kmeans", + "distribution":"log-normal" + } + }, + "bq":{ + "enabled":false + }, + "sq":{ + "enabled":false, + "trainingLimit":100000, + "rescoreLimit":20 + }, + "filterStrategy":"sweeping" + }, + "vectorIndexType":"hnsw", + "vectorizer":"none" +} +``` + +
    + +### Delete Collection + +Use this operation to delete a collection. + +**Required Parameters** + +- **Collection Name**: Collection name that needs to be deleted. + +Weaviate Configuration + +## Data Type - Objects + +### List Objects + +Use this operation to list all the objects of a collection. + +**Required Parameter** + +- **Collection Name**: Collection name to list its objects. + +**Optional Parameter** + +- **Include vectors**: Specify names of the vectors to include. +- **After**: A threshold UUID of the objects to retrieve after. +- **Offset**: The starting index of the result window. +- **Limit**: The maximum number of items to be returned per page. +- **Include**: Include additional information, such as classification infos. Allowed values include: classification, vector, interpretation. +- **Sort**: Name(s) of the property to sort by. +- **Order**: Determines sorting direction (asc or desc). +- **Tenant**: Specifies the tenant in a request targeting a multi-tenant class. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "deprecations":[], + "objects":[{ + "class":"Testcollection", + "creationTimeUnix":1739009190787, + "id":"296f9f17-628a-463a-b273-6ae369a3bb59", + "lastUpdateTimeUnix":1739009190787, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"New Sample Document" + }, + "vectorWeights":null + }, + { + "class":"Testcollection", + "creationTimeUnix":1738941448311, + "id":"550e8400-e29b-41d4-a716-446655440000", + "lastUpdateTimeUnix":1738941448311, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"Sample Document" + }, + "vectorWeights":null + }, + { + "class":"Testcollection", + "creationTimeUnix":1739008896994, + "id":"98a6628d-f07d-4f56-b64b-1b818201095c", + "lastUpdateTimeUnix":1739008896994, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"Sample Document" + }, + "vectorWeights":null + }], + "totalResults":3 +} +``` + +
    + +### Create Object + +Use this operation to create a new object within the selected collection. + +**Required Parameters** + +- **Collection Name**: Collection name to create an object inside it. +- **Properties**: An array of the properties you are adding, same as a Property Object. +- **Vector**: Enter the vector for the object. + +**Optional Parameter** + +- **Object uuid**: The UUID of the object. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "class":"Testcollection", + "creationTimeUnix":1739009190787, + "id":"296f9f17-628a-463a-b273-6ae369a3bb59", + "lastUpdateTimeUnix":1739009190787, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"New Sample Document" + }, + "vector":[0.12345,0.12345,.......,0.12345,0.12345] +} +``` + +
    + +### Get Object By Id + +Use this operation to fetch an object using it's ID. + +**Required Parameters** + +- **Collection Name**: Collection Name of the object. +- **Object ID**: Object ID to fetch the object details. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "class":"Testcollection", + "creationTimeUnix":1738941448311, + "id":"550e8400-e29b-41d4-a716-446655440000", + "lastUpdateTimeUnix":1738941448311, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"Sample Document" + }, + "vectorWeights":null +} +``` + +
    + +### Delete Object By Id + +Use this operation to delete the object using it's ID. + +**Required Parameters** + +- **Collection Name**: Collection Name of the object. +- **Object ID**: Object ID of the object to be deleted. + +Weaviate Configuration diff --git a/docs/docs/org-management/licensing/cloud.md b/docs/docs/org-management/licensing/cloud.md deleted file mode 100644 index dcc1d67a0a..0000000000 --- a/docs/docs/org-management/licensing/cloud.md +++ /dev/null @@ -1,134 +0,0 @@ ---- -id: tooljet-cloud -title: ToolJet Cloud ---- - -
    Available on: Paid plans
    - -## Choosing Your ToolJet Cloud Subscription - -This comprehensive guide aims to assist you in the process of configuring paid plans for ToolJet Cloud. If you are looking for self-hosted/on-premises plans, please navigate to **[Self Hosted](/docs/org-management/licensing/self-hosted)** . For ToolJet Cloud, we offer three different types of subscriptions tailored to your specific requirements. Let's explore how to get the most out of ToolJet's powerful features! 🚀 - -Let's look into three types of subscriptions: - -1. **Free Trial**: This is a free subscription that grants access to premium features for a 14-day trial period. - - - **New Users**: Select the 14-day trial option during the onboarding process. - - **Existing Users**: If eligible, a start trial banner will be visible on your ToolJet dashboard. - -2. **Business Subscription**: This is a paid monthly subscription that you can [upgrade](#a-chosen-plan-business-plan) to from within the ToolJet app. -3. **Enterprise Subscription**: This is a paid subscription with customizable options. To obtain this subscription, you have to contact our **[sales](https://tooljet.com/slack)** team. - ---- - -## Updating To Trial Subscription (For Existing Users) - -If you are an existing user and wish to update to trial subscriptions, follow these steps: - -1. Navigate to the desired Workspace. -2. If you are not currently on a paid plan and have not yet used your free trial, you will see a **Start Trial** banner within the ToolJet dashboard. Click on the **Start free trial** button inside this banner to initiate your 14-day trial. - -
    - -TJ Dashboard: Start free trial - -
    - -:::caution Note -Your trial subscription is active for 14 days. To upgrade to our Business subscription, simply click the Upgrade or Renew button or connect with our team on Slack for the Enterprise subscription. Premium features like OpenID SSO login and Audit logs will be restricted after the trial ends. However, you can still upgrade to any of our premium plans and continue to enjoy the full benefits of ToolJet. -::: - -## Upgrading to a Paid Subscription - -When you've identified the ideal paid subscription to meet your needs, the next step is to complete the purchase process, ensuring seamless access to premium features. - -### A) Chosen Plan: Business Plan - -If you want to upgrade from the basic or trial subscription and you decide to proceed with the Business Plan, follow these steps: - -- Click the gear icon (⚙️) at the bottom of the left sidebar and select **Settings** from the dropdown. -- In the Settings page, choose the **Subscription** tab. -- The subscription tab displays a subscription overview card summarizing your current plan. Locate the **Upgrade** button in the lower left corner and click on it. -- A modal window will appear. Enter the desired number of builder and end user seats, then click the **Upgrade** button within the modal. -- You'll be directed to a payment gateway. Provide your payment details and finalize the purchase. -- 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 - -
    - -### B) Chosen Plan: Enterprise Plan - -- If you've selected the enterprise plan, expect a response from our team within 24-48 hours for onboarding. -- The remaining days of your enterprise edition period can be conveniently viewed on the dashboard. - -## Adding Users - -### A) Business Plan - -Your business plan subscription cost is based on the total number of builder and viewer seats allocated to your account. You may choose between annual or monthly billing cycles. - -**Seat Pricing** - -|
    Seat Type
    |
    Annual Billing
    |
    Monthly Billing
    | -| :------------ | :---------- | :------------ | -| Builder | $24 per month | $30 per month | -| End User | $8 per month | $10 per month | - -**Pro-rated charges for added seats** - -You only pay for the portion of the service you actually utilize, rather than being charged a full amount for a seat you might only use for a few days. If you add extra builder or viewer seats mid-cycle, charges are calculated proportionally. The cost is adjusted for the remaining days within your current billing period (monthly or annual). - -Example: If you add a builder seat halfway through your monthly billing cycle, you will be charged $15 for the remaining portion of that month. Starting with your next billing cycle, you will be charged the full monthly rate ($30) for the added builder seat. - -### B) Enterprise Plan - -- You can directly reach out to us via **[Slack](https://tooljet.com/slack)** or **[email](mailto:hello@tooljet.com)** and we will be happy to provide you the support. - -## Invoice History - -### A) Business Plan - -You can find your past invoices in the subscriptions overview card. Here's how to get there: - -- Click on the gear icon (⚙️) on the bottom left of the dashboard and select **Settings**. -- From the settings page, click on the **Subscriptions** tab. -- On the **Subscriptions** page, you'll see a subscription overview card summarizing your current plan. -- Click on the **View Invoices** button to access your invoice history. - -
    - -Invoice History - -
    - -### B) Enterprise Plan - -- You can directly reach out to us via **[Slack](https://tooljet.com/slack)** or **[email](mailto:hello@tooljet.com)** and we will be happy to provide you the support. - - -## Frequently Asked Questions (FAQs) - -### 1) How can I upgrade or renew my subscription? - -If your enterprise edition subscription is nearing expiration, please click the **Upgrade** button or contact us via email at hello@tooljet.com to extend your subscription. - -
    - -Upgrade Subscription - -
    - -### 2) What is the duration of my subscription? - -If you have an active subscription, you can find its validity period in the Settings. Generally, the duration of your subscription varies based on the type: - -- Trial subscriptions are valid for 14 days. -- Business subscriptions are charged monthly with no validity or expiration date. -- Enterprise subscriptions can be customized to suit your needs. - -### 3) What happens if my subscription expires? - -If your business or enterprise subscription expires, your instance will revert to operating as a free plan. While you can still create unlimited apps, workspaces, and add users, premium features such as OpenID and Audit logs will no longer be accessible. For further information, please refer to the relevant **[plans](https://www.tooljet.com/pricing)**. diff --git a/docs/docs/org-management/licensing/self-hosted.md b/docs/docs/org-management/licensing/self-hosted.md deleted file mode 100644 index cf19d3b556..0000000000 --- a/docs/docs/org-management/licensing/self-hosted.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -id: self-hosted -title: Self-Hosted ---- - -
    Available on: Paid plans
    - -## Setting up for Licensing - -This comprehensive guide aims to assist you in the process of configuring paid plans on your self-hosted platform. We offer three different licenses tailored to your specific requirements. Let's explore how to get the most out of ToolJet's powerful features! 🚀 - -Let's look into three types of licenses: - -1. **Trial License**: This is a free license that grants access to premium features for a 14-day trial period. - - **New Users**: Choose the 14-day trial during onboarding. - - **Existing Users**: Request a trial license key from our sales or support team. -2. **Business License**: This is a paid license that you can purchase **[directly](https://www.tooljet.com/pricing)**. -3. **Enterprise License**: This is a paid license with customizable options. To obtain this license, you have to contact our sales team. - - -
    - -## Updating Your Trial License Key (For Existing Users) - -If you are an existing user and wish to update your trial license key, follow these steps: - -1. Set up the instance and log in as a **[Super Admin](/docs/Enterprise/superadmin)**. -2. Navigate to the Settings page. -3. In the license key tab, make the necessary updates to the provided license key. -4. Within the license tab of the Settings page, you can access the limit tab, which displays the current status of available super admins, builders, and end users. - -:::caution Note -The trial license key will be valid for 14 days. To fully enjoy ToolJet, we recommend upgrading to premium plans within this period. If you wish to upgrade from the trial to the business or enterprise edition, you can click the **Upgrade or Renew** button or contact our team via **[Slack](https://tooljet.com/slack)**. Upon expiration, access to premium features like OpenID SSO login and Audit logs will be restricted, ensuring no data loss occurs. However, don't worry! You can still upgrade to any of our premium plans and enjoy the benefits of ToolJet. -::: - - -
    - -
    - -## Purchasing a Paid License - -When you've identified the ideal paid license to meet your needs, the next step is to complete the purchase process, ensuring seamless access to premium features. - -### A) Chosen Plan: Business Plan - -If you decide to proceed with the Business Plan and have made the purchase, please wait for our team to get back to you within 24-48 hours to get you onboarded. Once you receive the business license key, follow the steps to [update the license key](#updating-license-key). - -:::warning Important -The business license key will be valid for 3 months only. You can renew it to continue using ToolJet to its fullest potential. -::: - - -### B) Chosen Plan: Enterprise Plan - -- If you've selected the Enterprise Plan, expect a response from our team within 24-48 hours for onboarding. -- To update the enterprise license key, follow the steps outlined previously. -- The remaining days of your enterprise edition period can be conveniently viewed on the dashboard. - -
    - -
    - -## Updating License Key - -**To update the license key, follow these steps:** -1. Log in as a **[Super Admin](/docs/Enterprise/superadmin)**, ensuring that you are on the correct instance URL. -2. Go to the Settings page. -3. In the license key tab, update the provided license key. -4. Within the license tab of the Settings page, you can access the limit tab, which provides details about available super admins, builders, and end users. - -:::info Note -As a super admin, you can conveniently view the remaining days of your enterprise edition period on the dashboard. (Refer to screenshots below) -::: - -
    - -Licensing - -
    - -
    - -Licensing - -
    - -
    - -
    - -## Frequently Asked Questions (FAQs) - -### 1) How can I upgrade or renew my license? -If your business or enterprise edition license key is nearing expiration, please click the **Upgrade** button or contact us via email at hello@tooljet.com to obtain an extended license key. If you intend to increase the number of users, please reach out to us via **[Slack](https://tooljet.com/slack)** or review our pricing page at https://www.tooljet.com/pricing before making a request. - -
    - -Licensing - -
    - -Ref: Screenshot addressing upgrade/renew CTAs. Note that there are a couple of other pages which will display banners or CTAs, from where you can upgrade/renew. - -### 2) What is the duration of my license's validity? -If you have an active license, you can find its validity period in the Settings. Generally, the duration of your license varies based on the type: -- Trial licenses are valid for 14 days. -- Business licenses are valid for 3 months. -- Enterprise licenses can be customized to suit your needs. - -### 3) What happens if my license expires? -If your business or enterprise license key expires, your instance will revert to operating as a free plan. While you can still create unlimited apps, workspaces, and add users, premium features such as OpenID and Audit logs will no longer be accessible. For further information, please refer to the relevant **[plans](https://www.tooljet.com/pricing)**. - -### 4) How can I add more users? - -There are different methods to do this: - -**a)** You can renew directly using the **[business plan](https://www.tooljet.com/pricing)**. (Note: Please do check the list of premium features available with this plan) - -**b)** You can directly reach out to us via **[Slack](https://tooljet.com/slack)** or **[email](mailto:hello@tooljet.com)** and we will be happy to provide you the support. - -***Lastly, please keep in mind that your license key is private and strictly prohibited from being shared with any third parties.*** - -
    \ No newline at end of file diff --git a/docs/docs/org-management/permissions.md b/docs/docs/org-management/permissions.md deleted file mode 100644 index 593c222fe0..0000000000 --- a/docs/docs/org-management/permissions.md +++ /dev/null @@ -1,91 +0,0 @@ ---- -id: permissions -title: Permissions ---- - -# Permissions in ToolJet - -Permissions in ToolJet determine what actions users can perform and what resources they can access within a workspace. ToolJet uses a Role-Based Access Control (RBAC) system to manage these permissions efficiently. - -## User Roles - -ToolJet has three default user roles, each with different levels of access: - -1. **Admin**: Full access to manage the workspace, including users, groups, and all resources. -2. **Builder**: Can create and edit apps, data sources, and other resources. -3. **End-user**: Can only view and use apps they have been given access to. - -## Groups - -- **Default Groups**: Correspond to the user roles - Admin, Builder, and End-user. -- **Custom Groups**: Can be created to assign specific permissions to sets of users. - -:::info -For detailed information on Users and Groups, refer to the [Managing Users and Groups](../tutorial/manage-users-groups.md) documentation. -::: - -## Permission Levels - -Permissions can be set at two levels: workspace-level and granular level. This allows for both broad and fine-grained control over user access. - -### Workspace-Level Permissions - -Workspace-level permissions apply broadly to all resources of a particular type within the workspace. These are set in the **Permissions** tab of each user group. - -For each resource type, different levels of permissions can be set: - -- **Apps**: - - **Create**: Allows users to create new apps. - - **Delete**: Allows users to delete apps. -- **Data Sources**: - - **Create**: Allows users to create new data source connections. - - **Delete**: Allows users to delete data source connections. -- **Folders**: - - **Create/Update/Delete**: Allows users to create, update, or delete folders. -- **Workspace Constants/Variables**: - - **Create/Update/Delete**: Allows users to create, update, or delete workspace-level constants/variables. - - -
    -Workspace Level Permissions -
    - -### Granular Access Permissions - -For more fine-grained control, administrators can set permissions for individual resources in the **Granular Access** tab of each user group. - -
    -Granular Access -
    - -#### App-level Permissions: -- **Permissions**: - - **View**: Allows users to view and use the specific apps. - - **Edit**: Allows users to modify the specific apps in the app builder. -- **Resources**: Customize what apps that users can access. - - **All Apps**: Allows users to access all apps. - - **Custom**: Allows users to access specific apps. - -
    -App Level Permissions -
    - -#### Data Source Permissions: -- **Permissions**: - - **Configure**: Allows users to configure the specific data source. - - **View**: Allows users to view the specific data source. -- **Resources**: Customize what data sources that users can access. - - **All Data Sources**: Allows users to access all data sources. - - **Custom**: Allows users to access specific data sources. - -
    -Data Source Permissions -
    - -## Inheritance and Overrides - -- Users inherit permissions from their assigned role and any groups they belong to. -- Custom group permissions can override default role permissions. -- When a user belongs to multiple groups, they receive the highest level of permission granted by any of their groups. - ---- \ No newline at end of file diff --git a/docs/docs/org-management/smtp-configuration.md b/docs/docs/org-management/smtp-configuration.md deleted file mode 100644 index 675d23f95c..0000000000 --- a/docs/docs/org-management/smtp-configuration.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -id: smtp-configuration -title: SMTP Configuration ---- - -
    Available on: Paid plans
    - -# Configuring SMTP - -ToolJet uses SMTP (Simple Mail Transfer Protocol) to send emails for various purposes, including invitations and password reset requests. This guide will walk you through the process of configuring SMTP settings in ToolJet. -## Prerequisites - -Before you begin, ensure you have: -- Admin access to ToolJet -- SMTP server details from your email service provider - -:::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. - -For Community Edition, SMTP configuration will still be managed via environment variables. -::: - -## Configuration - -1. Navigate to the **Settings** section in ToolJet. -2. Select the **Email protocol (SMTP)** tab. -3. Toggle the switch to enable **Email protocol (SMTP)**. -4. Configure the following fields: - -
    -SMTP Configuration -
    -| Field | Description | Example | -|---------------|--------------------------|-----------------------------------| -| Host | SMTP server hostname | smtp.gmail.com | -| Port | SMTP server port number | 587 | -| User | SMTP account username | example@gmail.com/b2313d02f4f4jb | -| Password | SMTP account password | a13d0sd344 | -| Sender's email| Email address of the sender | example@gmail.com | - -5. Click **Save changes** to apply the new SMTP configuration. - -## Commonly Used Email Providers - -Here are some general settings for the most commonly used email providers: - -| Provider | Host | Port | Username | Password | Sender's email | -|--------------------|----------------------|------------------|---------------|-----------|----------------| -| Gmail | smtp.gmail.com | 587 or 465 (SSL) | Email | Password | Email | -| Yahoo Mail | smtp.mail.yahoo.com | 465 (SSL) | Email | Password | Email | -| Outlook.com/Hotmail| smtp.office365.com | 587 or 465 (SSL) | Email | Password | Email | -| Zoho Mail | smtp.zoho.com | 587 or 465 (SSL) | Email | Password | Email | -| SendGrid | smtp.sendgrid.net | 587 or 465 (SSL) | apikey | API key | Email | -| Mailgun | smtp.mailgun.org | 587 or 465 (SSL) | SMTP username | Password | Email | - -:::info -For SendGrid and Mailgun, the sender's email can be different from the username, subject to the provider's verification requirements. The username for SendGrid is **apikey**, and the password is your API key. For Mailgun, you usually use a specific SMTP username and password provided by Mailgun, not your regular email credentials. -::: \ No newline at end of file diff --git a/docs/docs/org-management/workspaces/workspace-variables-migration.md b/docs/docs/org-management/workspaces/workspace-variables-migration.md deleted file mode 100644 index f1d05dcd22..0000000000 --- a/docs/docs/org-management/workspaces/workspace-variables-migration.md +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: workspace-variables-migration -title: Workspace Variables Migration Guide ---- - - -Workspace variables are currently marked as deprecated, indicating that it will be removed in future releases. This guide will help you migrate from Workspace Variables to Workspace Constants. Workspace Constants are designed to be resolved on the server-side only, ensuring a high level of security. You can assign users to a specific role and provide create, update, and delete access to Workspace Constants based on the role. By default, the Workspace admin has full access to Workspace Constants. - - -## Syntax - -The syntax for using **Workspace Constants** is different from **Workspace Variables**. For example, if you have a variables named **psql_host**, we used to use `%%client.psql_host%%` but for Workspace Constants, we use `{{constants.psql_host}}`. Since Workspace Constants are resolved only on the server-side, there is no option to use them in the client-side. - -## Migrating from Workspace Variables to Workspace Constants - -To migrate from Workspace Variables to Workspace Constants, follow these steps: - -- Access the ToolJet Dashboard and navigate to Workspace Settings. -- Select the Workspace Constants tab. -- Click on the **Create New Constant** button. -- A drawer will appear. Enter the desired name and value for the constant. -- Click the **Add Constant** button to save the constant. -- Repeat the above steps for all the Workspace Variables. - -
    - -Workspace constants: create - -
    - -Once you have migrated all the Workspace Variables to Workspace Constants, you can replace the Workspace Variables in your apps with their corresponding Workspace Constants. - -### Replacing Client Workspace Variables with Workspace Constants - -- Navigate to the app or data source where you want to replace the Workspace Variables. -- Replace the Workspace Variables with their corresponding Workspace Constants. -- For example, if you have a Client Workspace Variable like `%%client.pi%%`, replace it with `{{constants.pi}}`. - -
    -Workspace constants -
    - -### Replacing Server Workspace Variables with Workspace Constants -- Navigate to the app or data source where you want to replace the Workspace Variables. -- Replace the Workspace Variables with their corresponding Workspace Constants. -- For example, if you have a Server Workspace Variable like `%%server.psql_host%%`, replace it with `{{constants.psql_host}}`. - -
    -Workspace constants -
    - - -### Deleting Workspace Variables - -Once you have migrated all the Workspace Variables to Workspace Constants, and tested your apps, you can delete the Workspace Variables. To delete a Workspace Variable, follow these steps: - -- Navigate to the Workspace Variables tab in the Workspace Settings. -- Click on the delete icon next to the Workspace Variable you want to delete. - -
    -Workspace constants -
    \ No newline at end of file diff --git a/docs/docs/org-management/workspaces/workspace-variables.md b/docs/docs/org-management/workspaces/workspace-variables.md deleted file mode 100644 index 88c4630ab5..0000000000 --- a/docs/docs/org-management/workspaces/workspace-variables.md +++ /dev/null @@ -1,100 +0,0 @@ ---- -id: workspace-variables -title: Workspace Variables ---- - -:::caution -Workspace variables are currently marked as deprecated, indicating that it will be removed in future releases. In the current version, you are still able to delete existing variables and use it through out any ToolJet apps, but creating and updating variables are no longer supported. - -Please use [Workspace Constants](/docs/org-management/workspaces/workspace_constants) instead. -::: - -Workspace Variables are the variables with some value(usually tokens/secret keys/API keys) that can be used in different apps across the same Workspace. - -:::note -Server variables will not resolve if you use bracket notation. This is because bracket notation is not supported on the server-side, where server variables are resolved. If you use bracket notation in a query that is executed on the server, the query will fail. To avoid this, use dot notation to resolve workspace variables in queries. -::: - -
    - -## How Can We Add these Variables to a Workspace? - -Suppose there is an `API key` or a value that you want to use in the queries or widgets in the multiple apps of the same Workspace then the Workspace admin or the user with permissions can add an environment variable. - -#### Adding the environment variable -- Go to the ToolJet Dashboard, and click on the dropdown on the navigation bar to show `Workspace` options -- Select `Manage Environment Variables` -- Click on `Add New Variable` button -- Give a `Name` to the variable, set the value, choose `Type`, toggle `Encryption`, and click **Add Variable** button -- Now this variable can be used inside any application of this Workspace - -
    - -add variable - -
    - -
    - -
    - -### Types of variables - -- **Client**: The client variable can be utilized in components, queries, and global datasources. - -- **Server**: The server variables can be employed in all queries except for `RunJS` and the connection form for global datasources. The restriction on using server variables with components is due to their resolution occurring solely during runtime, ensuring a high level of security. - -:::info -Variable Type cannot be changed once it has been created. -::: - -
    - -variable-type - -
    - -
    - -
    - -### Encryption - -This feature enables us to add a client variable with and without `encryption`. The server variables are always encrypted by default. - -
    - -
    - -### Using Variable in an App - -Let's use the variable that we created [here](/docs/org-management/workspaces/workspace-variables#adding-the-environment-variable). If you have used ToolJet before, then you know that for getting the values from any variable we use JS notation i.e. `{{}}` but for using the Workspace variables we have different opening and closing notation `%% %%`. The environment variables will not work inside js code `{{}}`. - -So, the syntax for using the variable that we created before will be `%%client.pi%%` - -**Example for client variable usage:** - -
    - -variable-usage - -
    - -**Example for server variable usage:** - -
    - -server-variable-usage - -
    - -Starting from ToolJet version `2.10.0` and onwards, it is possible to utilize Server-type workspace variables in the global datasources connection form. - -
    - -server-variable-usage - -
    - - -
    \ No newline at end of file diff --git a/docs/docs/org-management/workspaces/workspace_constants.md b/docs/docs/org-management/workspaces/workspace_constants.md deleted file mode 100644 index d58457cc06..0000000000 --- a/docs/docs/org-management/workspaces/workspace_constants.md +++ /dev/null @@ -1,161 +0,0 @@ ---- - -id: workspace_constants -title: Workspace Constants and Secrets - ---- - -Workspace constants and secrets are predefined values that can be used across your application to maintain consistency, facilitate easy updates, and securely store sensitive information. This document will guide you through the usage and management of workspace constants and secrets within your workspaces. - -
    - -## Types of Constants - -ToolJet offers two types of constants: - -1. **Global Constants**: Used for reusable values that can be applied consistently across the product. -2. **Secrets**: Used for secure storage of sensitive data. - -
    - -
    - -## Characteristics and Usage - -| Characteristic | Global Constants | Secrets | -|----------------|-------------------|---------| -| App Builder | ✔️ | ❌ | -| Data Sources | ✔️ | ✔️ | -| Data Queries | ✔️ | ✔️ | -| Workflows | ✔️ | ❌ | -| Encrypted in DB| ✔️ | ✔️ | -| Masked in FE | ❌ | ✔️ | -| Naming Convention | `{{constants.constant_name}}` | `{{secrets.secret_name}}` | - -
    -:::info -Secrets cannot be used in RunJS or RunPy queries. -::: - - -
    - -## Environment-Specific Configurations - -Users can define environment-specific configurations by setting different values for constants and secrets across environments. This is useful for managing sensitive information such as API keys, database credentials, or external service endpoints which may vary between different environments. For example, you can set different API keys for development, staging, and production environments. -
    - -
    -Environment-Specific Constants -
    - -
    - -## Server-Side Resolution and Security - -Both workspace constants and secrets are resolved on the server side only. This ensures that sensitive data remains secure and is not exposed to the client-side. All constants and secrets are encrypted before being stored in the database, providing an additional layer of security. - -
    - -
    - -## Access Control - -Creating, updating, and deleting constants and secrets are exclusive privileges granted to **Admins**. Workspace constants and secrets are specific to the workspace where they are created and cannot be utilized in other workspaces. - -
    - -
    - -## Creating Workspace Constants and Secrets - -To create workspace constants or secrets, follow these steps: - -1. Access the ToolJet Dashboard and click on the Workspace Constants tab from the left sidebar. -3. Click on the **Create new constant** button. -4. A drawer will appear. Enter the desired name and value for the constant or secret. -5. Select one of the following types: - - **Global constant** - - **Secret** -6. Click the **Add constant** button to save. - -
    -Create New Constant -
    - -:::info -Once a constant or secret is created, its type cannot be changed. You'll need to delete it and create a new one of the desired type. -::: - -
    - -
    - -## Using Global Constants - -Global constants can be used in the app builder, data sources, data queries, and workflows. - -### In App Builder - -Inside the App Builder, you'll find the **Inspector** on the left sidebar with a Constants section displaying all available global constant values. - -
    -Use Global Constants Inside App Builder -
    - -### In Data Sources and Queries - -You can use global constants in datasource connection forms and queries using the syntax `{{constants.constant_name}}`. - -**Data Source Connection Form**: - -
    -Use Global Constants Data Source Connection Form -
    - -**Inside Queries in Query Manager**: - -
    -Use Global Constants Inside Queries in Query Manager -
    - -
    - -
    - -## Using Secrets - -Secrets are designed for secure storage of sensitive information like API keys, database credentials, and encryption keys. - -### In Data Sources and Queries - -You can use secrets in datasource connection forms and queries using the syntax `{{secrets.secret_name}}`. The values of secrets will be masked in the frontend and cannot be viewed except in the workspace constant dashboard. - -**Data Source Connection Form**: - -
    -Use Secrets in Data Source Connection Form -
    - -**Inside Queries in Query Manager**: - -
    -Use Secrets Inside Queries in Query Manager -
    - - -:::info -Secrets cannot be used within the App Builder or workflows. -::: - -
    - -
    - -## Best Practices - -- Use global constants for reusable values that are frequently used across your application. -- Use secrets for storing sensitive information that should not be exposed in the codebase or frontend. -- Regularly review and update your constants and secrets to ensure they remain relevant and secure. - -
    diff --git a/docs/docs/org-management/workspaces/workspace_overview.md b/docs/docs/org-management/workspaces/workspace_overview.md deleted file mode 100644 index 074cb28ee4..0000000000 --- a/docs/docs/org-management/workspaces/workspace_overview.md +++ /dev/null @@ -1,53 +0,0 @@ ---- -id: workspace_overview -title: 'Workspace: Overview' ---- - -# Workspace: Overview - -The user who creates the workspace will automatically be assigned as its administrator. - -
    - -multi workspace - -
    - -
    - -## Hierarchy - -
    - -tooljet workspace - -
    - -
    - -
    - -## Permissions - -:::tip -Please check the detailed doc on **[Permissions](/docs/org-management/permissions)**. -::: - -- Administrators can manage [users and groups](/docs/tutorial/manage-users-groups) of each workspace. -- Applications and settings cannot be shared between workspaces. -- Users authorized to login to ToolJet will not have access to all workspaces. Users must be invited to or sign up for a workspace before they can log in. -- When the Multi-Workspace feature is enabled, users must log in with a username and password. -- Administrators can configure authentication methods for their workspaces. -- If password login is enabled, switching to the workspace will happen without any other authorization since the user is already authorized with password login. -- If a user is logged into ToolJet and switches to a workspace that only uses Single Sign-On (SSO), the user will be sent to a login page to select an SSO option. -- Users can directly login to a workspace using workspace login URL. Administrators can view the URL in the Workspace Settings under **SSO -> General Settings -> Login URL**. - -
    - -
    - -### Disabling Workspace Creation (Super Admin) -- Only **[Super Admins](/docs/Enterprise/superadmin#restrict-creation-of-personal-workspace-of-users)** can disable the option for creating personal workspaces for a user. -- If the option to make personal workspaces is turned off for a user, the user won't be able to create new workspaces. - -
    \ No newline at end of file diff --git a/docs/docs/project-overview/release-notes.md b/docs/docs/project-overview/release-notes.md index af772c31d5..35ed093e79 100644 --- a/docs/docs/project-overview/release-notes.md +++ b/docs/docs/project-overview/release-notes.md @@ -12,29 +12,29 @@ This document outlines the key improvements introduced in ToolJet 3.0, a major u 1. Up to 10 times faster app loading speeds 2. Smooth app development even with 1000s of components and 100s of queries 2. More intuitive experience in designing applications on the canvas with the new grid system -4. Highly configurable **[page management system](/docs/beta/tutorial/pages)** -5. Revamped **[components](/docs/beta/widgets/table/table-properties/)** with more styling and functionality customizations -6. Enhanced developer experience in managing queries with the **[new query manager UI](/docs/beta/app-builder/query-panel)** +4. Highly configurable **[page management system](/docs/tutorial/pages)** +5. Revamped **[components](/docs/widgets/table/)** with more styling and functionality customizations +6. Enhanced developer experience in managing queries with the **[new query manager UI](/docs/app-builder/query-panel)** 7. Improved coding experience with better code suggestions, linting, and type-casting 8. Better debugging with easy-to-understand error messages 9. Theme settings: Light/dark/auto mode at the application level ## Platform Enhancements -1. **[Group Sync OIDC](/docs/beta/user-authentication/sso/oidc/)**: Easily manage user access to ToolJet applications from your Identity Provider (IDP) directly -2. **[Secrets constants](/docs/beta/org-management/workspaces/workspace_constants/#using-secrets)**: Ability to store encrypted credentials -3. **[User metadata](/docs/beta/tutorial/manage-users-groups/#user-metadata)**: Store custom metadata with user details & access them while building applications +1. **[Group Sync OIDC](/docs/user-management/sso/oidc/setup)**: Easily manage user access to ToolJet applications from your Identity Provider (IDP) directly +2. **[Secrets constants](/docs/security/constants/#using-secrets)**: Ability to store encrypted credentials +3. **[User metadata](/docs/user-management/onboard-users/user-metadata)**: Store custom metadata with user details & access them while building applications 4. User roles: Revamped user groups with granular access control -5. **[User APIs](/docs/beta/tutorial/tooljet-api/#get-all-users)**: External API for creating and managing users +5. **[User APIs](/docs/tooljet-api#get-all-users)**: External API for creating and managing users 6. Security fixes: Various improvements to enhance platform security ## ToolJet Database (TJ DB) -1. **[Custom primary key](/docs/beta/tooljet-db/database-editor/#primary-key)** and **[foreign key support](/docs/beta/tooljet-db/database-editor/#foreign-key)** +1. **[Custom primary key](/docs/tooljet-db/constraints/primary-key)** and **[foreign key support](/docs/tooljet-db/constraints/foreign-key)** 2. Support for more data types for advanced use cases -3. **[SQL mode](/docs/beta/tooljet-db/querying-tooljet-db#sql-editor)** for complex querying +3. **[SQL mode](/docs/tooljet-db/querying-tooljet-db#sql-editor)** for complex querying 4. Bulk upload using CSV -5. GUI for **[complex SQL queries](/docs/beta/tooljet-db/querying-tooljet-db#gui-mode)** like joins, aggregates, and group by +5. GUI for **[complex SQL queries](/docs/tooljet-db/querying-tooljet-db#gui-mode)** like joins, aggregates, and group by ## Integrations @@ -50,21 +50,21 @@ This document outlines the key improvements introduced in ToolJet 3.0, a major u ## AI Apps -Build AI apps using **[OpenAI](/docs/beta/marketplace/plugins/marketplace-plugin-openai)**, and **[Portkey](/docs/beta/marketplace/plugins/marketplace-plugin-portkey)** integrations +Build AI apps using **[OpenAI](/docs/marketplace/plugins/marketplace-plugin-openai)**, and **[Portkey](/docs/marketplace/plugins/marketplace-plugin-portkey)** integrations ## Workflows -1. Introduction of **[loop node](/docs/beta/workflows/nodes#loop-node)** to implement iterative processes +1. Introduction of **[loop node](/docs/workflows/nodes#loop-node)** to implement iterative processes 2. Improved error handling and debugger: Improved troubleshooting 3. Support for multiple deployment environments -4. **[Webhook triggers](/docs/beta/workflows/workflow-triggers#webhooks)** to trigger workflows from external apps and services -5. **[Multiple result nodes](/docs/beta/workflows/results)** for greater flexibility in defining the output +4. **[Webhook triggers](/docs/workflows/workflow-triggers#webhooks)** to trigger workflows from external apps and services +5. **[Multiple result nodes](/docs/workflows/results)** for greater flexibility in defining the output ## Migration Steps Ready to upgrade to ToolJet 3.0? Follow our migration guides: -- **[For Self-Hosted Users](/docs/beta/setup/upgrade-to-v3)** -- **[For Cloud Users](/docs/beta/setup/cloud-v3-migration)** +- **[For Self-Hosted Users](/docs/setup/upgrade-to-v3)** +- **[For Cloud Users](/docs/setup/cloud-v3-migration)** This release significantly enhances ToolJet's capabilities across its platform, focusing on improved performance, expanded integrations, and smoother development experience for building complex applications. The addition of AI-powered features and the release of Workflows provide users with advanced tools for creating sophisticated, automated solutions. diff --git a/docs/docs/release-management/multi-env.md b/docs/docs/release-management/multi-env.md deleted file mode 100644 index 2739aac27c..0000000000 --- a/docs/docs/release-management/multi-env.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -id: multi-environment -title: Multi-Environment ---- - -
    Available on: Paid plans
    - -ToolJet's **multi-environment** helps in streamlining workflows, thereby minimizing the chances of errors, and enables effective application management. Using multi-environment ensures that your ToolJet application is rigorously tested before it is made available to users. - -
    - -Multi-Environment - -
    - -
    - -### Environments - -ToolJet provides three default **environments** that serve different purposes in the application development lifecycle: - -1. **Development**: The Development environment is where app development and testing take place. It is a dedicated space for spp builders to build and experiment with app changes, configure components, and test app functionality. In this environment, app builders can make frequent updates, iterate on features, and debug issues without impacting the live production environment. - -2. **Staging**: The Staging environment serves as a pre-production environment where app changes are tested before they are deployed to the live production environment. It closely resembles the production environment and is used to validate the functionality, performance, and compatibility of the app in a realistic setting. Staging allows stakeholders, including testers and product managers, to review and provide feedback on the app before it is released to the public. - -3. **Production**: The Production environment is the live and publicly accessible version of the app that is used by end-users. It represents the stable and finalized version of the application that has passed through the development and staging stages. The Production environment is intended for real-world usage and serves the application to users, providing them with the expected functionality and experience. - -:::info -The default environments cannot be removed or renamed. -::: - -
    - -
    - -### Configuring Connections for Environments - -To configure connection settings for different environments, follow these steps: - -1. Go to the **[Data Source](/docs/data-sources/overview)** page. -2. Click on each category of data sources to view the list of available data sources. As you hover over the desired data source, an **Add** button will appear. -3. On clicking the **Add** button, a connection modal will appear. In the connection modal, you'll find three tabs: **Production**, **Staging**, and **Development**. -4. Switch to each tab and enter the appropriate credentials for connecting to the respective database. Remember to **save** after entering credentials on each tab. - -
    - -Multi-Environment - -
    - -
    - -
    - -### Using Environments - -
    - -Multi-Environment - -
    - -1. When you create a new app in ToolJet, the initial version is loaded in the **Development** environment. It is only possible to create new versions from the Development environment, not from the Staging or Production environments. - -
    - - Multi-Environment - -
    - -2. Once the development of a particular app version is complete, it can be promoted to the **Staging** environment. To promote the app from development to staging, click the **Promote>>** button located at the top-right of the app builder. - - When you click the Promote button, a confirmation modal will appear. Click **Promote>>** to move the app version to the Staging environment. - -
    - - Multi-Environment - -
    - - - Please note that once versions are promoted from Development, they cannot be edited. To make changes to the promoted versions, you need to switch back to the Development environment and create a new version. - -
    - - Multi-Environment - -
    - -3. In the Staging environment, the selected app version can undergo testing and reviews. - - If **changes are required** for the version in staging, switch to the **Development** environment using the dropdown on the top bar. Since the version has already been promoted to Staging, you cannot directly edit it. Instead, create a new version from the selected version and make the desired changes to the newly created version. - -
    - - Multi-Environment - -
    - - - After making changes in the new version, the app builder will automatically save the changes and enable the **Promote** button. You can then promote the new version to the Staging environment for further testing and reviews. - :::info - Please note that Development, Staging, and Production environments can contain any number of versions. - ::: - -4. Once the version in the Staging environment has been thoroughly tested and reviewed and **no further changes are required**, it can be promoted to the **Production** environment. Simply click the **Promote>>** button located at the top-right to move the app from the Staging environment to the Production environment. - -
    - - Multi-Environment - -
    - -5. In the **Production** environment, you can release the app by clicking the Release button on the top-right corner of the app builder. Once the app is released, you can share it with end users using the URL provided by the **Share** button on the top bar. - -
    - - Multi-Environment - -
    - - :::info - Please note that only one version of the app can be released at a time. - ::: - -ToolJet's app builder remembers your last editing state. When you reopen an app, it resumes from where you left off, ensuring a seamless experience. For instance, if you edited an app in the staging environment, it will open in the staging environment when you return. - - -
    \ No newline at end of file diff --git a/docs/docs/security.md b/docs/docs/security.md deleted file mode 100644 index e24d703e2e..0000000000 --- a/docs/docs/security.md +++ /dev/null @@ -1,43 +0,0 @@ ---- -id: security -title: Security -slug: /security ---- - -# Security - -
    - -## Uncompromised Data Security with SOC 2 Compliance - -With SOC 2 compliance, ToolJet ensures the highest level of data security. The adherence to SOC 2 standards mirrors the rigorous data protection measures in place, covering everything from encryption to robust access controls. It also guarantees a consistent level of service availability and process integrity, instilling confidence in our customers and stakeholders about the safe handling of their sensitive information. - -
    - -
    - -## Data Storage - -ToolJet does not store data returned from your data sources. ToolJet server acts as a proxy and passes the data as it is to the ToolJet client. The credentials for the data sources are handled by the server and never exposed to the client. For example, if you are making an API request, the query is run from the server and not from the frontend. - -
    - -
    - -## Datasource Credentials -All the datasource credentials are securely encrypted using `aes-256-gcm`. The credentials are never exposed to the frontend ( ToolJet client ). - -
    - -
    - -## Other Security Features -- **TLS**: If you are using ToolJet cloud, all connections are encrypted using TLS. We also have documentation for setting up TLS for self-hosted installations of ToolJet. -- **Audit logs**: Audit logs are available on the enterprise edition of ToolJet. Every user action is logged along with the IP addresses and user information. -- **Request logging**: All the requests to server are logged. If self-hosted, you can easily extend ToolJet to use your preferred logging service. ToolJet comes with built-in Sentry integration. -- **Whitelisted IPs**: If you are using ToolJet cloud, you can whitelist our IP address (34.86.81.252) so that your datasources are not exposed to the public. -- **Backups**: ToolJet cloud is hosted on AWS using EKS with autoscaling and regular backups. - -If you notice a security vulnerability, please let the team know by sending an email to `security@tooljet.com`. - -
    \ No newline at end of file diff --git a/docs/docs/Enterprise/audit_logs.md b/docs/docs/security/audit-logs.md similarity index 97% rename from docs/docs/Enterprise/audit_logs.md rename to docs/docs/security/audit-logs.md index e4e55bde46..a8fb0e3714 100644 --- a/docs/docs/Enterprise/audit_logs.md +++ b/docs/docs/security/audit-logs.md @@ -1,10 +1,17 @@ --- -id: audit_logs -title: Audit logs +id: audit-logs +title: Audit Logs --- -
    Available on: Paid plans
    - +
    + Icon + Paid feature +
    The audit log is the report of all the activities done in your ToolJet account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address. @@ -152,7 +159,7 @@ Here, `{process_id}` is a placeholder for the unique process identifier, and `{d | -------- | --------------------------------------------------------------------------- | | LOG_FILE_PATH | the path where the log file will be created ( eg: tooljet/log/tooljet-audit.log) | -
    +
    Example Log file data ```bash diff --git a/docs/docs/security/compliance.md b/docs/docs/security/compliance.md new file mode 100644 index 0000000000..d6dc34bd5b --- /dev/null +++ b/docs/docs/security/compliance.md @@ -0,0 +1,55 @@ +--- +id: compliance +title: Compliance +--- + +## Uncompromised Data Security with SOC 2 Type II Compliance + +With SOC 2 Type II compliance, ToolJet ensures the highest level of data security. The adherence to SOC 2 Type II standards mirrors the rigorous data protection measures in place, covering everything from encryption to robust access controls. It also guarantees a consistent level of service availability and process integrity, instilling confidence in our customers and stakeholders about the safe handling of their sensitive information. + +## Data Protection +We take extensive measures to protect your data. All data transmitted between users and our servers is encrypted using TLS to prevent unauthorized access during transit. Sensitive data stored on our servers is encrypted at rest, following industry-standard protocols. Access to this data is tightly controlled through role-based permissions, ensuring only authorized personnel can access sensitive information. + +We also adhere to a **GDPR-compliant data deletion policy**, ensuring that personal data is permanently removed from our servers upon user request or at the end of the data retention period. Furthermore, we maintain comprehensive audit logs to track data access and modifications for monitoring and compliance purposes. + +## Compliance and Certifications +We adhere to globally recognized standards for data security and compliance. ToolJet meets the requirements of the following certifications: + +**GDPR**: ToolJet fully complies with the General Data Protection Regulation (GDPR), ensuring your personal data is processed and stored securely. + +**SOC 2**: We undergo regular SOC 2 Type II audits to validate our commitment to maintaining high security, availability, and confidentiality standards. + +**ISO 27001**: ToolJet follows the ISO 27001 standard for information security management, ensuring a systematic approach to managing sensitive information. + +## Incident Response +We continuously monitor our systems for suspicious activities or security incidents. In the event of a security breach, we have a detailed incident response plan in place. This plan ensures immediate action is taken to contain the breach, communicate with affected parties, and implement remediation steps to prevent future incidents. + +## Secure Development Practices +We adhere to globally recognized standards for data security and compliance. ToolJet meets the requirements of the certifications below. + +We undergo regular **SOC 2 Type II audits** to validate our commitment to maintaining high standards in security, availability, and confidentiality. + +## User Responsibility +We encourage all our users to practice good security habits to enhance security further. This includes creating strong, unique passwords for ToolJet accounts and enabling two-factor authentication for added protection. Users should also keep their devices and applications updated to guard against vulnerabilities. + + +## Data Storage + +ToolJet does not store data returned from your data sources. ToolJet server acts as a proxy and passes the data as it is to the ToolJet client. The credentials for the data sources are handled by the server and never exposed to the client. For example, if you are making an API request, the query is run from the server and not from the frontend. + + +## Datasource Credentials +All the datasource credentials are securely encrypted using `aes-256-gcm`. The credentials are never exposed to the frontend ( ToolJet client ). + +## Privacy Policy +ToolJet takes privacy seriously. Our transparent privacy policies ensure customers understand how their data is collected, stored, and processed. We adhere to privacy regulations in all regions in which we operate. + +## Other Security Features +- **TLS**: If you are using ToolJet cloud, all connections are encrypted using TLS. We also have documentation for setting up TLS for self-hosted installations of ToolJet. +- **Audit logs**: Audit logs are available on the enterprise edition of ToolJet. Every user action is logged along with the IP addresses and user information. +- **Request logging**: All the requests to server are logged. If self-hosted, you can easily extend ToolJet to use your preferred logging service. ToolJet comes with built-in Sentry integration. +- **Whitelisted IPs**: If you are using ToolJet cloud, you can whitelist our IP address (34.86.81.252) so that your datasources are not exposed to the public. +- **Backups**: ToolJet cloud is hosted on AWS using EKS with autoscaling and regular backups. + +If you notice a security vulnerability, please let the team know by sending an email to [security@tooljet.com](mailto:security@tooljet.com). + diff --git a/docs/docs/security/constants/constants.md b/docs/docs/security/constants/constants.md new file mode 100644 index 0000000000..db21d12e0f --- /dev/null +++ b/docs/docs/security/constants/constants.md @@ -0,0 +1,133 @@ +--- +id: constants +title: Workspace Constants +--- + +ToolJet allows you to set workspace constants to store pre-defined values that can be used across your application to maintain consistency, facilitate easy updates, and securely store sensitive information. Workspace constants are specific to the workspace where they are created and cannot be accessed in other workspaces. To enhance security, all constants and secrets are encrypted before being stored in the database, providing an additional layer of protection for sensitive data. + +There are two types of constants: +1. **Global Constants:** These are predefined values that can be used across your applications within a workspace. They allow you to store frequently used values, such as API URLs, configuration settings, etc. and access them within the workspace. Global Constants are resolved on the client side. +2. **Secret Constants:** These are a specific type of workspace constants designed for securely storing sensitive information like API keys and database credentials. Secrets are masked and stored in encrypted format to prevent exposure to unauthorized users. Secret Constants are resolved on the server side, preventing exposure to the client.
    + **Note**: Secret Constants cannot be used in RunJS or RunPy queries. + +## Characteristics and Usage + +| Characteristic | Global Constants | Secrets | +|-------------------------|:-----------------------------:|:-------------------------:| +| Components | ✅ | ❌ | +| Data Queries * | ✅ | ✅ | +| Data Sources | ✅ | ✅ | +| Workflows | ✅ | Coming Soon | +| Encrypted in DB | ✅ | ✅ | +| Masked in Frontend | ❌ | ✅ | +| Resolved on Client Side | ✅ | ❌ | +| Resolved on Server Side | ❌ | ✅ | +| Naming Convention | `{{constants.constant_name}}` | `{{secrets.secret_name}}` | + +***Note**: +1. Secret Constants cannot be used in RunJS or RunPy queries. +2. Secret Constants can only be used as a singular key and can't be used in a composite key manner. + +## Environment Specific Configurations + +ToolJet allows users to define environment-specific configurations by assigning different values to constants and secrets across various environments. This approach is essential for managing sensitive information, such as API keys, database credentials, and external service endpoints, which may differ between development, staging, and production environments. + +For example, you can configure unique API keys for each environment to ensure seamless integration and security. + +Environment-Specific Constants + +## Creating Workspace Constants + +Workspace constants/variables permissions is needed to Create, Update or Delete workspace constants, refer to **[Access Control](/docs/user-management/role-based-access/access-control)** guide for more information. After having the required permission, follow these steps to create a workspace constant: + +1. Navigate to the Workspace Constants tab from the left sidebar in ToolJet dashboard.
    + (Example URL - `https://app.corp.com/nexus/workspace-constants`) + Environment-Specific Constants + +2. Click on **Create new constant** button to open the configuration drawer. + Create New Constant + +3. Enter a name and value for the workspace constant. + +4. Select the type of workspace constant: + - **Global constant** + - **Secret** + +5. Click the **Add constant** button to save. + +:::info +Once a constant or secret is created, its type cannot be changed. You'll need to delete it and create a new one of the desired type. +::: + +## Accessing Workspace Constants + +### Global Constants + +Global constants can be accessed using the syntax `{{constants.constant_name}}` can be used in the [app builder](#in-app-builder), data sources, data queries, and workflows. + +#### In App Builder + +Inside the App Builder, you can find all the constants inside the inspector element on the left sidebar. + +Use Global Constants Inside App Builder + +#### In Data Sources and Queries + +Global constants in ToolJet allow you to define values once and reuse them across your data sources and queries. + +- Data Source Connection Form: + Use Global Constants Data Source Connection Form + +- Inside Queries in Query Manager: + Use Global Constants Inside Queries in Query Manager + +### Using Secrets + +Secrets are designed for secure storage of sensitive information like API keys, database credentials, and can be access using the syntax `{{secrets.secret_name}}`. + +#### In Data Sources and Queries + +In Data Sources and Queries, secret values are masked in the frontend and can only be viewed in the Workspace Constants dashboard. + +- Data Source Connection Form: + Use Secrets in Data Source Connection Form + +- Inside Queries in Query Manager: + Use Secrets Inside Queries in Query Manager + +## Mapping Workspace Constants from Environment Variables + +From version **`v3.5.8-ee-lts`**, you can use environment variables to set global and secret constants. Workspace constants set using environment variables will have a `.env` tag in front of them. If there are two constants with the same name, the one set through the environment variable will be used in the app builder, while the constant set through the UI will have a `duplicate` tag in front of it. + +Users cannot edit or delete constants created from environment variables through the UI. To add, update, or delete any values from an environment variable, the container must be restarted. + +Mapping Workspace Constants from Environment Variables + +### Setting Global Constants + +**Setting Individual Global Constant** + +Syntax - `TOOLJET_GLOBAL_CONSTANTS____constant_name` + +Example - TOOLJET_GLOBAL_CONSTANTS__development__companyName = "Corp Pvt. Ltd." + +**Setting Multiple Global Constants** + +Syntax - `TOOLJET_GLOBAL_CONSTANTS__ = {“name1”: “value1", “name2”: “value2"}` + +Example - TOOLJET_GLOBAL_CONSTANTS__development = `{"company1": "corp.com", "company2": "example.com"}` + + +### Setting Secret Constants + +**Setting Individual Global Constant** + +Syntax - `TOOLJET_SECRET_CONSTANTS____constant_name` + +Example - TOOLJET_SECRET_CONSTANTS__development__apiKey = "agdagdagdg" + +**Setting Multiple Global Constants** + +Syntax - `TOOLJET_SECRET_CONSTANTS__ = {“name1”: “value1", “name2”: “value2"}` + +Example - TOOLJET_SECRET_CONSTANTS__development = `{"api_url": "https://api.example.com", "password" : "12345", "key" : "agdagdagdg"}` diff --git a/docs/docs/security/constants/variables.md b/docs/docs/security/constants/variables.md new file mode 100644 index 0000000000..478d9ec353 --- /dev/null +++ b/docs/docs/security/constants/variables.md @@ -0,0 +1,51 @@ +--- +id: variables +title: Workspace Variables Migration +--- + +
    + Icon + Deprecated +
    + + + +

    + +Workspace variables were used in ToolJet to store values such as tokens, secret keys, API keys, etc. But currently **Workspace variables are marked as deprecated, indicating that it will be removed in future releases**. In the current version, you are still able to delete existing variables and use it through out any ToolJet apps, but creating and updating variables are no longer supported. + +Please use **[Workspace Constants](/docs/security/constants/)** instead. This guide will help you migrate from **Workspace Variables** to **Workspace Constants**. + +## Workspace Constants + +Workspace Constants are predefined values that enhance consistency, simplify updates, and securely store sensitive information across applications within a workspace. Unlike other variables, they are resolved exclusively on the server side, ensuring a high level of security by preventing client-side exposure. Refer to **[Workspace Constants](/docs/security/constants/)** guide for more information. + +## Migrating from Workspace Variables to Workspace Constants + +To migrate from Workspace Variables to Workspace Constants, you need to create new constants and store each value, follow the steps in **[Creating Workspace Constants](/docs/security/constants/#creating-workspace-constants)** guide. + +Once you have migrated all the Workspace Variables to Workspace Constants, you can replace the Workspace Variables in your apps with their corresponding Workspace Constants. + +### Replacing Workspace Variables with Workspace Constants + +- Navigate to the app or data source where you want to replace the Workspace Variables. +- Replace the Workspace Variables with their corresponding Workspace Constants.
    + For example, if you have a Client Workspace Variable like `%%client.pi%%`, replace it with `{{constants.pi}}`.
    + Workspace constants + + Workspace constants + +### Deleting Workspace Variables + +After migrating all Workspace Variables to Workspace Constants and thoroughly testing your applications, you can delete the Workspace Variables. To remove a Workspace Variable, follow these steps: + +1. Navigate to the Workspace Variables tab in the Workspace Settings.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-variables`) + +2. Click on the delete icon next to the Workspace Variable you want to delete. + Workspace constants \ No newline at end of file diff --git a/docs/docs/setup/azure-container.md b/docs/docs/setup/azure-container.md index 4c08ce2d05..86cf41493e 100644 --- a/docs/docs/setup/azure-container.md +++ b/docs/docs/setup/azure-container.md @@ -9,8 +9,6 @@ title: Azure container apps Please note that you need to set up a PostgreSQL database manually to be used by ToolJet. Additionally, you must set up a Redis service through Azure Cache for Redis. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - ## Deploying ToolJet application 1. Open the Azure dashboard at https://portal.azure.com, navigate to Container Apps, and click on "Create container app". @@ -34,10 +32,28 @@ Please note that you need to set up a PostgreSQL database manually to be used by - - Make sure to provide the image tag, and then enter `server/entrypoint.sh, npm, run, start:prod` in the "Command override" field. + - Make sure to provide the image tag, and then enter `server/entrypoint.sh, npm, run, start:prod` in the "Arguments override" field. - Add the following ToolJet application variables under the "Environmental variable" section. You can refer to this [**documentation**](/docs/setup/env-vars) for more information on environment variables. - **Note: For the minimal setup, ToolJet requires: `TOOLJET_HOST`, `PG_HOST`, `PG_DB`, `PG_USER`, `PG_PASSWORD`, `SECRET_KEY_BASE` & `LOCKBOX_MASTER_KEY` keys in the secret.** + **Note**: ToolJet requires: + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** + + For redis connection ensure below environment variables are added: + - **REDIS_HOST** + - **REDIS_PORT** + - **REDIS_USER** + + If using Azure Database for Postgresql-Flexible server, add: + - **PGSSLMODE = require**
    @@ -109,7 +125,7 @@ If you already have Redis configured, you can use your existing setup. Otherwise ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -119,5 +135,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/choose-your-tooljet.md b/docs/docs/setup/choose-your-tooljet.md index 2afcf0d9c2..3999c5bb4f 100644 --- a/docs/docs/setup/choose-your-tooljet.md +++ b/docs/docs/setup/choose-your-tooljet.md @@ -1,6 +1,6 @@ --- id: choose-your-tooljet -title: Choose Your ToolJet +title: Deployment Version --- ToolJet versions are categorized into three main types: **Long-Term Support (LTS)**, **Pre-Release**, and **Past versions**. Understanding these categories helps users choose the most suitable version for their needs. @@ -10,27 +10,41 @@ ToolJet versions are categorized into three main types: **Long-Term Support (LTS We highly recommend using LTS versions for most users. These versions are prioritized for bug fixes, updates, and overall stability, ensuring a reliable experience. LTS versions are ideal for production environments where stability and consistent performance are crucial. 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) +[Docker Hub - LTS Versions](https://hub.docker.com/r/tooljet/tooljet/tags?page_size=&ordering=&name=ee-lts) + +:::info +Starting from **`v3.5.0-ee-lts`** all releases are AI releases. 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://tooljet.ai/slack) or send us an email at hello@tooljet.com. +::: | Version | Release Date | Docker Pull Command | |---------|--------------|----------------------| -| Latest EE-LTS | N/A | `docker pull tooljet/tooljet:EE-LTS-latest` | -| [EE-LTS-2.50.9.45](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.45/images/sha256-cb0030d66415ac52d156608fee2de8ce400cd4b2a7b3f865be331d13d939c883?context=explore) | October 24, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.45` | -| [EE-LTS-2.50.9.44](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.44/images/sha256-739781626ba3b7a61890d5e6b633099fee12e0e14aa3d176ceafe102f4b4ca98?context=explore) | October 9, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.44` | -| [EE-LTS-2.50.9.43](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.43/images/sha256-5d1cdd349872279ff23da9332dc0ec71c4ad637b35b728c44211f21fd206fa1c?context=explore) | October 3, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.43` | -| [EE-LTS-2.50.9.42](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.42/images/sha256-767102dd525db7e4f2770d55db5a5862d1cc1507f752722d6eb24bae609fada7?context=explore) | September 30, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.42` | -| [EE-LTS-2.50.9.41](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.41/images/sha256-d36444747af6f81d4456ca4d1f7dcf92c3e77e13e23ca9407c22de1c62451bd7?context=explore) | September 24, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.41` | -| [EE-LTS-2.50.9.40](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.40/images/sha256-26338b926568dc514c26988f6cd01f84bb3edf950fac08982365fabb95900f78?context=explore) | September 18, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.40` | -| [EE-LTS-2.50.9.39](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.39/images/sha256-6f1b7a00432e0e29a05adb375d3ddd9da877d6eb53d489be14ca0061953bbb57?context=explore) | September 12, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.39` | -| [EE-LTS-2.50.9.38](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.38/images/sha256-1974afb5f8483f4bfb7bf7575d7d8b4f0f7747dd7c88139cbf559c3ce8b1fdbd?context=explore) | September 12, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.38` | -| [EE-LTS-2.50.9.37](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.37/images/sha256-b1a13a5424bf14af77bb455f39e07d2a774303bcf4286aa7bd6d0a78c1a58e59?context=explore) | September 11, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.37` | -| [EE-LTS-2.50.9.36](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.36/images/sha256-969ae46a17c5873882641b7e23b02e087874194d9546e0a55d21d49044becd9e?context=explore) | September 10, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.36` | -| [EE-LTS-2.50.9.35](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.35/images/sha256-8a1b0014d470aff108ad75fd6982e01696740f2154a3bb49f08671b93d55485b?context=explore) | September 3, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.35` | -| [EE-LTS-2.50.9.34](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.34/images/sha256-95af52997ec5b42fd5435bfef2f8996d0acc8234ae0541e155705ea4c689b272?context=explore) | August 30, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.34` | -| [EE-LTS-2.50.9.33](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.33/images/sha256-e231b959a7e5e1455235d344ceffeaa34b482d925d9676e5169f58e966c59fbb?context=explore) | August 26, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.33` | -| [EE-LTS-2.50.9.32](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.32/images/sha256-e231b959a7e5e1455235d344ceffeaa34b482d925d9676e5169f58e966c59fbb?context=explore) | August 26, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.32` | -| [EE-LTS-2.50.9.31](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.31/images/sha256-9610b8a125ea622a4b07c17657c44e04e1b582df8a18c228bab3a876cdc49407?context=explore) | August 26, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.31` | -| [EE-LTS-2.50.9.30](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.30/images/sha256-a7b0967aca4c4d29e423a78e91a7084073e2750d0a67fa2a8926d0da5eaf4ad4?context=explore) | August 21, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.30` | +| Latest EE-LTS | N/A | `docker pull tooljet/tooljet:ee-lts-latest` | +| [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` | +| [v3.0.21-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.21-ee-lts/images/sha256-88de45e3e32df48c7451a9f6ae505f985ca7a32d2b59c3a4ba9f9da992e8cafe?context=explore) | December 20, 2024 | `docker pull tooljet/tooljet:v3.0.21-ee-lts` | +| [v3.0.20-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.20-ee-lts/images/sha256-898f75a8c6a879014b890a47fa8fd6d2be41ea7f77d549bc2616e0db84788fd2?context=explore) | December 20, 2024 | `docker pull tooljet/tooljet:v3.0.20-ee-lts` | +| [v3.0.19-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.19-ee-lts/images/sha256-eb873525f3fe3a5838fcf72d38d1b9d4ffcb661f59e9af4c466f0041de882a0e?context=explore) | December 17, 2024 | `docker pull tooljet/tooljet:v3.0.19-ee-lts` | +| [v3.0.18-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.18-ee-lts/images/sha256-89e309a8a3a40c967e3bddfbb82adff9332d6b72322cf5ad40f575c03bf7dab1?context=explore) | December 12, 2024 | `docker pull tooljet/tooljet:v3.0.18-ee-lts` | +| [v3.0.17-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.17-ee-lts/images/sha256-0777d52d83a93b3729f8a9b1e6e63a66e9e7bef913adad5eda655a9a009540e0?context=explore) | December 9, 2024 | `docker pull tooljet/tooljet:v3.0.17-ee-lts` | +| [v3.0.16-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.16-ee-lts/images/sha256-9602149f5538af46288f6a33c9c239c336444781ee308c8866d3dca3a747660f?context=explore) | December 9, 2024 | `docker pull tooljet/tooljet:v3.0.16-ee-lts` | +| [v3.0.15-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.15-ee-lts/images/sha256-1fc16533d34695715debb1f3394b18a18431342c1b0d82ff168c5e936cff5d2e?context=explore) | December 5, 2024 | `docker pull tooljet/tooljet:v3.0.15-ee-lts` | +| [v3.0.14-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.14-ee-lts/images/sha256-aa12b3de3d09e4c1122050ee2dd0550152d7d7777d4f75953f4e9d55d652aa2f?context=explore) | December 3, 2024 | `docker pull tooljet/tooljet:v3.0.14-ee-lts` | +| [v3.0.13-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.13-ee-lts/images/sha256-1e469017cb03245eb1ad457219ac60a293d0f9e1b365d0dabf77cf4272cabe58?context=explore) | December 2, 2024 | `docker pull tooljet/tooljet:v3.0.13-ee-lts` | +| [v3.0.12-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.12-ee-lts/images/sha256-7c0aec97e1d630c827d42b21fb9aee853730ea72026f4c89630b6f2f6ce4bca5?context=explore) | November 29, 2024 | `docker pull tooljet/tooljet:v3.0.12-ee-lts` | +| [v3.0.11-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.11-ee-lts/images/sha256-2c102a11d7f497804586368e2e1f350ee386551c7ab5063b298aa68c9c5853dd?context=explore) | November 29, 2024 | `docker pull tooljet/tooljet:v3.0.11-ee-lts` | +| [v3.0.10-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.10-ee-lts/images/sha256-4839e8f18427b47859287c76058a0964d029eeaf8f4c4825c7d77fdb371eb857?context=explore) | November 28, 2024 | `docker pull tooljet/tooljet:v3.0.10-ee-lts` | +| [v3.0.9-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.9-ee-lts/images/sha256-bec9665a3ef51acbf8e93c5ebc47227dc4fd6cb8084d4ad811a808a46edb743d?context=explore) | November 27, 2024 | `docker pull tooljet/tooljet:v3.0.9-ee-lts` | +| [v3.0.8-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.8-ee-lts/images/sha256-8b4658e7d5c8f795b55d4187cc6acddabb9463e33bb62624d0ce3710c887ef0c?context=explore) | November 27, 2024 | `docker pull tooljet/tooljet:v3.0.8-ee-lts` | +| [v3.0.7-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.7-ee-lts/images/sha256-4e5e2b52279a127a001c1c7e93893794799fe8cdb40b15203220d030d4c415ce?context=explore) | November 26, 2024 | `docker pull tooljet/tooljet:v3.0.7-ee-lts` | +| [v3.0.6-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.6-ee-lts/images/sha256-52632c7d70f6334c84d7e3945bf118a4a627eb0081f29420eb3af7788e53f989?context=explore) | November 26, 2024 | `docker pull tooljet/tooljet:v3.0.6-ee-lts` | +| [v3.0.5-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.5-ee-lts/images/sha256-daa03ea3ef9a6a94032476fae0f57f6828869863690346fa325a5937746fe5f6?context=explore) | November 25, 2024 | `docker pull tooljet/tooljet:v3.0.5-ee-lts` | +| [v3.0.4-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.4-ee-lts/images/sha256-7dc2041bdb98674f1058381fbbc93d167ba1a66238e642c6f0cb599987a87ec1?context=explore) | November 20, 2024 | `docker pull tooljet/tooljet:v3.0.4-ee-lts` | +| [v3.0.3-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.3-ee-lts/images/sha256-ba3596677cfb885a91197c1187191afb6eabd7dd8f7f6fdb20514ce716182f8f?context=explore) | November 18, 2024 | `docker pull tooljet/tooljet:v3.0.3-ee-lts` | +| [v3.0.2-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.2-ee-lts/images/sha256-6cb558e5e3337c7fc1b9ffc830ce7096f19253ff5f2fad177afdb46fb0b0ea9d?context=explore) | November 13, 2024 | `docker pull tooljet/tooljet:v3.0.2-ee-lts` | +| [v3.0.1-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.1-ee-lts/images/sha256-b4f2e0779f76db07606ddd8a688cb7e06824837be3f507026ff91bb235efcc1d?context=explore) | November 12, 2024 | `docker pull tooljet/tooljet:v3.0.1-ee-lts` | +| [v3.0.0-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.0-ee-lts/images/sha256-989f1370c502e97555dd7e669f896ef6ba2ad1d4f317c53335105bf937b5b189?context=explore) | November 12, 2024 | `docker pull tooljet/tooljet:v3.0.0-ee-lts` | :::info Users are encouraged to upgrade to the latest LTS version to ensure they benefit from the latest improvements and maintain a secure and efficient environment. @@ -40,10 +54,8 @@ Users are encouraged to upgrade to the latest LTS version to ensure they benefit Pre-Release versions are designed for those looking to explore the latest features and advancements in ToolJet. These versions are experimental and may include new functionalities not yet available in LTS versions. However, due to their experimental nature, they may also contain bugs and lack the stability of LTS versions. Therefore, we advise against using Pre-Release versions in production environments. -*All versions starting from **2.60.x.x** are considered Pre-Release versions.* +*All versions starting from **3.1.x.x** are considered Pre-Release versions.* ## Past versions (Not maintained anymore) -Past versions of ToolJet are those that are no longer actively maintained or supported. These versions may still be available but are not recommended, especially in production environments, as they do not receive updates, bug fixes, or security patches. - -*Versions **2.45.x.x** and all earlier versions are considered past versions and are no longer maintained.* \ No newline at end of file +Past versions of ToolJet are those that are no longer actively maintained or supported. These versions may still be available but are not recommended, especially in production environments, as they do not receive updates, bug fixes, or security patches. \ No newline at end of file diff --git a/docs/docs/setup/client.md b/docs/docs/setup/client.md deleted file mode 100644 index 375ec45aee..0000000000 --- a/docs/docs/setup/client.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -id: client -title: Deploying ToolJet client ---- - -# Deploying ToolJet client - -ToolJet client is a standalone application and can be deployed on static website hosting services such as Netlify, Firebase, S3/Cloudfront, etc. - -You can build standalone client with the below command: -```bash -SERVE_CLIENT=false npm run build -``` - -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - -## Deploying ToolJet client on Firebase - -:::tip -You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend and also set `SERVE_CLIENT` to `false`` for standalone client build. - -For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.com npm run build && firebase deploy` -::: - -1. Initialize firebase project - ```bash - firebase init - ``` - Select Firebase Hosting and set build as the static file directory -2. Deploy client to Firebase - ```bash - firebase deploy - ``` - -## Deploying ToolJet client with Google Cloud Storage - -:::tip -You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend. - - -For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.io npm run build` -::: - -#### Using Load balancer - -ToolJet client can be hosted from Cloud Storage bucket just like hosting any other static website. -Follow the instructions from google documentation [here](https://cloud.google.com/storage/docs/hosting-static-website). - -Summarizing the steps below: -1. Create a bucket and upload files within the build folder such that the `index.html` is at the bucket root. - -2. Edit permissions for the bucket to assign *New principal* as `allUsers` with role as `Storage Object Viewer` and permit for public access for the bucket. - -3. Click on *Edit website configuration* from the [buckets browser](https://console.cloud.google.com/storage/browser?_ga=2.180838119.1530169400.1637242882-657891227.1637242882) and specify the main page as `index.html` - -4. Follow the [instructions](https://cloud.google.com/storage/docs/hosting-static-website#lb-ssl) on creating a load balancer for hosting a static website. - -5. Optionally, create Cloud CDN to use with the backend bucket assigned to the load balancer. - -6. After the load balancer is created there will be an IP assigned to it. Try hitting it to check the website is being loaded. - -7. Use the load balancer IP as the static IP for the A record of your domain. - -#### Using Google App Engine - -1. Upload the build folder onto a bucket - -2. Upload `app.yaml` file onto bucket with the following config - - ```yaml - runtime: python27 - api_version: 1 - threadsafe: true - - handlers: - - url: / - static_files: build/index.html - upload: build/index.html - - - url: /(.*) - static_files: build/\1 - upload: build/(.*) - ``` - -3. Activate cloud shell on your browser and create build folder - ```bash - mkdir tooljet-assets - ``` - -4. Copy the uploaded files onto an assets folder which is to be served - ```bash - gsutil rsync -r gs://your-bucket-name/path-to-assets ./tooljet-assets - ``` - -5. Deploy static assets to be served - ```bash - cd tooljet-assets && gcloud app deploy - ``` - -## 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`. - -If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. - -#### Prerequisites for Upgrading to the Latest LTS Version: - -- 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. - -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. diff --git a/docs/docs/setup/cloud-v3-migration.md b/docs/docs/setup/cloud-v3-migration.md index f7b2b824de..1b20da7f3a 100644 --- a/docs/docs/setup/cloud-v3-migration.md +++ b/docs/docs/setup/cloud-v3-migration.md @@ -163,6 +163,10 @@ After November 11th, applications with the old Kanban Board component will crash - Update all queries and components using these data sources - Test all affected components and queries after migration +#### Action Required After Upgrade + +If you haven't migrated your local data sources to global data sources, you will encounter an error message indicating that local data sources are no longer supported. For detailed instructions on migrating from Local Data Sources to the new Data Sources, please refer to our [Local Data Sources Migration Guide](/docs/data-sources/local-data-sources-migration). + ### Workspace Variables #### Action Required @@ -174,7 +178,7 @@ After November 11th, applications with the old Kanban Board component will crash Workspace Constants are designed to be resolved on the server-side only, ensuring a high level of security. You can assign users to a specific role and provide create, update, and delete access to Workspace Constants. -For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](https://docs.tooljet.com/docs/beta/org-management/workspaces/workspace-variables-migration). +For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](/docs/security/constants/variables). ## Response Headers and Metadata @@ -196,7 +200,7 @@ Now, you should use: {{queries..metadata}} ``` -The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/beta/data-sources/restapi/metadata-and-cookies/#metadata). +The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/data-sources/restapi/metadata-and-cookies/#metadata). ## Help and Support diff --git a/docs/docs/setup/digitalocean.md b/docs/docs/setup/digitalocean.md index a85e9c0d56..1f4b640cdd 100644 --- a/docs/docs/setup/digitalocean.md +++ b/docs/docs/setup/digitalocean.md @@ -1,116 +1,78 @@ --- id: digitalocean -title: DigitalOcean +title: DigitalOcean --- -# Deploying ToolJet on DigitalOcean - -Now you can quickly deploy ToolJet using the Deploy to DigitalOcean button. - -If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. - -### Redis setup - -:::info -ToolJet requires configuring Redis which is used for enabling multiplayer editing and for background jobs. -::: - -Follow the steps below to configure Redis database: - -1. Navigate to **Database** and create a database cluster. +Follow the steps below to deploy ToolJet on a DigitalOcean Droplet. +**1. Navigate to the Droplets section in DigitalOcean.** +
    - ToolJet - Deploy on DigitalOcean + create a Droplet
    -2. Select `Redis` from the database engine and add a unique name to the cluster and click on **Create Database cluster**. +**2. Configure the **Droplet** with the following options:** + + - **Image**: Ubuntu + - **Plan**: Choose a plan (e.g., Basic, 4GB RAM, 2 vCPU)
    - - ToolJet - Deploy on DigitalOcean - + use a droplet plan
    + + - **Auth**: For authentication, use password or ssh + - Click **Create Droplet** and note the assigned public IP -3. Once the set-up is complete, add the Redis connection string in the environmental variable of `tooliet-app`. +**3. Create a Firewall for the **Droplets** to allow required ports.** + + protocol | port | allowed_cidr| + :---| :---------- | :---------- | + tcp | 22 | your IP | + tcp | 80 | 0.0.0.0/0 | + tcp | 443 | 0.0.0.0/0 | -## Deploying +**4. Connect to the **Droplets** via SSH.** + +**5. Install Docker and Docker Compose using the following commands:** -#### Follow the steps below to deploy ToolJet on DigitalOcean: +```bash +apt update && apt upgrade -y +apt install -y docker.io +``` -1. Click on the button below to start one click deployment +Enable and start Docker: -
    +```bash +systemctl enable docker +systemctl start docker +``` - [![Deploy to DigitalOcean](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/ToolJet/ToolJet/tree/main) +Install Docker Compose: -
    +```bash +apt install -y curl +curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose +chmod +x /usr/local/bin/docker-compose +``` -2. A new tab will open up, sign-in to your DigitalOCean account. Once signed-in, the **Create App** page will open up and **Resources** will be already selected. Click on **Next** button. +Verify installation: -
    +```bash +docker --version +docker-compose --version +``` - ToolJet - Deploy on DigitalOcean - Resources +**6. Update the `TOOLJET_HOST` in the `.env` file:** -
    +`TOOLJET_HOST=http://:80` -3. Now, on **Environment Variables** page you can add new variables or edit the existing ones. Check the [environment variables here](/docs/setup/env-vars). - - Also, please add the redis url in the environment variable `REDIS_URL= #connection string` - -
    - - ToolJet - Deploy on DigitalOcean - Environment Variables - -
    - -4. On the next page, you can change the **App name**, **Project**, and the **Region**. - -
    - - ToolJet - Deploy on DigitalOcean - Launch - -
    - -5. On the last page, you'll be asked to **Review** all the app details such that we entered before such as **Resources**, **Environment Variables**, **Region**, and there will also be **Billing** section at the end. Review all the details and click the **Create Resource** button. - -
    - - ToolJet - Deploy on DigitalOcean - Launch - -
    - -6. Once you click the **Create Resource** button, the build will begin. Once the build is complete, you'll see the resource and a **URL** next to it. Click on the URL to open the deployed **ToolJet**. - -:::tip -ToolJet server and client can be deployed as standalone applications. If you do not want to deploy the client on DigitalOcean, modify `package.json` accordingly. We have a [guide](/docs/setup/client) on deploying ToolJet client using services such as Firebase. -::: - -## Deploying ToolJet Database - -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. -You can learn more about this feature [here](/docs/tooljet-database). - -Follow the steps below to deploy ToolJet Database on DigitalOcean: - -1. If you are using dev database within ToolJet deployment, upgrade it to managed database. You could also add a separate database, if you intent use a different database, please refer the [environment variables](/docs/setup/env-vars#enable-tooljet-database--optional-) for additional env variables. - -2. Create a new app for PostgREST server. You can opt for docker hub to deploy PostgREST image of version `10.1.x`. - - ToolJet - Deploy on DigitalOcean - PostgREST resource - -3. Update the [environment variables](/docs/setup/env-vars#postgrest-server-optional) for PostgREST and expose the HTTP port `3000`. - - ToolJet - Deploy on DigitalOcean - PostgREST environment variables - -4. Add your newly created PostgREST app to the trusted sources of your managed or separate database. - -5. Update your existing ToolJet application deployment with [environment variables](/docs/setup/env-vars#enable-tooljet-database--optional-) required for PostgREST. +**7. Use the [Docker Documentation](https://docs.tooljet.ai/docs/setup/docker) to deploy ToolJet.** ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -120,4 +82,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. diff --git a/docs/docs/setup/docker.md b/docs/docs/setup/docker.md index 7adc581aa1..2f9dee8894 100644 --- a/docs/docs/setup/docker.md +++ b/docs/docs/setup/docker.md @@ -14,8 +14,6 @@ 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/). ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - ### Installing Docker and Docker Compose Install docker and docker-compose on the server. - Docs for [Docker Installation](https://docs.docker.com/engine/install/) @@ -35,16 +33,16 @@ Confused about which setup to select? Feel free to ask the community via Slack: 1. Download our production docker-compose file into the server. ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/docker-compose-db.yaml + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/docker-compose-db.yaml mv docker-compose-db.yaml docker-compose.yaml mkdir postgres_data ``` 2. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded as in step 1): - ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/.env.internal.example - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/internal.sh && chmod +x internal.sh + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/.env.internal.example + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/internal.sh && chmod +x internal.sh mv .env.internal.example .env && ./internal.sh ``` @@ -102,7 +100,7 @@ curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/backup-re 2. Download our production docker-compose file into the server. ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/docker-compose.yaml + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/docker-compose.yaml ``` 3. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded as in step 1): @@ -116,8 +114,8 @@ curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/backup-re
    ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/.env.external.example - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/external.sh && chmod +x external.sh + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/external.sh + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/docker/.env.external.example && chmod +x external.sh mv .env.external.example .env && ./external.sh ``` @@ -154,7 +152,7 @@ curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/backup-re ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -164,9 +162,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - - - - - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/ec2.md b/docs/docs/setup/ec2.md index 55008fdc47..10d94327ea 100644 --- a/docs/docs/setup/ec2.md +++ b/docs/docs/setup/ec2.md @@ -9,8 +9,6 @@ title: AWS EC2 You should setup a PostgreSQL database manually to be used by the ToolJet server. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - 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 EC2 instances. To deploy all the services at once, simply employ the following template: @@ -21,16 +19,11 @@ curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/cloudformation/E Follow the steps below to deploy ToolJet on AWS EC2 instances. 1. Setup a PostgreSQL database and make sure that the database is accessible from the EC2 instance. - 2. Login to your AWS management console and go to the EC2 management page. - -3. Under the `Images` section, click on the `AMIs` button. - +3. Under the **Images** section, click on the **AMIs** button. 4. Find the [ToolJet version](https://github.com/ToolJet/ToolJet/releases) you want to deploy. Now, from the AMI search page, select the search type as "Public Images" and input the version you'd want `AMI Name : tooljet_vX.X.X.ubuntu_bionic` in the search bar. - -5. Select ToolJet's AMI and bootup an EC2 instance. - - Creating a new security group is recommended. For example, if the installation should receive traffic from the internet, the inbound rules of the security group should look like this: +5. Select ToolJet's AMI and bootup an EC2 instance.
    + Creating a new security group is recommended. For example, if the installation should receive traffic from the internet, the inbound rules of the security group should look like this: protocol| port | allowed_cidr| ----| ----------- | ----------- | @@ -39,19 +32,22 @@ Follow the steps below to deploy ToolJet on AWS EC2 instances. tcp | 443 | 0.0.0.0/0 | -6. Once the instance boots up, SSH into the instance by running `ssh -i ubuntu@` +6. Once the instance boots up, SSH into the instance by running `ssh -i ubuntu@`. -7. Switch to the app directory by running `cd ~/app`. Modify the contents of the `.env` file. ( Eg: `vim .env` ) +7. Switch to the app directory by running `cd ~/app`.
    Modify the contents of the `.env` file. ( Eg: `vim .env` ) The default `.env` file looks like this: ```bash - TOOLJET_HOST=http:// - LOCKBOX_MASTER_KEY= - SECRET_KEY_BASE= - PG_DB=tooljet_prod - PG_USER= - PG_HOST= - PG_PASS= + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + PG_DB= + PG_USER= + PG_HOST= + PG_PASS= + TOOLJET_DB= + TOOLJET_DB_HOST= + TOOLJET_DB_USER= + TOOLJET_DB_PASS= ``` Read **[environment variables reference](/docs/setup/env-vars)** @@ -59,38 +55,65 @@ Follow the steps below to deploy ToolJet on AWS EC2 instances. 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. ::: -8. `TOOLJET_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. +8. `TOOLJET_DB_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. Examples: - `TOOLJET_HOST=http://12.34.56.78` or - `TOOLJET_HOST=https://yourdomain.com` or - `TOOLJET_HOST=https://tooljet.yourdomain.com` + `TOOLJET_DB_HOST=http://12.34.56.78` or + `TOOLJET_DB_HOST=https://yourdomain.com` or + `TOOLJET_DB_HOST=https://tooljet.yourdomain.com` :::info We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. ::: :::info - Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + Please make sure that `TOOLJET_DB_HOST` starts with either `http://` or `https://` ::: 9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. - 10. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the EC2 instance. - 12. You're all done, ToolJet client would now be served at the value you've set in `TOOLJET_HOST`. #### Deploying ToolJet Database ToolJet AMI comes inbuilt with PostgREST. If you intend to use this feature, you'd only have to setup the environment variables in `~/app/.env` file and run `./setup_app` script. -You can learn more about this feature [here](/docs/tooljet-database). +You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +## 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. + +### Enabling Scheduling + +To activate workflows scheduling, set the following environment variables: + +```bash +WORKFLOW_WORKER=true +ENABLE_WORKFLOW_SCHEDULING=true +TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default +TEMPORAL_SERVER_ADDRESS= +``` + +**Note**: Workflows scheduling requires a Temporal server to be deployed. Restarting the server using `./setup_app`. + +### Deploying Temporal with Docker Compose + +Below is a `docker-compose` template to set up Temporal. + +``` +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/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. ## 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`. +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`. -If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. +**Note**: If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. #### Prerequisites for Upgrading to the Latest LTS Version: @@ -98,10 +121,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - - - - - - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/ecs.md b/docs/docs/setup/ecs.md index 4b75185004..02ecc0e303 100644 --- a/docs/docs/setup/ecs.md +++ b/docs/docs/setup/ecs.md @@ -23,6 +23,8 @@ If you already have existing services and wish to integrate ToolJet seamlessly i curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/cloudformation/Cloudformation-deploy.yml ``` +
    + ## Redis :::info @@ -34,144 +36,98 @@ To deploy Redis on an ECS cluster, please follow the steps outlined below. Please note that if you already have an existing Redis setup, you can continue using it. However, if you need to create a new Redis service, you can follow the steps provided below. - Create a new take definition - -
    - ECS Setup - -
    - - -- Please add container and image tag as shown below: +- Please add container and image tag as shown below:
    **Make sure that you are using redis version 6.x.x** - -
    - ECS Setup -
    - -- Ensure that when creating a service, Redis is integrated into the same cluster where your ToolJet app will be deployed. - +- Ensure that when creating a service, Redis is integrated into the same cluster where your ToolJet app will be deployed.
    **Note: Please enable public IP** - -
    - ECS Setup -
    +
    + +
    ## ToolJet 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. +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 + 4. Add container details that is shown:
    + Specify your container name ex: `ToolJet`
    + Set the image you intend to deploy. ex: `tooljet/tooljet:ee-latest`
    + Update port mappings at container port `3000` for tcp protocol. + ECS Setup - i. Select Fargate as launch type compatibility - - ii. Configure IAM roles and set operating system family as Linux. - - iii. Select task size to have 3GB of memory and 1vCpu + 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 -
    + :::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_MASTER_KEY** +
    +
    + Read **[environment variables reference](/docs/setup/env-vars)** + ::: - ECS Setup - -
    - - iv. 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 - -
    - - 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 - -
    - - :::info - For the minimal setup, ToolJet requires: `TOOLJET_HOST`, `PG_HOST`, `PG_DB`, `PG_USER`, `PG_PASSWORD`, `SECRET_KEY_BASE` & `LOCKBOX_MASTER_KEY` keys in the secret. - - Read **[environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)** - ::: - - Additionally, include the Redis environment variables within the ToolJet container mentioned above if you have followed the previous steps to create Redis. - - ``` - REDIS_HOST= - REDIS_PORT=6379 - REDIS_USER=default - REDIS_PASSWORD= - ``` - - v. Make sure `Use log collection checked` and `Docker configuration` with the command `npm run start:dev` - -
    - - ECS Setup - -
    + Additionally, include the Redis environment variables within the ToolJet container mentioned above if you have followed the previous steps to create Redis. + ``` + REDIS_HOST= + REDIS_PORT=6379 + REDIS_USER=default + REDIS_PASSWORD= + ``` + 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 - -
    - + 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 - -
    - + 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 - -
    - + 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. ::: +
    + +
    ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. You can learn more about this feature [here](https://docs.tooljet.com/docs/tooljet-database). +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break, checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) +](./upgrade-to-v3.md) +- [Cloud](./cloud-v3-migration.md) Follow the steps below to deploy PostgREST on a ECS cluster. @@ -191,7 +147,7 @@ Follow the steps below to deploy PostgREST on a ECS cluster.
    - Under environmental variable please add corresponding PostgREST env variables. You can also refer [env variable](https://docs.tooljet.com/docs/setup/env-vars/#postgrest-server-optional). + Under environmental variable please add corresponding PostgREST env variables. You can also refer [env variable](/docs/setup/env-vars/#postgrest-server-required).
    @@ -225,11 +181,56 @@ Follow the steps below to deploy PostgREST on a ECS cluster.
    -Update ToolJet deployment with the appropriate env variables [here](https://docs.tooljet.com/docs/setup/env-vars/#enable-tooljet-database--optional-) and apply the changes. +Update ToolJet deployment with the appropriate env variables [here](/docs/setup/env-vars/#enable-tooljet-database-required) and apply the changes. + + + +## 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. + +### Enabling Workflow Scheduling + +Deploy the following containers under the same ToolJet app task definition family to enable workflow scheduling: + +**Worker Container:** +Use the `tooljet/tooljet:ee-latest`` image tag, and ensure it inherits environment variables from the ToolJet app container. + +To activate workflow scheduling, set these environment variables: + +```bash +WORKFLOW_WORKER=true +ENABLE_WORKFLOW_SCHEDULING=true +TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default +TEMPORAL_SERVER_ADDRESS= +``` + +Under the containers tab inside the Docker configuration, please make sure the command `npm, run, worker:prod` is added. + +
    + worker container +
    + + +#### Temporal server container: + +1. Use the image tag `temporalio/auto-setup:1.25.1`. Also ensure that in the App protocol, GRPC is selected. + +
    + Temporal server container +
    + + +2. Add the below env variables to the temporal container: + +
    + Temporal server container ENV's +
    + ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -239,5 +240,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/env-vars.md b/docs/docs/setup/env-vars.md index 1285773769..8ebff181ea 100644 --- a/docs/docs/setup/env-vars.md +++ b/docs/docs/setup/env-vars.md @@ -70,13 +70,6 @@ Use this environment variable to enable/disable the feature that allows you to a | COMMENT_FEATURE_ENABLE | `true` or `false` | ### Marketplace -#### Marketplace feature enable ( optional ) - -Use this environment variable to enable/disable the feature that allows users to use the marketplace. - -| variable | value | -| -------------------------- | ----------------- | -| ENABLE_MARKETPLACE_FEATURE | `true` or `false` | #### Enable Marketplace plugin developement mode ( optional ) @@ -92,11 +85,10 @@ Use this environment variable to enable/disable the developement mode that allow | ---------------- | ----------------------------------------------- | | USER_SESSION_EXPIRY | This variable controls the user session expiry time. By default, the session expires after **10** days. The variable expects the value in minutes. ex: USER_SESSION_EXPIRY = 120 which is 2 hours | -### Enable ToolJet Database ( optional ) +### Enable ToolJet Database (required) | variable | description | | -----------------------------| -------------------------------------------- | -| ENABLE_TOOLJET_DB | `true` or `false` | | TOOLJET_DB | Default value is `tooljet_db` | | TOOLJET_DB_HOST | database host | | TOOLJET_DB_USER | database username | @@ -104,13 +96,10 @@ Use this environment variable to enable/disable the developement mode that allow | TOOLJET_DB_PORT | database port | | PGRST_JWT_SECRET | JWT token client provided for authentication | | PGRST_HOST | postgrest database host | -| TOOLJET_DB_RECONFIG | `true` or `false` | -| TOOLJET_DB_STATEMENT_TIMEOUT | statement timeout in milliseconds | - -Use `ENABLE_TOOLJET_DB` to enable/disable the feature that allows users to work with inbuilt data store to build apps with. In order to set it up, [follow the instructions here](/docs/tooljet-db/tooljet-database/#enabling-the-tooljet-database-for-your-instance). +| PGRST_DB_PRE_CONFIG | postgrest.pre_config | :::tip -When this feature is enabled, the database name provided for `TOOLJET_DB` will be utilized to create a new database during server boot process in all of our production deploy setups. +The database name provided for `TOOLJET_DB` will be utilized to create a new database during server boot process in all of our production deploy setups. Incase you want to trigger it manually, use the command `npm run db:create` on ToolJet server. ::: @@ -153,7 +142,7 @@ Please note the subpath is to be set with trailing `/` and is applicable only wh ToolJet uses SMTP services to send emails (e.g., invitation emails when you add new users to your workspace). -For Enterprise Edition, you must configure SMTP settings through the user interface (UI) in the ToolJet Settings. For more information, see [SMTP Configuration](../org-management/smtp-configuration.md). +For Enterprise Edition, you must configure SMTP settings through the user interface (UI) in the ToolJet Settings. For more information, see [SMTP Configuration](/docs/org-setup/smtp-config). :::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. @@ -224,7 +213,7 @@ This is used to set up for CSP headers and put trace info to be used with APM ve | variable | description | | ------------------ | ------------------------------------------------------------ | -| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: `https://server.tooljet.com` ) | ### RELEASE VERSION ( optional) @@ -264,6 +253,14 @@ Configurations for instance level SSO. | SSO_ACCEPTED_DOMAINS | comma separated email domains that supports SSO authentication | | SSO_DISABLE_SIGNUPS | Disable user sign up if authenticated user does not exist | +### Enable Cookie Forwarding to REST API (Optional) + +By default, the ToolJet server does not forward cookies along with the REST API requests. You can enable this functionality by setting the `FORWARD_RESTAPI_COOKIES` environment variable to `true`. This option is available only in the self-hosted version of ToolJet. + +| variable | description | +| ----------------------- | ------------------------------------------------------------ | +| FORWARD_RESTAPI_COOKIES | `true` or `false` + ## ToolJet client ### Server URL ( optionally required ) @@ -272,7 +269,7 @@ This is required when client is built separately. | variable | description | | ------------------ | ------------------------------------------------------------ | -| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: `https://server.tooljet.com` ) | ### Server Port ( optional) @@ -289,27 +286,28 @@ This can be an absolute path, or relative to main HTML file. | variable | description | | ---------- | -------------------------------------------------------------- | -| ASSET_PATH | the asset path for the website ( eg: https://app.tooljet.com/) | +| ASSET_PATH | the asset path for the website ( eg: https://app.tooljet.ai/) | ### Serve client as a server end-point ( optional ) By default the client build will be done to be served with ToolJet server. If you intend to use client separately then can set `SERVE_CLIENT` to `false`. -## PostgREST server (Optional) +## PostgREST server (required) -| variable | description | -| ---------------- | ----------------------------------------------- | -| PGRST_JWT_SECRET | JWT token client provided for authentication | -| PGRST_DB_URI | database connection string for tooljet database | -| PGRST_LOG_LEVEL | `info` | +| variable | description | +| ------------------ | ----------------------------------------------- | +| PGRST_JWT_SECRET | JWT token client provided for authentication | +| PGRST_DB_URI | database connection string for tooljet database | +| PGRST_LOG_LEVEL | `info` | If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/docs/setup/google-cloud-run.md b/docs/docs/setup/google-cloud-run.md index f0df423cef..db2a5dc6d4 100644 --- a/docs/docs/setup/google-cloud-run.md +++ b/docs/docs/setup/google-cloud-run.md @@ -9,11 +9,8 @@ title: Google Cloud Run You should setup a PostgreSQL database manually to be used by ToolJet. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - Follow the steps below to deploy ToolJet on Cloud run with `gcloud` CLI. - ## Deploying ToolJet application 1. Create a new Google Cloud Run Service: @@ -23,9 +20,9 @@ Follow the steps below to deploy ToolJet on Cloud run with `gcloud` CLI. 2. Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per you see fit. -
    +
    ingress-auth -
    +
    3. Under 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: @@ -72,79 +69,88 @@ Click on deploy once the above parameters are set. 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. ::: -### Deploying ToolJet Database +## Deploying ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. - -#### PostgREST server +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break, checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: +- [Self Hosted](/docs/setup/upgrade-to-v3) 1. Cloud Run requires prebuilt image to be present within cloud registry. You can pull specific PostgREST image from docker hub and then tag with your project to push it to cloud registry. + ```bash + docker pull postgrest/postgrest:v12.0.2 + ``` - ```bash - gcloud auth configure-docker - docker pull postgrest/postgrest:v10.1.1.20221215 - docker tag postgrest/postgrest:v10.1.1.20221215 gcr.io/tooljet-test-338806/postgrest/postgrest:v10.1.1.20221215 - docker push gcr.io/tooljet-test-338806/postgrest/postgrest:v10.1.1.20221215 - ``` + Please run the above command by launching googleCLI which will help to push the PostgREST image to Google container registry. + +2. Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per you see fit. + + ingress-auth + + +3. Under containers tab, please make sure the port is set 3000 and CPU capacity is set to 1GiB. + + port-and-capacity-postgrest - Please run the above command by launching googleCLI which will help to push the PostgREST image to Google container registry. +4. Under environmental variable please add corresponding ToolJet database env variables. You can also refer [env variable](/docs/setup/env-vars/#enable-tooljet-database-required). -
    - CLI -
    +5. Please go to connection tab. Under Cloud SQL instance please select the PostgreSQL database which you have set-up for ToolJet application or the separate PostgreSQL database created respective to ToolJet Database from the drop-down option. + Cloud-SQL-instance -2. Once the PostgREST image is pushed. Click on create service. + Click on deploy once the above parameters are set. - Select and add the pushed PostgREST image as shown in below. + :::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. + ::: -
    - create-service-cloud-run-postgrest -
    +6. Additional Environmental variable to be added to ToolJet application or ToolJet Server connect to PostgREST server. You can also refer env variable [**here**](./env-vars/#enable-tooljet-database-required) + env-for-tooljet -3. Ingress and Authentication can be set as shown below, to begin with. Feel free to change the security configurations as per you see fit. +## Workflows -
    - ingress-auth -
    +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. +### Enabling Workflow Scheduling -4. Under containers tab, please make sure the port is set 3000 and CPU capacity is set to 1GiB. +Please deploy the below containers to enable workflows scheduling. -
    - port-and-capacity-postgrest -
    - -5. Under environmental variable please add corresponding ToolJet database env variables. You can also refer [env variable](/docs/setup/env-vars/#enable-tooljet-database--optional-). +#### Worker container: -6. Please go to connection tab. Under Cloud SQL instance please select the PostgreSQL database which you have set-up for ToolJet application or the separate PostgreSQL database created respective to ToolJet Database from the drop-down option. +You can use the same `tooljet/tooljet:ee-latest` image tag and ensure it has env variables from the tooljet-app container. +To activate workflow scheduling, set the following environment variables: -
    - Cloud-SQL-instance -
    - +```bash +WORKFLOW_WORKER=true +ENABLE_WORKFLOW_SCHEDULING=true +TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default +TEMPORAL_SERVER_ADDRESS= +``` -Click on deploy once the above parameters are set. +Under the containers tab, please make sure the command `npm, run, worker:prod` is 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. -::: +
    + ToolJet Worker Settings +
    +#### Temporal server container: +1. Set the image tag as `temporalio/auto-setup:1.25.1` -7. Additional Environmental variable to be added to ToolJet application or ToolJet Server connect to PostgREST server. You can also refer env variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-) +
    + Temporal Settings +
    +2. Add the below env variables to the temporal container: -
    - env-for-tooljet -
    +
    + Temporal Variables and Secrets +
    ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -154,4 +160,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. \ No newline at end of file +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/helm.md b/docs/docs/setup/helm.md index 3ed47dac3a..4a7e832f36 100644 --- a/docs/docs/setup/helm.md +++ b/docs/docs/setup/helm.md @@ -7,37 +7,33 @@ title: Helm This repository contains Helm charts for deploying [ToolJet](https://github.com/ToolJet/helm-charts) on a Kubernetes Cluster using Helm v3. The charts include an integrated PostgreSQL server that is enabled by default. However, you have the option to disable it and configure a different PostgreSQL server by updating the `values.yml` file. -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - ## Installation ### From Helm repo ```bash -helm repo add tooljet https://github.com/ToolJet/helm-charts.git +helm repo add tooljet https://tooljet.github.io/helm-charts helm install tooljet tooljet/tooljet ``` -### From the source +### From the Source 1. Clone the repository and navigate to this directory -2. Run `helm dependency update +2. Run `helm dependency update` 3. It is recommended but optional to modify the values in the `values.yaml` file, such as usernames, passwords, persistence settings, etc. 4. Run `helm install -n $NAMESPACE --create-namespace $RELEASE .` Remember to replace the variables with your specific configuration values. -**ToolJet Database** +## ToolJet Database ToolJet offers a hosted database solution that allows you to build applications quickly and manage your data effortlessly. The ToolJet database requires no setup and provides a user-friendly interface for data management. -For more information about the ToolJet database, you can visit [here](/docs/tooljet-database). +For more information about the ToolJet database, you can visit [here](/docs/tooljet-db/tooljet-database). -If you plan to use this feature, you need to set up and deploy the PostgREST server, which facilitates querying the ToolJet Database. - -To enable the ToolJet database, please set the environment variable `ENABLE_TOOLJET_DB` to true in the `values.yaml` file. +You need to set up and deploy the PostgREST server, which facilitates querying the ToolJet Database. ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -47,4 +43,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. \ No newline at end of file +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/index.md b/docs/docs/setup/index.md index 2fb250852a..e13799dffc 100644 --- a/docs/docs/setup/index.md +++ b/docs/docs/setup/index.md @@ -1,6 +1,6 @@ -# Setup ToolJet +# Deploy ToolJet -Check out the different methods you can use to deploy ToolJet on your machine +Check out the different methods you can use to deploy ToolJet on your machine. ```mdx-code-block import {DocsCardList} from '../../src/components/DocsCard'; diff --git a/docs/docs/setup/kubernetes-aks.md b/docs/docs/setup/kubernetes-aks.md index fa9bb0bed5..fe3d5e8a91 100644 --- a/docs/docs/setup/kubernetes-aks.md +++ b/docs/docs/setup/kubernetes-aks.md @@ -9,8 +9,6 @@ title: Kubernetes (AKS) 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. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - 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). @@ -18,10 +16,28 @@ Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster. 2. Create k8s deployment ```bash - curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/AKS/deployment.yaml + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/AKS/deployment.yaml ``` -Make sure to edit the environment variables in the `deployment.yaml`. We advise to use secrets to setup sensitive information. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). +Make sure to edit the environment variables in the `deployment.yaml`. We advise to use secrets to setup sensitive information. You can check out the available options [here](/docs/setup/env-vars). + +:::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** +
    +
    + Read **[environment variables reference](/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. @@ -29,7 +45,7 @@ If there are self signed HTTPS endpoints that Tooljet needs to connect to, pleas 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 + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/AKS/service.yaml ``` 4. Apply YAML configs @@ -40,11 +56,9 @@ If there are self signed HTTPS endpoints that Tooljet needs to connect to, pleas You will be able to access your ToolJet installation once the pods and services running. - - ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required). 1. Setup PostgREST server @@ -54,9 +68,24 @@ If you intend to use this feature, you'd have to set up and deploy PostgREST ser 2. Update ToolJet deployment with the appropriate env variables [here](https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/AKS/deployment.yaml) and apply the changes. +## 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. + +Create workflow deployment: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/workflow-deployment.yaml +``` +**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. + +`ENABLE_WORKFLOW_SCHEDULING=true` +`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` +`TEMPORAL_SERVER_ADDRESS=` + ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -66,4 +95,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/kubernetes-eks.md b/docs/docs/setup/kubernetes-eks.md index 8d4882ea60..1cb7915922 100644 --- a/docs/docs/setup/kubernetes-eks.md +++ b/docs/docs/setup/kubernetes-eks.md @@ -6,7 +6,7 @@ title: Kubernetes (EKS) Follow the steps below to deploy ToolJet on an EKS Kubernetes cluster. :::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](https://docs.tooljet.com/docs/setup/system-requirements#database-software) +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/setup/system-requirements#database-software) ::: 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). @@ -16,19 +16,37 @@ You should set up a PostgreSQL database manually to be used by ToolJet. We recom _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 +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/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](https://docs.tooljet.com/docs/setup/env-vars). +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). -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. +:::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** +
    +
    + Read **[environment variables reference](/docs/setup/env-vars)** +::: + +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/pre-release/kubernetes/service.yaml) for exposing the ToolJet server as a service using an AWS Load Balancer. **Example:** - [Application load balancing on Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy a PostgREST server, which helps in querying the ToolJet Database. Please [follow the instructions here](https://docs.tooljet.com/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration. +To use ToolJet Database, you'd have to set up and deploy a PostgREST server, which helps in querying the ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required). 1. Set up PostgREST server @@ -38,9 +56,24 @@ If you intend to use this feature, you'd have to set up and deploy a PostgREST s Update ToolJet deployment with the appropriate env variables [here](https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml) and apply the changes. +## 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. + +Create workflow deployment: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/workflow-deployment.yaml +``` +**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. + +`ENABLE_WORKFLOW_SCHEDULING=true` +`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` +`TEMPORAL_SERVER_ADDRESS=` + ## Upgrading to the Latest LTS Version -New LTS versions are released every 3-5 months with an end-of-life of at least 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`. +New LTS versions are released every 3-5 months with an end-of-life of at least 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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -50,4 +83,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. \ No newline at end of file +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/kubernetes-gke.md b/docs/docs/setup/kubernetes-gke.md index 8133c88d12..761b4af62a 100644 --- a/docs/docs/setup/kubernetes-gke.md +++ b/docs/docs/setup/kubernetes-gke.md @@ -9,8 +9,6 @@ title: Kubernetes (GKE) You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using Cloud SQL since this guide is for deploying using GKE. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - Follow the steps below to deploy ToolJet on a GKE Kubernetes cluster. 1. Create an SSL certificate. @@ -30,10 +28,27 @@ 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 +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/GKE/deployment.yaml ``` -Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). +Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). + +:::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** +
    + Read **[environment variables reference](/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. @@ -42,13 +57,13 @@ If there are self signed HTTPS endpoints that Tooljet needs to connect to, pleas 4. Create k8s service ```bash -curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/service.yaml +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/GKE/service.yaml ``` 5. Create k8s ingress ```bash -curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/ingress.yaml +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/GKE/ingress.yaml ``` Change the domain name to the domain/subdomain that you wish to use for ToolJet installation. @@ -65,12 +80,9 @@ It might take a few minutes to provision the managed certificates. [Managed cert You will be able to access your ToolJet installation once the pods, service and the ingress is running. - - - ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required). 1. Setup PostgREST server @@ -80,9 +92,24 @@ If you intend to use this feature, you'd have to set up and deploy PostgREST ser 2. Update ToolJet deployment with the appropriate env variables [here](https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/deployment.yaml) and apply the changes. +## 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. + +Create workflow deployment: + +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/workflow-deployment.yaml +``` +**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. + +`ENABLE_WORKFLOW_SCHEDULING=true` +`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` +`TEMPORAL_SERVER_ADDRESS=` + ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -92,4 +119,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/kubernetes.md b/docs/docs/setup/kubernetes.md index f9735e3d04..557c8f45b4 100644 --- a/docs/docs/setup/kubernetes.md +++ b/docs/docs/setup/kubernetes.md @@ -9,21 +9,29 @@ title: Kubernetes You should setup a PostgreSQL database manually to be used by ToolJet. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - Follow the steps below to deploy ToolJet on a Kubernetes cluster. -1. Setup a PostgreSQL database +1. **Setup a PostgreSQL database**
    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 minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. +2. **Create a Kubernetes secret with name `server`.**
    + For the setup, ToolJet requires: + + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** Read **[environment variables reference](/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 + kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/deployment.yaml ``` :::info @@ -40,7 +48,7 @@ If there are self signed HTTPS endpoints that ToolJet needs to connect to, pleas kubectl get pods ``` -5. Create a Kubernetes services to publish the Kubernetes deployment that you've created. This step varies with cloud providers. 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 loadbalancer. +5. Create a Kubernetes services to publish the Kubernetes deployment that you've created. This step varies with cloud providers. We have a [template](https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/service.yaml) for exposing the ToolJet server as a service using an AWS loadbalancer. **Examples:** @@ -51,21 +59,25 @@ If there are self signed HTTPS endpoints that ToolJet needs to connect to, pleas If you want to serve ToolJet client from services such as Firebase or Netlify, please read the client Setup documentation **[here](/docs/setup/client)**. ::: -## ToolJet Database +## Workflows -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +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. -1. Setup PostgREST server +Create workflow deployment: - ```bash - kubectl apply -f https://raw.githubusercontent.com/ToolJet/ToolJet/main/deploy/kubernetes/postgrest.yaml - ``` +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/workflow-deployment.yaml +``` +**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. + +`ENABLE_WORKFLOW_SCHEDULING=true` +`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` +`TEMPORAL_SERVER_ADDRESS=` -2. Update ToolJet deployment with the appropriate env variables [here](https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml) and apply the changes. ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -75,4 +87,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/openshift.md b/docs/docs/setup/openshift.md index 1a2600fbb9..fba59d4971 100644 --- a/docs/docs/setup/openshift.md +++ b/docs/docs/setup/openshift.md @@ -9,15 +9,23 @@ title: Openshift You should setup a PostgreSQL database manually to be used by ToolJet. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - 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. We do not have plans to support other databases such as MySQL. -2. Create a Kubernetes secret with name `server`. For the minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. +2. Create a Kubernetes secret with name `server`. For the setup, ToolJet requires: + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** -Read **[environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)** +Read **[environment variables reference](/docs/setup/env-vars)** 3. Once you have logged into the Openshift developer dashboard click on `+Add` tab. Select import YAML from the local machine. @@ -28,13 +36,13 @@ 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 +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/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 +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/openshift/service.yaml ```
    @@ -45,7 +53,7 @@ curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/servic Once you have added the files click on create. -:info +:::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. ::: @@ -58,19 +66,24 @@ If there are self signed HTTPS endpoints that Tooljet needs to connect to, pleas
    -## ToolJet Database +## Workflows -You can know more about tooljet database [here](https://docs.tooljet.com/docs/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. -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](https://docs.tooljet.com/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +Create workflow deployment: +```bash +kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/pre-release/kubernetes/workflow-deployment.yaml ``` -https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/postgrest.yaml -``` +**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. + +`ENABLE_WORKFLOW_SCHEDULING=true` +`TOOLJET_WORKFLOWS_TEMPORAL_NAMESPACE=default` +`TEMPORAL_SERVER_ADDRESS=` ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -80,4 +93,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/system-requirements.md b/docs/docs/setup/system-requirements.md index 3e923972f9..c1ba630189 100644 --- a/docs/docs/setup/system-requirements.md +++ b/docs/docs/setup/system-requirements.md @@ -6,7 +6,7 @@ title: System Requirements This document covers all the system requirements for self-hosting ToolJet. :::info -The official Docker tag for the Enterprise Edition is tooljet/tooljet:EE-LTS-latest. +The official Docker tag for the Enterprise Edition is tooljet/tooljet:ee-lts-latest. ::: ## Operating Systems diff --git a/docs/docs/setup/tooljet-subpath.md b/docs/docs/setup/tooljet-subpath.md index a869af9559..2f1f63fb80 100644 --- a/docs/docs/setup/tooljet-subpath.md +++ b/docs/docs/setup/tooljet-subpath.md @@ -5,8 +5,6 @@ title: Deploying ToolJet on a subpath ToolJet can now be deployed at a subpath rather than the root (`/`) of a public domain. Example subpath installation URL: **`http://www.yourcompany.com/apps/tooljet`** -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - You'll need to setup the following environment variables if ToolJet installation is on a domain subpath: | variable | value | @@ -33,6 +31,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/docs/setup/try-tooljet.md b/docs/docs/setup/try-tooljet.md index 6cbf605912..464dc0ff0b 100644 --- a/docs/docs/setup/try-tooljet.md +++ b/docs/docs/setup/try-tooljet.md @@ -16,16 +16,15 @@ docker run \ -p 80:80 \ --platform linux/amd64 \ -v tooljet_data:/var/lib/postgresql/13/main \ - tooljet/try:latest + -v temporal_sqlite:/etc/temporal \ + tooljet/try:ee-latest ``` -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - #### Setup information - Runs the ToolJet server on the port 80 on your machine. - Container has postgres already configured within. All the data will be available in the docker volume `tooljet_data`. -- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](https://docs.tooljet.com/docs/setup/env-vars). +- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](/docs/setup/env-vars). - Use `docker stop tooljet` to stop the container and `docker start tooljet` to start the container thereafter. #### Dynamic Port Setup @@ -39,10 +38,13 @@ docker run \ -e PORT=8080 \ --platform linux/amd64 \ -v tooljet_data:/var/lib/postgresql/13/main \ - tooljet/try:EE-LTS-latest + -v temporal_sqlite:/etc/temporal \ + tooljet/try:ee-latest ``` - This command will start the ToolJet server on port 8080. - The `-e PORT=8080` flag sets the `PORT` environment variable to 8080, allowing the ToolJet server to listen on port 8080. 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* \ No newline at end of file diff --git a/docs/docs/setup/upgrade-to-lts.md b/docs/docs/setup/upgrade-to-lts.md index 63dc13f61c..0df918a9be 100644 --- a/docs/docs/setup/upgrade-to-lts.md +++ b/docs/docs/setup/upgrade-to-lts.md @@ -8,7 +8,7 @@ ToolJet has released its first Long Term Support (LTS) version, which provides e ### Check the latest LTS Version -ToolJet will be releasing new LTS versions 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`. +ToolJet will be releasing new LTS versions 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`. ### Prerequisites @@ -32,4 +32,3 @@ The upgrade process depends on your deployment method. You can follow the upgrad - [Upgrade ToolJet on Azure Container Apps](/docs/setup/azure-container#upgrading-to-the-latest-lts-version) - [Upgrade ToolJet on Google Cloud Run](/docs/setup/google-cloud-run#upgrading-to-the-latest-lts-version) - diff --git a/docs/docs/setup/upgrade-to-v3.md b/docs/docs/setup/upgrade-to-v3.md index 035016d193..54c3d71859 100644 --- a/docs/docs/setup/upgrade-to-v3.md +++ b/docs/docs/setup/upgrade-to-v3.md @@ -1,10 +1,7 @@ --- id: upgrade-to-v3 -title: ToolJet 3.0 (Beta) Migration Guide Self-Hosted +title: ToolJet 3.0 Migration Guide Self-Hosted --- -# ToolJet 3.0 (Beta) Migration Guide Self-Hosted - -This documentation will help you upgrade your application from ToolJet v2.50.0-LTS to the pre-release/beta version of ToolJet 3.0. ToolJet 3.0 is a new **major version**, including **breaking changes** that require you to adjust your applications accordingly. We will guide you through this process and mention a few important changes. @@ -14,24 +11,17 @@ Before upgrading, we recommend reviewing your existing applications for any usag For complex applications, we also recommend setting up thorough testing procedures to ensure your apps function correctly after the upgrade. ::: -## Upgrading to 3.0 Beta Preview +## Upgrading to ToolJet 3.0 ### Prerequisites ⚠️ -Before attempting to upgrade to the 3.0 Beta Preview: +Before attempting to upgrade to the ToolJet 3.0: - **Database Backup**: Create a complete backup of your database - **Application Review**: Check your apps for breaking and deprecated features listed in this guide. - **Test Environment**: Only attempt upgrade in a testing environment first. -To upgrade, update your Docker image to: - -```bash -tooljet/tooljet:v3.0.0-ee-beta.1 -``` -:::warning -This is a beta release. Test thoroughly in a non-production environment first. -::: +To upgrade, checkout the latest docker image **[here](/docs/setup/choose-your-tooljet)**. ## Breaking Changes @@ -186,6 +176,10 @@ After the 3.0 upgrade, applications with the old Kanban Board component will cra - Update all queries and components using these data sources - Test all affected components and queries after migration +#### Action Required After Upgrade + +If you haven't migrated your local data sources to global data sources, you will encounter an error message indicating that local data sources are no longer supported. For detailed instructions on migrating from Local Data Sources to the new Data Sources, please refer to our [Local Data Sources Migration Guide](/docs/data-sources/local-data-sources-migration). + ### Workspace Variables #### Action Required @@ -197,7 +191,7 @@ After the 3.0 upgrade, applications with the old Kanban Board component will cra Workspace Constants are designed to be resolved on the server-side only, ensuring a high level of security. You can assign users to a specific role and provide create, update, and delete access to Workspace Constants. -For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](https://docs.tooljet.com/docs/beta/org-management/workspaces/workspace-variables-migration). +For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](/docs/security/constants/variables). ## Response Headers and Metadata @@ -219,21 +213,17 @@ Now, you should use: {{queries..metadata}} ``` -The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/beta/data-sources/restapi/metadata-and-cookies/#metadata). +The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/data-sources/restapi/metadata-and-cookies/#metadata). ## System Changes ### ToolJet Database -ToolJet Database is now a core requirement for the 3.0 beta. You'll need to manually enable the ToolJet Database feature at the instance level. This is a temporary requirement - in the final 3.0.0 LTS release, the ToolJet Database will be automatically enabled and configured by default. - -#### Beta Testing Requirements - -- Enable ToolJet Database for your instance (see required environment variables [here](/docs/beta/setup/env-vars/#enable-tooljet-database--optional-)) - -:::note -This manual configuration is only needed during the beta testing phase. When 3.0.0 LTS is released, the ToolJet Database will be automatically enabled and ready to use out of the box. -::: +ToolJet Database is now a core requirement for the ToolJet 3.0. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database.
    +Please check the environment variables that you need to configure to set up: +- [PostgREST](/docs/setup/env-vars#postgrest-server-required) +- [ToolJet Database](/docs/setup/env-vars#enable-tooljet-database-required) ## Help and Support diff --git a/docs/docs/setup/v2-migration.md b/docs/docs/setup/v2-migration.md index 00b3499668..317a5f2135 100644 --- a/docs/docs/setup/v2-migration.md +++ b/docs/docs/setup/v2-migration.md @@ -8,12 +8,11 @@ ToolJet version 2 comes with a bunch of exciting features, with the major ones b 1. Multi page 2. Multi env 3. Forms widget -4. [Database](/docs/tooljet-database) (Requires opt-in) -5. [Marketplace](/docs/marketplace) (Requires opt-in) +4. [Database](/docs/tooljet-db/tooljet-database) (Requires opt-in) +5. [Marketplace](/docs/marketplace/marketplace-overview) (Requires opt-in) Checkout the latest changelog for v2 [here](https://github.com/ToolJet/ToolJet/releases). -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* ## Deployment Based on your opted deployment method from our [setup doc](/docs/setup/), you can directly deploy v2 without any additional configuration for the default setup. diff --git a/docs/docs/tj-setup/instances.md b/docs/docs/tj-setup/instances.md new file mode 100644 index 0000000000..01ad1dd147 --- /dev/null +++ b/docs/docs/tj-setup/instances.md @@ -0,0 +1,40 @@ +--- +id: 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. + +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. + +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 diff --git a/docs/docs/tj-setup/licensing/cloud.md b/docs/docs/tj-setup/licensing/cloud.md new file mode 100644 index 0000000000..288dcd7106 --- /dev/null +++ b/docs/docs/tj-setup/licensing/cloud.md @@ -0,0 +1,93 @@ +--- +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)**. + +## 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. + +### Basic Subscription + +This is a free subscription where a user can access basic offerings such as creating apps, limited access to the ToolJet Database, community support, etc. This is ideal for individuals or small teams who just need the essentials. + +### Trial Subscription + +ToolJet offers a trial subscription which is valid for 14 days, where users can access all premium features and evaluate ToolJet according to their needs. Once the trial period is over premium features, such as OpenID SSO login and Audit logs, will no longer be accessible. You can upgrade to a paid subscription by simply clicking on the upgrade button. + +### 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. + +## 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. + +### Credit Usage + +**Standard Operations** + + +AI-powered assistance for the following actions consumes **3 credits**: + +- Generating or editing single UI components +- Generating or modifying queries +- Incorporating business logic +- Debugging assistance +- Generating database tables +- Bulk modifying component styles +- Generating or modifying multi-component layouts +- Receiving guidance from documentation + +**Advanced Builds** + +The entire app UI generation consumes **10 credits**. + +### Credit Calculation + +AI credits are calculated based on the pricing plan and are assigned per builder in a workspace. These credits are then available for use by all users in the workspace. + +## Upgrading Your Subscription + +### Start Trial Subscription + +If you are not currently on a paid plan and have not yet used your free trial, you will see a **Start Trial** banner within the ToolJet dashboard. Click on the **Start free trial** button inside this banner to initiate your free trial. + +TJ Dashboard: Start free trial + +### Upgrading to Paid Subscription + +When you've identified the ideal paid plan to meet your needs, the next step is to complete the purchase process, ensuring seamless access to premium features. Follow these steps to upgrade your subscription: + +Role Required: **Admin** + +1. Click the gear icon (⚙️) at the bottom of the left sidebar and select **Settings** from the dropdown. + +2. In the Settings page, choose the **Subscription** tab.
    + (Example URL - `https://app.corp.com/nexus/settings/subscription`) + +3. The subscription tab displays a subscription overview card summarizing your current plan. Locate the **Upgrade** button in the lower left corner and click on it. + +4. A modal window will appear. Enter the desired number of builder and end-user seats, then click the **Upgrade** button within the modal. + +5. You'll be directed to a payment gateway. Complete the payment process. + +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. + +## FAQs + +
    + + **What happens if my subscription expires?** + + +If your paid or trial license key expires, your instance will revert to the Basic plan. You will lose access to premium features such as OpenID SSO login and Audit logs, but no data will be lost. You can renew anytime to regain access to premium features. + +
    diff --git a/docs/docs/tj-setup/licensing/self-hosted.md b/docs/docs/tj-setup/licensing/self-hosted.md new file mode 100644 index 0000000000..2a19209b2a --- /dev/null +++ b/docs/docs/tj-setup/licensing/self-hosted.md @@ -0,0 +1,86 @@ +--- +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)**. + +
    + +## 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. + +### Basic License + +This is a free license where a user can access basic offerings such as creating apps, pre-defined user groups, community support, etc. This is ideal for individuals or small teams who just need the essentials. No license key is required for this option. + +### 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. + +### 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. + +
    + +## AI Credit System + +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. + +### Credit Usage + +**Standard Operations** + +AI-powered assistance for the following actions consumes **3 credits**: + +- Generating or editing single UI components +- Generating or modifying queries +- Incorporating business logic +- Debugging assistance +- Generating database tables +- Bulk modifying component styles +- Generating or modifying multi-component layouts +- Guidance from documentation + +**Advanced Builds** + +The entire app UI generation consumes **10 credits**. + + +### Credit Calculation + +AI credits are calculated based on the pricing plan and are assigned per builder in an instance. These credits are then available for use by all users in the instance across all workspaces. + +## Updating License Key + +Once you have received the license key from the ToolJet Team, you can update the license key by following the steps: + +Role Required: **Super Admin** + +1. Go to the Settings page.
    + (Example URL - `https://app.corp.com/instance-settings/license`) + +2. In the license key tab, update the provided license key. + Licensing + +3. Within the license tab of the Settings page, you can access the limit tab, which provides details about available total users, builders, and end users. You can also see the expiry date of your license key. + Licensing + +## FAQs + +
    + + **What happens if my subscription expires?** + + +If your paid or trial license key expires, your instance will revert to the Basic plan. You will lose access to premium features such as OpenID SSO login and Audit logs, but no data will be lost. You can renew anytime to regain access to premium features. + +
    + +:::caution +**Please keep in mind that your license key is private and strictly prohibited from being shared with any third parties.** +::: \ No newline at end of file diff --git a/docs/docs/tj-setup/org-branding/custom-domain.md b/docs/docs/tj-setup/org-branding/custom-domain.md new file mode 100644 index 0000000000..aee2927262 --- /dev/null +++ b/docs/docs/tj-setup/org-branding/custom-domain.md @@ -0,0 +1,35 @@ +--- +id: custom-domain +title: Custom Domain +--- + +In a self-hosted deployment of ToolJet, you can configure a custom domain by setting the `TOOLJET_HOST `environment variable. + +## Prerequisites + +- A running self-hosted instance of ToolJet. + +- A registered domain name. + +- A configured DNS record pointing your domain to the ToolJet server. + + +## Configuration Steps + +### 1. Set the TOOLJET_HOST Environment Variable + +The TOOLJET_HOST variable defines the public URL where ToolJet will be accessible. You need to update this variable with your desired domain. + +| variable | description | +| ------------ | ---------------------------------------------------------------- | +| TOOLJET_HOST | the public URL of ToolJet client ( eg: `https://app.corp.ai`,`https://corp.ai`,`https://corp.ai/app` ) | + + +### 2. Restart Services + +After setting the environment variable and DNS configurations, restart your ToolJet deployment to apply the changes. + + +:::info +Custom domains will soon be supported in ToolJet Cloud. +::: \ No newline at end of file diff --git a/docs/docs/tj-setup/org-branding/white-labeling.md b/docs/docs/tj-setup/org-branding/white-labeling.md new file mode 100644 index 0000000000..da2c44e0f4 --- /dev/null +++ b/docs/docs/tj-setup/org-branding/white-labeling.md @@ -0,0 +1,57 @@ +--- +id: white-labeling +title: White Labeling +--- + +
    + Icon + Paid feature +
    + +The White Label feature in ToolJet lets you customize the look and feel of your ToolJet deployment to match your branding guidelines, including your logo, favicon, and page title, making ToolJet appear like your own product. This guide will help you understand the configuration of White labelling for your organization. For **self-hosted** instances, the white labelling is set at the [instance level](/docs/user-management/authentication/self-hosted/instance-login) and for the **cloud**, it is applied at the [workspace level](/docs/user-management/authentication/self-hosted/workspace-login). + + +whitelable your brand + + + +## Self-hosted Configuration: + +To access the White Labelling configuration, go to **Settings > White Labelling**. ( Example URL - `https://app.corp.com/instance-settings/white-labelling`) + +In this section you can configure the following branding elements: + +- **Application Logo**: This includes the logo displayed on the login screen, dashboard, and app-editor and deployed application. (Preferred dimensions: 130px by 26px). +- **Favicon**: It is an icon associated with the webpage displayed in the browser tab. (Preferred dimensions: 32px x 32px or 16px x 16px.) +- **Page Title**: This is the title associated with the webpage displayed in the browser tab. (Preferred title length: 50-60 characters.) + + +whitelabelling selfhosted + +## Cloud Configuration: + +To access the White Labelling configuration, go to **Settings > White Labelling**. ( Example URL - `https://app.corp.com//settings/white-labelling`) + +In this section you can configure the following branding elements: + +- **Application Logo**: This includes the logo displayed on the login screen, dashboard, and app-editor and deployed application. (Preferred dimensions: 130px by 26px). +- **Favicon**: It is an icon associated with the webpage displayed in the browser tab. (Preferred dimensions: 32px x 32px or 16px x 16px.) +- **Page Title**: This is the title associated with the webpage displayed in the browser tab. (Preferred title length: 50-60 characters.) + +whitelabelling selfhosted + + +## FAQ + +
    + + **What happens to white labeling if the license or subscription expires?** + +If your license or subscription expires, white labeling will automatically revert to ToolJet's default branding until the license is renewed. + +
    diff --git a/docs/docs/tj-setup/overview.md b/docs/docs/tj-setup/overview.md new file mode 100644 index 0000000000..45bb932539 --- /dev/null +++ b/docs/docs/tj-setup/overview.md @@ -0,0 +1,22 @@ +--- +id: overview +title: Overview +--- + +ToolJet provides a variety of configuration options to help your organization tailor the platform to your specific needs. This section outlines key setup areas for your organization, including branding, subscription plans, deployment options, and workspace management, to ensure an optimized experience for your team. + +## Deployment Options and Subscription Plans + +ToolJet provides two deployment options — **Self-Hosted** and **Cloud** — enabling users to select the model that best suits their requirements. In addition to deployment options, ToolJet provides a range of subscription plans for each deployment model, offering various features and benefits. Refer to the **[Choose Your ToolJet](/docs/tj-setup/tj-deployment)** guide for further details. + +## Instances and Workspaces + +In ToolJet, a self-hosted deployment of the platform is referred to as an **[instance](/docs/tj-setup/instances)**. Each instance operates independently, maintaining its own configuration, data, and user base. Within each instance, **[workspaces](/docs/tj-setup/workspaces)** provide isolated spaces for different teams or projects, enabling users to manage apps, resources, and access controls effectively. + +## Organization Branding + +ToolJet offers customization through **[white labeling](/docs/tj-setup/org-branding/white-labeling)** and **[custom domain](/docs/tj-setup/org-branding/custom-domain)** setup, allowing you to tailor your instance to align with your brand guidelines. White labeling ensures the platform reflects your organization’s brand identity, while a custom domain allows you to use your own web address for the ToolJet instance. + +## SMTP Server + +Additionally, ToolJet enables you to **[set up your email communication server](/docs/tj-setup/smtp-setup/configuration)** to manage tasks such as sending invitations and password reset requests, facilitating seamless communication within your team and with external stakeholders. diff --git a/docs/docs/tj-setup/smtp-setup/configuration.md b/docs/docs/tj-setup/smtp-setup/configuration.md new file mode 100644 index 0000000000..0a32632121 --- /dev/null +++ b/docs/docs/tj-setup/smtp-setup/configuration.md @@ -0,0 +1,73 @@ +--- +id: configuration +title: Configuration +--- + +This feature is exclusive to self-hosted ToolJet, allowing you to configure a custom SMTP email server. This feature allows you to choose your own email server, which helps to seamlessly send emails for various purposes, including invitations, password reset requests, and notifications. + +There are two ways to setup your email server in ToolJet: +1. **[Using the GUI](#configuration-using-gui)**: This method involves directly entering SMTP settings into the ToolJet interface, which is suitable for simpler setups. +2. **[With environment variables](#configuration-with-environment-variables)**: This method utilizes environment variables for configuring the email server. It offers enhanced flexibility and security, making it particularly suitable for managing sensitive credentials in production environments. + +Both methods are designed to ensure that your ToolJet instance can send emails as needed, depending on your setup preferences and security requirements. + +
    + +## Prerequisites + +Before you begin, ensure you have: +- Super Admin access to ToolJet +- SMTP server details from your email service provider + +
    + +:::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. +::: + +
    + +## Configuration Using GUI + +1. Navigate to the **Settings** section in ToolJet. +2. Select the **Email protocol (SMTP)** tab. +3. Toggle the switch to enable **Email protocol (SMTP)**. +4. Configure the following fields:
    + | Field | Description | Example | + |---------------|--------------------------|-----------------------------------| + | Host | SMTP server hostname | smtp.gmail.com | + | Port | SMTP server port number | 587 | + | User | SMTP account username | hello@johndoe.tech | + | Password | SMTP account password | a13d0sd344 | + | Sender's email| Email address of the sender | hello@johndoe.tech | + +5. Click **Save changes** to apply the new SMTP configuration. + SMTP     Configuration Without Environment Variables + +
    + +
    + +## Configuration With Environment Variables + +ToolJet allows you to configure SMTP settings using environment variables. You can enable a toggle in the Email protocol (SMTP) settings to apply or fetch the configuration directly from your .env file. + +SMTP Configuration Without Environment Variables + +**Example Environment Variables**:
    + + ```javascript + DEFAULT_FROM_EMAIL=hello@tooljet.io + SMTP_USERNAME=your-username + SMTP_PASSWORD=your-password + SMTP_DOMAIN=smtp.mailgun.org + SMTP_PORT=587 + SMTP_SSL=false + SMTP_DISABLED=false + ``` + +- For new installations, if SMTP is configured in the .env file, the **Apply configuration from environment variables** toggle will be turned on by default. +- When the toggle is enabled, the SMTP settings fields in the UI will be populated with values from the environment variables and will be read-only. +- Disabling the toggle allows you to manually enter or edit SMTP settings directly in the UI. + +
    diff --git a/docs/docs/tj-setup/smtp-setup/email-providers.md b/docs/docs/tj-setup/smtp-setup/email-providers.md new file mode 100644 index 0000000000..aab218b7e6 --- /dev/null +++ b/docs/docs/tj-setup/smtp-setup/email-providers.md @@ -0,0 +1,38 @@ +--- +id: email-providers +title: Commonly Used Email Providers +--- + +Here are some general settings for the most commonly used email providers: + +| Provider | Host | Port | Username | Password | Sender's email | +|--------------------|----------------------|------------------|---------------|-----------|----------------| +| Gmail | smtp.gmail.com | 587 or 465 (SSL) | Email | Password | Email | +| Yahoo Mail | smtp.mail.yahoo.com | 465 (SSL) | Email | Password | Email | +| Outlook.com/Hotmail| smtp.office365.com | 587 or 465 (SSL) | Email | Password | Email | +| Zoho Mail | smtp.zoho.com | 587 or 465 (SSL) | Email | Password | Email | +| SendGrid | smtp.sendgrid.net | 587 or 465 (SSL) | apikey | API key | Email | +| Mailgun | smtp.mailgun.org | 587 or 465 (SSL) | SMTP username | Password | Email | + + +## SendGrid + +To configure SendGrid, use **`apikey`** as the username and the generated API key as the password. + +SMTP Configuration Without Environment Variables + +#### Steps to Generate API Key +1. Log in to your [SendGrid](https://sendgrid.com/en-us) account. + +2. Navigate to the [API Keys](https://app.sendgrid.com/settings/api_keys) page under Settings. + +3. Generate a new API key for SMTP usage. + SMTP Configuration Without Environment Variables + +## Mailgun + +Mailgun provides specific credentials for SMTP configuration. +1. Retrieve the **SMTP username** from the SMTP Credentials tab in the Domain Settings page. + +2. Use the password associated with your Mailgun account to authenticate the SMTP connection. + SMTP Configuration Without Environment Variables diff --git a/docs/docs/tj-setup/tj-deployment.md b/docs/docs/tj-setup/tj-deployment.md new file mode 100644 index 0000000000..5364c6de00 --- /dev/null +++ b/docs/docs/tj-setup/tj-deployment.md @@ -0,0 +1,42 @@ +--- +id: tj-deployment +title: Choose Your ToolJet +--- + +ToolJet offers two deployment options — **Self-Hosted** and **Cloud** — enabling users to select the model that best suits their requirements. Choosing the right deployment method is crucial since it affects data control, scalability, and operational efficiency. This guide explains these options and helps you decide which one best suits your specific requirements. + +
    + +## Self-Hosted ToolJet + +With the self-hosted option, ToolJet can be deployed on your own infrastructure (on-premises or private cloud). This provides more control over data, customization, and integrations, making it an ideal choice for organizations seeking full control over their application development environment to meet compliance, security, and operational requirements. + +#### Why Choose Self-Hosted ToolJet? + +1. **Complete Data Control**: Deploying ToolJet on your infrastructure ensures your data stays within your control, meeting stringent compliance and privacy requirements. +2. **Customizability**: Self-hosted deployments allow for deeper customization to align with your organization's workflows, integrations, and unique needs. +3. **Enhanced Security**: By hosting ToolJet on-premises or in your private cloud, you can implement your own security measures, providing an added layer of protection for sensitive data. + +
    + +
    + +## ToolJet Cloud + +ToolJet Cloud is a managed service hosted by the ToolJet team. It eliminates the need for infrastructure management, providing a quick setup and seamless updates. This option is ideal for teams looking for rapid deployment, seamless scalability, and reduced operational complexity. + +#### Why Choose ToolJet Cloud? + +1. **Hassle-Free Setup**: With ToolJet Cloud, there’s no need to manage servers or infrastructure. Everything is set up and maintained by the ToolJet team, allowing you to focus solely on building applications. +2. **Seamless Updates and Maintenance**: ToolJet Cloud ensures you always have access to the latest features and updates without manual intervention. Maintenance, backups, and uptime are handled for you. +3. **Scalability**: The cloud deployment is designed to scale automatically as your team or application requirements grow, ensuring consistent performance. + +
    + +
    + +## ToolJet Subscription Plans + +ToolJet offers various subscription plans for both deployment models. Refer to the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for detailed information on features and costs. + +
    diff --git a/docs/docs/tj-setup/workspaces.md b/docs/docs/tj-setup/workspaces.md new file mode 100644 index 0000000000..f20b72f9f6 --- /dev/null +++ b/docs/docs/tj-setup/workspaces.md @@ -0,0 +1,106 @@ +--- +id: workspaces +title: Workspaces +--- +# Workspaces + +Workspaces are collaborative environments that enable teams to build, customize, and deploy applications, as well as manage data, workflows, and permissions. It helps you organize your organization's apps based on hierarchy or departments, making them easier to manage. For example, if your organization has departments, you can create separate workspaces for each to isolate apps or limit access to particular set of users or developers. + +Workspace contains applications, data sources, users (admins, developers, or builders, end users), [access and permission ](/docs/user-management/role-based-access/access-control)settings, and more. You can also set different [login configurations](/docs/user-management/authentication/self-hosted/overview) for each workspace. You can have multiple workspaces within an instance. + +## Workspace Creation + +**Role required** - Workspace Admin + +To create a new workspace, + +1. Open the workspace dropdown at the bottom left on dashboard (Example URL - `https://app.corp.com/`) +2. Select **Add a new workspace**. +3. Fill in the workspace name and slug in the modal. +4. Click **Create workspace**. + +Create workspace + +## Editing Workspaces +**Role required** - Workspace Admin + +To edit a workspace, + +1. Open the workspace dropdown at the bottom left on dashboard (Example URL - `https://app.corp.com/`) +2. Hover over the **current workspace** in the dropdown menu. +3. Click the **edit icon** to modify the workspace name or slug. +4. Save the changes, and the updates will reflect immediately across the platform. + +## Switching Workspaces + +To switch between the workspaces, + +1. Open the workspace dropdown at the bottom left on dashboard (Example URL - `https://app.corp.com/`) +2. Select the desired workspace from the list to switch instantly. +Archive workspace + +## Archiving Workspaces +**Role required** - Super Admin + +- This feature is available only for self-hosted users, and only [Super Admin](/docs/user-management/role-based-access/super-admin) can archive workspaces. A Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance +- To archive a workspace, at least one active workspace must exist in the instance. + +- **Impact** + - The apps within the archived workspace will no longer be accessible through the URL. + - Users without access to any active workspace will be logged out. + +- To archive a workspace: + +1. Go to **Settings** > **All Workspaces**. ( Example URL - `https://app.corp.com/instance-settings/all-workspaces`) +2. A table listing all workspaces will appear. +3. Click the Archive button to open a confirmation modal. Once you confirm, the selected workspace will be archived. + + +Archive workspace + +## Unarchive Workspace + +**Role required** - Super Admin + +- To unarchive a workspace: + +1. Go to **Settings** > **All Workspaces**. ( Example URL - `https://app.corp.com/instance-settings/all-workspaces`) +2. A table displaying all workspaces will appear. Click on the Archived tab to view archived workspaces. +3. Click the Unarchive button to unarchive the selected workspace. + +## Workspace Admin + +- A Workspace has a three predefined roles, Admins, Builders and Endusers with predefined permissions. Checkout the [users and groups](/docs/user-management/role-based-access/user-roles) docs for more details. +- The user who creates a workspace is automatically assigned as its **Admin**. +- An **Admin** can: + - Manage users, groups, data and apps within each workspace. + - Configure authentication methods for their workspaces. + +Admin user has access to all the permission at workspace level, while an end user can only view and use the released apps they are given access to and permissions can be configured for a builder. + +| Permission | Admin | Builder | End User | +|:------------------------------|:-----:|:-------:|:--------:| +| App | ✅ | Configurable | ❌ | +| Data sources | ✅ | Configurable | ❌ | +| Folder | ✅ | Configurable | ❌ | +| Workspace constants/variables | ✅ | Configurable | ❌ | + + +## FAQ + +
    + +Can applications and workspace settings be shared between workspaces? + +**No**, applications and workspace settings cannot be shared directly between workspaces. Each workspace operates independently, maintaining its own applications and configurations. However, you can **export an application** from one workspace and **import it** into another. For more details, refer to the [Import and Export Applications](/docs/app-builder/importing-exporting-applications/) documentation. + +
    + +
    + +Do users have access to all workspaces by default? + +**No**, users need to be **invited** to a specific workspace to access the apps and data within that workspace. Refer to [invite users](/docs/user-management/role-based-access/user-roles) documentation for more details + +
    + diff --git a/docs/docs/tooljet-api.md b/docs/docs/tooljet-api.md new file mode 100644 index 0000000000..4cac44ad87 --- /dev/null +++ b/docs/docs/tooljet-api.md @@ -0,0 +1,1368 @@ +--- +id: tooljet-api +title: ToolJet API +--- + +
    + Icon + Paid feature +
    + +ToolJet API allows you to interact with the ToolJet platform programmatically. You can use the APIs to manage users and their workspaces relations. The API endpoints are secured with an access token. You can perform various operations using the API such as: + +- [Get All Users](#get-all-users) +- [Get All Workspaces](#get-all-workspaces) +- [Get All App Details](#get-all-app-details) +- [Get User by ID](#get-user-by-id) +- [Create User](#create-user) +- [Update User](#update-user) +- [Update User Role](#update-user-role) +- [Replace User Workspace](#replace-user-workspace) +- [Replace User Workspaces Relations](#replace-user-workspaces-relations) +- [Export Application](#export-application) +- [Import Application](#import-application) + +## Enabling ToolJet API + +By default, the ToolJet API is disabled. To enable the API, add these variables to your `.env` file: + +| variable | description | +| :-----------------------: | :---------------------------------------------: | +| ENABLE_EXTERNAL_API | `true` or `false` | +| EXTERNAL_API_ACCESS_TOKEN | `` (To authenticate API requests) | + +## Security + +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' \ +-H 'Authorization: Basic ' \ +-H 'Content-Type: application/json' + +``` + +
    + +## API Endpoints + +### Get All Users + + - **Description:** Retrieves a list of all the users. + - **URL:** `/api/ext/users` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Response:** Array of User objects. + +
    + **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": "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" + } + ] + } + ] + } + ] +``` +
    + +### Get All Workspaces + + - **Description:** Retrieves a list of all workspaces. + - **URL:** `/api/ext/workspaces` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Response:** Array of Workspace objects. + +
    +Response Example + +```json +[ + { + "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" + } + ] + } +] +``` + +
    + +### Get All App Details + + - **Description:** Get the app details for all the applications in the workspace. + - **URL:** `/api/ext/workspace/:workspace_id/apps` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - **workspace_id**: The ID of the workspace. + - **Response:** Array of app details for all the applications in the workspace. + +
    + **Response Example** + ```json + [ + { + "id": "ae06cc7a-2922-4fe7-9064-462741558813", + "name": "Applicant tracking system", + "slug": "ae06cc7a-2922-4fe7-9064-462741558813", + "versions": [ + { + "id": "37be6442-ca1b-4a5a-a6f4-f929e00a0ac1", + "name": "v1" + }, + { + "id": "be8a96c3-f7a4-4f82-b282-23678c52c973", + "name": "v3" + }, + { + "id": "19405d8c-be75-47ad-aa96-36f2b1728e77", + "name": "v2" + }, + { + "id": "15bd421d-54ce-44d5-8eef-39911fc2d4cb", + "name": "v4" + } + ] + }, + { + "id": "b68f87ca-6620-4cbf-83d6-becf073d8e96", + "name": "Aws Tracker", + "slug": "b68f87ca-6620-4cbf-83d6-becf073d8e96", + "versions": [ + { + "id": "466a1cc4-62cf-4b46-b71d-114af61c04ca", + "name": "v1" + }, + { + "id": "b65f1ae2-3702-4cba-91f3-3e5bddd55dbc", + "name": "v2" + } + ] + } + ] + ``` +
    + +### Get User by ID + + - **Description:** Returns a user by their ID. + - **URL:** `/api/ext/user/:id` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - **Response:** User object. + +
    + **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": "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" + } + ] + } + ] +} +``` +
    + +### Create User + + - **Description:** Creates a new user. + - **URL:** `/api/ext/users` + - **Method:** POST + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Body:** The body object can contain the following fields: + - `name` (string, required): The name of the user. + - `email` (string, required): The email address of the user. + - `password` (string, optional): The user's password. Must be between 5 and 100 characters. + - `status` (string, optional): The status of the user. Can be either `active` or `archived`. Defaults to `archived` if not provided. + - `workspaces` (array, required): An array of workspace objects associated with the user. Each workspace object should contain: + - `id` (string, required): The unique identifier of the workspace. + - `name` (string, required): The name of the workspace. + - `status` (string, optional): The status of the workspace. Can be either `active` or `archived`. + - `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`. + +
    + **Request Body Example** +```json +{ + "name": "Alice Johnson", + "email": "alice@example.com", + "password": "qwy@4xt123", + "status": "active", + "workspaces": [ + { + "name": "team-spac", + "status": "active", + "groups": [ + { + "name": "all_users" + } + ] + } + ] +} +``` +
    + - **Response:** `201 Created` + +### Update User + + - **Description:** Finds and updates a user by their ID. + - **URL:** `/api/ext/user/:id` + - **Method:** PATCH + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - **Body:** The body object can contain the following fields: + - `name` (string, optional): The updated name of the user. + - `email` (string, optional): The updated email address of the user. + - `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`. + + +
    + +Request Body Example + +```json +{ + "name": "Jane Doe", + "email": "jane.doe@example.com", + "password": "newsecurepassword", + "status": "active" +} +``` + +
    + + - **Response:** `200 OK` + +### Update User Role + + - **Description:** Updates the user role for a particular workspace. + - **URL:** `/api/ext/update-user-role/workspace/workspaceId` + - **Method:** PUT + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - workspaceId (string): The unique identifier of the workspace. + - **Body:** The body object can contain the following fields: + - `newRole` (string, required): The updated user role of the user. + - `userId` (string, required): The unique identifier of the user. + + +
    + +Request Body Example + +```json +{ + "newRole": "end-user", + "userId": "f2065dd1-e5ea-4793-af91-4a8831de68e6" +} +``` + +
    + + - **Response:** `200 OK` + +### Replace User Workspaces Relations + + - **Description:** Replaces all workspaces relations associated with a user. + - **URL:** `/api/ext/user/:id/workspaces` + - **Method:** PUT + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - **Body:** Array of workspace data transfer objects. It may contain the following fields: + - `id` (string, required): The unique identifier of the workspace. + - `name` (string, required): The name of the workspace. + - `status` (string, optional): The status of the workspace. Can be either `active` or `archived`. + - `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`. + - **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` + - **Method:** PATCH + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - workspaceId (string): The ID of the workspace. + - **Body:** The body object can contain the following fields: + - `id` (string, optional): The ID of the workspace. + - `name` (string, optional): The updated name of the workspace. + - `status` (string, optional): The updated status of the workspace. Can be either `active` or `archived`. + - `groups` (array, optional): An array of group objects associated with the workspace. Each group object can contain: + - `id` (string, optional): The ID of the group. + - `name` (string, optional): The name of the group. + +
    + +Request Body Example + +```json +{ + "status": "archived", + "groups": [ + { + "name": "all_users" + } + ] +} +``` + +
    + - **Note:** If no body is given or body is an empty object, it will not do anything. + - **Response:** `200 OK` + +### 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 + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - **workspace_id**: The ID of the workspace. + - **app_id**: The ID of the application. + - **Query Params:** + - **exportTJDB** (boolean): Specifies whether to export TJDB data or not. By default **true**. + - **appVersion** (string): Accepts a specific version of the application that is to be exported. + - **exportAllVersions** (boolean): Defines whether to export all the available versions. By default it exports the latest version of the app. + - **Response:** Exported application json. + +
    +Response Example + +```json +{ + "app": [ + { + "definition": { + "appV2": { + "type": "front-end", + "id": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "name": "ToolJet API Application", + "slug": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "isPublic": false, + "isMaintenanceOn": false, + "icon": "home", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "currentVersionId": null, + "userId": "3ca0bd7a-b8e0-40d9-a2d8-2c7531dc3bee", + "workflowApiToken": null, + "workflowEnabled": false, + "createdAt": "2025-02-28T06:21:34.962Z", + "creationMode": "DEFAULT", + "updatedAt": "2025-02-28T06:21:34.961Z", + "editingVersion": { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + }, + "components": [ + { + "id": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "name": "table1", + "type": "Table", + "pageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "parent": null, + "properties": { + "title": { + "value": "Table" + }, + "visible": { + "value": "{{true}}" + }, + "loadingState": { + "value": "{{false}}" + }, + "data": { + "value": "{{ [ \n\t\t{ id: 1, name: 'Olivia Nguyen', email: 'olivia.nguyen@example.com', date: '15/05/2022', mobile_number: 9876543210, interest: ['Reading', 'Traveling','Photography'], photo: 'https://reqres.in/img/faces/7-image.jpg' }, \n\t\t{ id: 2, name: 'Liam Patel', email: 'liam.patel@example.com', date: '20/09/2021', mobile_number: 8765432109, interest: ['Cooking','Gardening','Hiking'], photo: 'https://reqres.in/img/faces/5-image.jpg' }\n] }}" + }, + "useDynamicColumn": { + "value": "{{false}}" + }, + "columnData": { + "value": "{{[{name: 'email', key: 'email', id: '1'}, {name: 'Full name', key: 'name', id: '2', isEditable: true}]}}" + }, + "rowsPerPage": { + "value": "{{10}}" + }, + "serverSidePagination": { + "value": "{{false}}" + }, + "enableNextButton": { + "value": "{{true}}" + }, + "enablePrevButton": { + "value": "{{true}}" + }, + "totalRecords": { + "value": "{{10}}" + }, + "enablePagination": { + "value": "{{true}}" + }, + "serverSideSort": { + "value": "{{false}}" + }, + "serverSideFilter": { + "value": "{{false}}" + }, + "displaySearchBox": { + "value": "{{true}}" + }, + "showDownloadButton": { + "value": "{{true}}" + }, + "showFilterButton": { + "value": "{{true}}" + }, + "autogenerateColumns": { + "value": true, + "generateNestedColumns": true + }, + "isAllColumnsEditable": { + "value": "{{false}}" + }, + "columns": { + "value": [ + { + "name": "id", + "id": "e3ecbf7fa52c4d7210a93edb8f43776267a489bad52bd108be9588f790126737", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 30, + "columnType": "string" + }, + { + "name": "photo", + "key": "photo", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a2", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "image", + "objectFit": "contain", + "borderRadius": "100", + "columnSize": 70 + }, + { + "name": "name", + "id": "5d2a3744a006388aadd012fcc15cc0dbcb5f9130e0fbb64c558561c97118754a", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 130, + "columnType": "string" + }, + { + "name": "email", + "id": "afc9a5091750a1bd4760e38760de3b4be11a43452ae8ae07ce2eebc569fe9a7f", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 230, + "columnType": "string" + }, + { + "name": "date", + "id": "27b75c8af9d34d1eaa1f9bb7f8f9f7b0abf1823e799748c8bb57e74f53b2c1dc", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "datepicker", + "isTimeChecked": false, + "dateFormat": "DD/MM/YYYY", + "parseDateFormat": "DD/MM/YYYY", + "isDateSelectionEnabled": true, + "columnSize": 130 + }, + { + "name": "mobile_number", + "id": "9c2e3c40572a4aefb8e179ee39a0e1ac9dc2b2e6634be56e1c05be13c3d1de56", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "number", + "columnSize": 140 + }, + { + "name": "interest", + "key": "interest", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a1", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "newMultiSelect", + "columnSize": 300, + "options": [ + { + "label": "Reading", + "value": "Reading" + }, + { + "label": "Traveling", + "value": "Traveling" + }, + { + "label": "Photography", + "value": "Photography" + }, + { + "label": "Music", + "value": "Music" + }, + { + "label": "Cooking", + "value": "Cooking" + }, + { + "label": "Crafting", + "value": "Crafting" + }, + { + "label": "Voluntering", + "value": "Voluntering" + }, + { + "label": "Garndening", + "value": "Garndening" + }, + { + "label": "Dancing", + "value": "Dancing" + }, + { + "label": "Hiking", + "value": "Hiking" + } + ] + } + ] + }, + "showBulkUpdateActions": { + "value": "{{true}}" + }, + "showBulkSelector": { + "value": "{{false}}" + }, + "highlightSelectedRow": { + "value": "{{false}}" + }, + "columnSizes": { + "value": "{{({})}}" + }, + "actions": { + "value": [] + }, + "enabledSort": { + "value": "{{true}}" + }, + "hideColumnSelectorButton": { + "value": "{{false}}" + }, + "defaultSelectedRow": { + "value": "{{{\"id\":1}}}" + }, + "showAddNewRowButton": { + "value": "{{true}}" + }, + "allowSelection": { + "value": "{{true}}" + }, + "visibility": { + "value": "{{true}}" + }, + "disabledState": { + "value": "{{false}}" + } + }, + "general": {}, + "styles": { + "textColor": { + "value": "#000" + }, + "columnHeaderWrap": { + "value": "fixed" + }, + "actionButtonRadius": { + "value": "0" + }, + "cellSize": { + "value": "regular" + }, + "borderRadius": { + "value": "8" + }, + "tableType": { + "value": "table-classic" + }, + "maxRowHeight": { + "value": "auto" + }, + "maxRowHeightValue": { + "value": "{{0}}" + }, + "contentWrap": { + "value": "{{true}}" + }, + "boxShadow": { + "value": "0px 0px 0px 0px #00000090" + }, + "padding": { + "value": "default" + } + }, + "generalStyles": { + "boxShadow": { + "value": "0px 0px 0px 0px #00000040" + } + }, + "displayPreferences": { + "showOnDesktop": { + "value": "{{true}}" + }, + "showOnMobile": { + "value": "{{false}}" + } + }, + "validation": {}, + "createdAt": "2025-02-28T06:21:45.706Z", + "updatedAt": "2025-02-28T06:23:49.872Z", + "layouts": [ + { + "id": "f72adb7f-708c-4c5f-9a3b-be9467f7dcc0", + "type": "mobile", + "top": 180, + "left": 18, + "width": 35, + "height": 456, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:21:45.706Z" + }, + { + "id": "d6c8807f-dde5-4d0a-83f3-2a8036c4c147", + "type": "desktop", + "top": 30, + "left": 2, + "width": 39, + "height": 630, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:23:32.534Z" + } + ] + } + ], + "pages": [ + { + "id": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "name": "Home", + "handle": "home", + "index": 1, + "disabled": null, + "hidden": null, + "icon": null, + "createdAt": "2025-02-28T06:21:34.961Z", + "updatedAt": "2025-02-28T06:21:36.766Z", + "autoComputeLayout": true, + "appVersionId": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "pageGroupIndex": 1, + "pageGroupId": null, + "isPageGroup": false + } + ], + "events": [], + "dataQueries": [], + "dataSources": [], + "appVersions": [ + { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + } + ], + "appEnvironments": [ + { + "id": "60eff059-202a-4c12-ae12-507874f9191d", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "development", + "isDefault": false, + "priority": 1, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "48aa7f50-8709-4ae1-92cd-049b2aa22080", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "staging", + "isDefault": false, + "priority": 2, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "8f0a5c41-cea1-452a-b27c-e93337b567bd", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "production", + "isDefault": true, + "priority": 3, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + } + ], + "dataSourceOptions": [], + "schemaDetails": { + "multiPages": true, + "multiEnv": true, + "globalDataSources": true + } + } + } + } + ], + "tooljet_version": "3.5.11-cloud-lts" +} +``` + +
    + +### 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 + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - **workspace_id**: The ID of the workspace. + - **Body:** The body object will contain following fields: + - Application JSON + - `appName` (string, optional): Defines the application name. If not defined then the app will be imported with the existing app name. + +:::info +By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable: +`MAX_JSON_SIZE` +::: + +
    + +Request Body Example + +```json +{ + "app": [ + { + "definition": { + "appV2": { + "type": "front-end", + "id": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "name": "ToolJet API Application", + "slug": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "isPublic": false, + "isMaintenanceOn": false, + "icon": "home", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "currentVersionId": null, + "userId": "3ca0bd7a-b8e0-40d9-a2d8-2c7531dc3bee", + "workflowApiToken": null, + "workflowEnabled": false, + "createdAt": "2025-02-28T06:21:34.962Z", + "creationMode": "DEFAULT", + "updatedAt": "2025-02-28T06:21:34.961Z", + "editingVersion": { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + }, + "components": [ + { + "id": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "name": "table1", + "type": "Table", + "pageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "parent": null, + "properties": { + "title": { + "value": "Table" + }, + "visible": { + "value": "{{true}}" + }, + "loadingState": { + "value": "{{false}}" + }, + "data": { + "value": "{{ [ \n\t\t{ id: 1, name: 'Olivia Nguyen', email: 'olivia.nguyen@example.com', date: '15/05/2022', mobile_number: 9876543210, interest: ['Reading', 'Traveling','Photography'], photo: 'https://reqres.in/img/faces/7-image.jpg' }, \n\t\t{ id: 2, name: 'Liam Patel', email: 'liam.patel@example.com', date: '20/09/2021', mobile_number: 8765432109, interest: ['Cooking','Gardening','Hiking'], photo: 'https://reqres.in/img/faces/5-image.jpg' }\n] }}" + }, + "useDynamicColumn": { + "value": "{{false}}" + }, + "columnData": { + "value": "{{[{name: 'email', key: 'email', id: '1'}, {name: 'Full name', key: 'name', id: '2', isEditable: true}]}}" + }, + "rowsPerPage": { + "value": "{{10}}" + }, + "serverSidePagination": { + "value": "{{false}}" + }, + "enableNextButton": { + "value": "{{true}}" + }, + "enablePrevButton": { + "value": "{{true}}" + }, + "totalRecords": { + "value": "{{10}}" + }, + "enablePagination": { + "value": "{{true}}" + }, + "serverSideSort": { + "value": "{{false}}" + }, + "serverSideFilter": { + "value": "{{false}}" + }, + "displaySearchBox": { + "value": "{{true}}" + }, + "showDownloadButton": { + "value": "{{true}}" + }, + "showFilterButton": { + "value": "{{true}}" + }, + "autogenerateColumns": { + "value": true, + "generateNestedColumns": true + }, + "isAllColumnsEditable": { + "value": "{{false}}" + }, + "columns": { + "value": [ + { + "name": "id", + "id": "e3ecbf7fa52c4d7210a93edb8f43776267a489bad52bd108be9588f790126737", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 30, + "columnType": "string" + }, + { + "name": "photo", + "key": "photo", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a2", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "image", + "objectFit": "contain", + "borderRadius": "100", + "columnSize": 70 + }, + { + "name": "name", + "id": "5d2a3744a006388aadd012fcc15cc0dbcb5f9130e0fbb64c558561c97118754a", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 130, + "columnType": "string" + }, + { + "name": "email", + "id": "afc9a5091750a1bd4760e38760de3b4be11a43452ae8ae07ce2eebc569fe9a7f", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 230, + "columnType": "string" + }, + { + "name": "date", + "id": "27b75c8af9d34d1eaa1f9bb7f8f9f7b0abf1823e799748c8bb57e74f53b2c1dc", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "datepicker", + "isTimeChecked": false, + "dateFormat": "DD/MM/YYYY", + "parseDateFormat": "DD/MM/YYYY", + "isDateSelectionEnabled": true, + "columnSize": 130 + }, + { + "name": "mobile_number", + "id": "9c2e3c40572a4aefb8e179ee39a0e1ac9dc2b2e6634be56e1c05be13c3d1de56", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "number", + "columnSize": 140 + }, + { + "name": "interest", + "key": "interest", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a1", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "newMultiSelect", + "columnSize": 300, + "options": [ + { + "label": "Reading", + "value": "Reading" + }, + { + "label": "Traveling", + "value": "Traveling" + }, + { + "label": "Photography", + "value": "Photography" + }, + { + "label": "Music", + "value": "Music" + }, + { + "label": "Cooking", + "value": "Cooking" + }, + { + "label": "Crafting", + "value": "Crafting" + }, + { + "label": "Voluntering", + "value": "Voluntering" + }, + { + "label": "Garndening", + "value": "Garndening" + }, + { + "label": "Dancing", + "value": "Dancing" + }, + { + "label": "Hiking", + "value": "Hiking" + } + ] + } + ] + }, + "showBulkUpdateActions": { + "value": "{{true}}" + }, + "showBulkSelector": { + "value": "{{false}}" + }, + "highlightSelectedRow": { + "value": "{{false}}" + }, + "columnSizes": { + "value": "{{({})}}" + }, + "actions": { + "value": [] + }, + "enabledSort": { + "value": "{{true}}" + }, + "hideColumnSelectorButton": { + "value": "{{false}}" + }, + "defaultSelectedRow": { + "value": "{{{\"id\":1}}}" + }, + "showAddNewRowButton": { + "value": "{{true}}" + }, + "allowSelection": { + "value": "{{true}}" + }, + "visibility": { + "value": "{{true}}" + }, + "disabledState": { + "value": "{{false}}" + } + }, + "general": {}, + "styles": { + "textColor": { + "value": "#000" + }, + "columnHeaderWrap": { + "value": "fixed" + }, + "actionButtonRadius": { + "value": "0" + }, + "cellSize": { + "value": "regular" + }, + "borderRadius": { + "value": "8" + }, + "tableType": { + "value": "table-classic" + }, + "maxRowHeight": { + "value": "auto" + }, + "maxRowHeightValue": { + "value": "{{0}}" + }, + "contentWrap": { + "value": "{{true}}" + }, + "boxShadow": { + "value": "0px 0px 0px 0px #00000090" + }, + "padding": { + "value": "default" + } + }, + "generalStyles": { + "boxShadow": { + "value": "0px 0px 0px 0px #00000040" + } + }, + "displayPreferences": { + "showOnDesktop": { + "value": "{{true}}" + }, + "showOnMobile": { + "value": "{{false}}" + } + }, + "validation": {}, + "createdAt": "2025-02-28T06:21:45.706Z", + "updatedAt": "2025-02-28T06:23:49.872Z", + "layouts": [ + { + "id": "f72adb7f-708c-4c5f-9a3b-be9467f7dcc0", + "type": "mobile", + "top": 180, + "left": 18, + "width": 35, + "height": 456, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:21:45.706Z" + }, + { + "id": "d6c8807f-dde5-4d0a-83f3-2a8036c4c147", + "type": "desktop", + "top": 30, + "left": 2, + "width": 39, + "height": 630, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:23:32.534Z" + } + ] + } + ], + "pages": [ + { + "id": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "name": "Home", + "handle": "home", + "index": 1, + "disabled": null, + "hidden": null, + "icon": null, + "createdAt": "2025-02-28T06:21:34.961Z", + "updatedAt": "2025-02-28T06:21:36.766Z", + "autoComputeLayout": true, + "appVersionId": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "pageGroupIndex": 1, + "pageGroupId": null, + "isPageGroup": false + } + ], + "events": [], + "dataQueries": [], + "dataSources": [], + "appVersions": [ + { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + } + ], + "appEnvironments": [ + { + "id": "60eff059-202a-4c12-ae12-507874f9191d", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "development", + "isDefault": false, + "priority": 1, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "48aa7f50-8709-4ae1-92cd-049b2aa22080", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "staging", + "isDefault": false, + "priority": 2, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "8f0a5c41-cea1-452a-b27c-e93337b567bd", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "production", + "isDefault": true, + "priority": 3, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + } + ], + "dataSourceOptions": [], + "schemaDetails": { + "multiPages": true, + "multiEnv": true, + "globalDataSources": true + } + } + } + } + ], + "tooljet_version": "3.5.11-cloud-lts", + "appName": "ToolJet API Application" +} +``` + +
    + + - **Response:** `201 Created` \ No newline at end of file diff --git a/docs/docs/tooljet-concepts/integrating-data.md b/docs/docs/tooljet-concepts/integrating-data.md deleted file mode 100644 index 1fdcdb1755..0000000000 --- a/docs/docs/tooljet-concepts/integrating-data.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -id: integrating-data -title: Queries ---- - -Queries allows you to interact with various data sources, such as databases, APIs, and third-party services. They act as the bridge between your application's components and the data you wish to display, manipulate, or store. - -
    - Styles Tab -
    - -These queries are constructed in the Query Panel in the App-Builder, a dedicated section within the ToolJet App-Builder, where you can write low-code or custom SQL statements, API requests, or other data retrieval methods. - -## Configuring Queries -You can configure queries to run automatically when an application loads, or trigger them based on specific events or user actions. For example, you could set up a query to run when a user clicks a button, fills out a form, or selects an item from a dropdown menu. This enables you to create dynamic, interactive applications. - -
    - Trigger Query -
    - - -## Integration of Queries and Components -Queries are deeply integrated with ToolJet's components. Once a query fetches data, you can easily bind that data to various components in your application using ToolJet's templating syntax. Similarly, you can use queries to create, write or update data and trigger them on button clicks and other events. - - diff --git a/docs/docs/tooljet-concepts/permissions.md b/docs/docs/tooljet-concepts/permissions.md index 6d228184a8..4e0635a91a 100644 --- a/docs/docs/tooljet-concepts/permissions.md +++ b/docs/docs/tooljet-concepts/permissions.md @@ -11,17 +11,17 @@ ToolJet employs a Role-Based Access Control (RBAC) system to manage security and
    -## Groups -By default, there are two groups: **All Users**, which contains all workspace members, and **Admins**, which grants full access to all ToolJet resources. Custom groups like Support or Engineering can also be created to fine-tune access controls. +## Groups and User Roles +ToolJet provides a set of default user roles (e.g., Admin, Builder, End-user) and the ability to create custom groups (e.g., Support, Engineering, Finance) for more granular access control. These groups and roles determine the level of access a user has to resources within the workspace.
    ## Setting Permissions Based on Groups and Permissions -To secure your applications in ToolJet, you can leverage Groups and Permissions. For instance, you could create a custom group named Finance Team and assign it permissions to only access financial apps and variables within the workspace. When you invite new users, you can directly assign them to this group, ensuring they only have access to the resources they need to perform their tasks. You can also make the app public and make it accessible to users without the need to log in. +To secure your applications in ToolJet, you can leverage Groups and Permissions. For instance, you could create a custom group named Finance Team and assign it permissions to only access financial apps and constants within the workspace. When you invite new users, you can directly assign them to this group, ensuring they only have access to the resources they need to perform their tasks. You can also make the app public and make it accessible to users without the need to log in.
    -Read more about managing users and groups **[here](/docs/tutorial/manage-users-groups/)**. \ No newline at end of file +Read more about managing users and groups **[here](/docs/user-management/role-based-access/user-roles)**. \ No newline at end of file diff --git a/docs/docs/tooljet-concepts/super-admin.md b/docs/docs/tooljet-concepts/super-admin.md index d5fe67198e..cffb817656 100644 --- a/docs/docs/tooljet-concepts/super-admin.md +++ b/docs/docs/tooljet-concepts/super-admin.md @@ -8,4 +8,4 @@ The Super Admin in ToolJet plays a critical role in managing the instance by hav ## Advanced Control and Customization Beyond regular management tasks, Super Admins can implement more intricate settings like white labeling, enabling multiplayer editing, and managing instance licenses. They also have the power to restrict personal workspace creation for users, ensuring tighter control over the workspace environment. These advanced capabilities underscore the Super Admin's pivotal role in overseeing the comprehensive management and customization of the ToolJet instance. -Read more about super admins **[here](/docs/enterprise/superadmin/)**. \ No newline at end of file +Read more about super admins **[here](/docs/user-management/role-based-access/super-admin)**. \ No newline at end of file diff --git a/docs/docs/tooljet-concepts/using-fx.md b/docs/docs/tooljet-concepts/using-fx.md deleted file mode 100644 index 2a92999fda..0000000000 --- a/docs/docs/tooljet-concepts/using-fx.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -id: using-fx -title: Using the FX Functionality ---- - -Clicking on the **fx** symbol in ToolJet opens up a code editor that allows you to write custom JavaScript expressions. You can find **fx** in the properties panel on the right, next to various properties and settings of a component. - -With **fx**, you can perform calculations or set conditional logic to dynamically configure the components without leaving the ToolJet interface. It's an invaluable tool for adding complexity and interactivity to your applications. - -## Toggle Button - -When using **fx** buttons associated with toggle buttons, the expected output of the code you enter should be a boolean value - `true` or `false`. For example, the below code will check whether the entered age entered in the number input field of the form is above 18, the button component will be enabled or disabled based on it. - -```js -{{components.form1.data.numberinput1.value>18? false : true}} -``` - -
    - -
    - -For other cases, the expected value is a string. For example, If you are setting `Text color`, `Background Color`, `Loader Color`, etc. You need to pass in a JavaScript code that returns a hex code as a string. - -## Access all Variables, Queries, and Components - -The expressions you write in the code editor available after clicking on **fx** lets you access all the variables, queries, and components within your application. This allows you to create intricate relationships between different parts of your app, making it more responsive and user-friendly. - - - - - - - diff --git a/docs/docs/tooljet-concepts/variables.md b/docs/docs/tooljet-concepts/variables.md index 96f58a0fd8..6e5a930c66 100644 --- a/docs/docs/tooljet-concepts/variables.md +++ b/docs/docs/tooljet-concepts/variables.md @@ -54,4 +54,4 @@ To learn more about different types of variables and their usage, go through the **[Setting and unsetting variables and page variables](/docs/how-to/run-actions-from-runjs)**
    **[Exposed variables](/docs/tooljet-concepts/exposed-variables)**
    **[Environment variables](/docs/setup/env-vars/)**
    -**[Workspace variables](/docs/org-management/workspaces/workspace-variables/)** \ No newline at end of file +**[Workspace variables](/docs/security/constants/variables)** \ No newline at end of file diff --git a/docs/docs/tooljet-concepts/workspace-constants.md b/docs/docs/tooljet-concepts/workspace-constants.md index 088675af51..67fa5a3220 100644 --- a/docs/docs/tooljet-concepts/workspace-constants.md +++ b/docs/docs/tooljet-concepts/workspace-constants.md @@ -42,4 +42,4 @@ The syntax for using constants is straightforward: -For a deep-dive into workspace constants and secrets, including how to create and manage them, go through **[this](/docs/org-management/workspaces/workspace_constants/)** documentation. \ No newline at end of file +For a deep-dive into workspace constants and secrets, including how to create and manage them, go through **[this](/docs/security/constants/)** documentation. \ No newline at end of file diff --git a/docs/docs/tooljet-db/constraints/foreign-key.md b/docs/docs/tooljet-db/constraints/foreign-key.md new file mode 100644 index 0000000000..b3aef1b72a --- /dev/null +++ b/docs/docs/tooljet-db/constraints/foreign-key.md @@ -0,0 +1,120 @@ +--- +id: foreign-key +title: Foreign Key +--- + +A foreign key relation refers to linking one column or set of columns of the current table with one column or set of columns in an existing table. This relationship establishes a connection between the two tables, enabling the current source table to reference the existing target table. While creating a Foreign Key relationship, you can select the desired [action](#foreign-key-actions) to be performed on the source row when the referenced(target) row is updated or deleted. + +
    + +## Constraints +- The target table must contain a column having the same data type as the column in the source table. +- The column that has to be referenced in the target table must have Unique constraint explicitly. +- The target table must already exist before adding the Foreign Key relationship in the source table. + +## Limitations +- Self-references are not allowed i.e. Target table and Source table cannot be the same. +- No foreign key can be created with a column of serial data type in the source table. +- No foreign key can be reference a column in target table that is a part of its composite Primary key. + +## Exception +- The foreign key created with a column having integer data type in the source table can also reference a column of serial data type in the target table. + +
    + +
    + +## Creating Foreign Key + +While creating/editing a table(target), you will be able to add one or more than one Foreign Keys referencing the column(s) of other existing(source) tables. +To create a Foreign Key relationship, follow these steps: + + - Create or edit an existing table. + - Click on the `+ Add Relation` button under the Foreign key relation section. + - The table which is being created/edited is the source table. + - Under the source section, select the desired column from the dropdown menu. + - Under the target section, select the desired target table and Column from the dropdown menu. + - Under the Actions section, select the desired action to be performed when the referenced row is updated or deleted. + - Click on the `Create` button to create the Foreign Key relationship. + +ToolJet database + +
    + +
    + +## Foreign Key Actions + +When creating a foreign key relationship, ToolJet Database lets you choose from several actions to be performed on the source row when the referenced row in the target table is updated or deleted. + +### On Update + +| Option | Description | +| --- | --- | +| Restrict (default) | Restrict any updates on target table if any referenced row is being updated. | +| Cascade | Any updates in referenced row in target table will show up in the source table as well. | +| Set NULL | Any updates in referenced row in target table will set it's instances in the source table as NULL. | +| Set to Default | Any updates referenced row in target table will set it's instances in the source table as default value of foreign key column of source table. | + +### On Delete + +| Option | Description | +| --- | --- | +| Restrict (default) | Restrict any deletion on target table if any referenced row is being updated. | +| Cascade | Any deletion of referenced row in target table will delete the row having it's instance in the source table as well. | +| Set NULL | Any deletion of referenced row in target table will set it's instances in the source table as NULL. | +| Set to Default | Any deletion of referenced row in target table will set it's instances in the source table as default value of foreign key column of source table. | + +
    + +
    + +## Referential Integrity + +The foreign key constraint ensures referential integrity between the source and target tables. This constraint enforces that the foreign key column in the source table has one of the unique values present in the foreign key column in the target table.
    +- When creating a new row in the source table the column with the foreign key relation will have a dropdown with the unique values present in the target table. This ensures that the data in the source table is always consistent with the data in the target table. +- On the bottom of the dropdown, there is a button to **Open referenced table** which will take you to the target table. + +ToolJet database + +- When editing the value of a foreign key cell in an existing row of the source table, the dropdown will show the unique values present in the target table. This ensures that even when the data in the source table is being updated, it is always consistent with the data in the target table. + +ToolJet database + +### Example + +Let's consider an example where we want to create a foreign key relationship between the `Orders` and `Customers` tables in an e-commerce application. + +First, create the following two tables in the ToolJet Database: + +**Customers** + +| Column Name | Data Type | Primary Key | Not Null | Unique | +|-------------|-----------|:--------------:|:--------:|:--------:| +| customer_id | int | ✅ | ✅ | ✅ | +| name | varchar | ❌ | ✅ | ❌ | +| email | varchar | ❌ | ✅ | ✅ | + +**Orders** + +| Column Name | Data Type | Primary Key | Not Null | Unique | +|--------------|-----------|:--------------:|:--------:|:--------:| +| order_id | int | ✅ | ✅ | ✅ | +| customer_id | int | ❌ | ✅ | ❌ | +| order_date | varchar | ❌ | ✅ | ❌ | +| total_amount | float | ❌ | ✅ | ❌ | + +We want to create a foreign key relationship between the `customer_id` column in the `Orders` table and the `customer_id` column in the `Customers` table. + +1. **Define the Foreign Key Relationship** + - Edit the `Orders` table. + - Click on the **+ Add Relation** button under the Foreign Key Relation section. + - In the **Source** section, select the `customer_id` column. + - In the **Target** section, select the `Customers` table and the `customer_id` column. + - Choose the desired action, for example, **RESTRICT** to prevent deleting a customer that has associated orders. + +3. **Save Changes**: Click the **Save Changes** button to create the foreign key relationship. + +Now, whenever you try to insert or update a record in the `Orders` table, the `customer_id` value must correspond to an existing `customer_id` value in the `Customers` table. This is also prevent you from deleting a customer that has associated orders. This ensures that orders are always associated with a valid customer, maintaining data integrity and consistency. + +
    diff --git a/docs/docs/tooljet-db/constraints/primary-key.md b/docs/docs/tooljet-db/constraints/primary-key.md new file mode 100644 index 0000000000..39c80fec9a --- /dev/null +++ b/docs/docs/tooljet-db/constraints/primary-key.md @@ -0,0 +1,87 @@ +--- +id: primary-key +title: Primary Key +--- + +ToolJet Database supports both single field and composite primary keys. + +
    + +## Creating Single Field Primary Key + +When creating a new table, an `id` column with the `serial` data type is automatically generated to serve as the primary key. However, you can designate any other column as the primary key if desired. The primary key column can be of any supported data type except Boolean. +The constraints for the primary key column ensure the integrity and uniqueness of the primary key, which is essential for properly identifying and referencing records within the table. To create a single field primary key, follow these steps: + + - Create or edit an existing table. + - Check the **Primary** checkbox on the column which you want to set as the primary key. + - This will automatically add the primary key constraint to the column. + - Click on the **Create** button to create the table. + +ToolJet database + +### Constraints +- The primary key column cannot contain null values. +- The primary key column must have unique values across all rows. + +### Limitations +- Every table must have at least one primary key. +- The primary key column cannot have the Boolean data type. + +
    + +
    + +## Creating Composite Primary Key + +You have the option to convert an existing primary key column into a composite primary key, consisting of two or more columns. +By utilizing a composite primary key, you can uniquely identify records based on multiple column values, providing greater flexibility and control over your data structure. To create a composite primary key, follow these steps: + + - Create or edit an existing table. + - Check the **Primary** checkbox on multiple columns to set them as the composite primary key. + - This will automatically add the primary key constraint to the selected columns. + - Click on the **Save changes/Create** button to update/create the table. + +ToolJet database + +### Constraints +- None of the composite key columns can contain null values. +- The combination of values across all composite key columns must be unique for each row in the table. + +### Limitation +- The composite key columns cannot be of the Boolean data type. + +
    + +
    + +## Modifying Primary Key + +After creating a table, you can designate any column as the primary key, provided it adheres to the required constraints. If the chosen column already contains data, the existing values must comply with the primary key constraints. However, you cannot update or modify the primary key of a target table if it is currently being referenced as a foreign key in any other source tables. To modify the primary key, follow these steps: + + - Edit an existing table. + - Check the **Primary** checkbox on the column which you want to set as the primary key. + - This will automatically add the primary key constraint to the column. + - Uncheck the **Primary** checkbox on the existing primary key column. The primary key constraints will still stay in place for this column but are no longer necessary. + - Click on the **Save changes** button to update the table. + +ToolJet database + +
    + +
    + +## Deleting Primary Key + +An existing primary key column can be deleted through the **Edit Table** panel. To delete the primary key column, follow these steps: + +- Edit an existing table. +- Select a different column to serve as the new primary key for the table. +- Once the new primary key column is designated, you can proceed to the existing primary key column. +- Uncheck the **Primary** checkbox for the existing primary key column to remove its primary key status. +- After removing the primary key constraint, you can delete this column from the table. + +You cannot delete a Primary Key of a target table if it is being used as a foreign key in any source table(s). + +ToolJet database + +
    diff --git a/docs/docs/tooljet-db/data-types.md b/docs/docs/tooljet-db/data-types.md index ef1e36de31..d0f72853ea 100644 --- a/docs/docs/tooljet-db/data-types.md +++ b/docs/docs/tooljet-db/data-types.md @@ -16,22 +16,21 @@ ToolJet Database supports several data types to accommodate various kinds of inf | **float** | A numeric data type used to store inexact, variable-precision values. | Any floating-point number, ex: 3.14 | | **boolean** | Can hold true, false, and null values. | `true` or `false` | | **date with time** | Stores both date and time information in ISO 8601 format. The default timezone is set to the user's device time zone, with an option to specify a different timezone. All timestamp data is stored in UTC format and converted to the specified timezone when displayed. | '2024-07-22 15:30:00' | - -
    - ToolJet database -
    - +| **jsonb** | Used to store JSON data, can store structured data like arrays or nested objects. | `{"name": "John Doe", "age": 30, "skills": ["JavaScript", "Python"], "address": {"city": "New York", "zip": "10001"}}` | + +ToolJet database ## Permissible Constraints per Data Type -The following table shows which constraints are permissible for each data type. For more detailed explanations of each constraint type, please refer to the [Column Constraints](./database-editor#column-constraints) section. +The following table shows which constraints are permissible for each data type. For more detailed explanations of each constraint type, please refer to the [Column Constraints](/docs/tooljet-db/database-editor#column-constraints) section. -| Data Type | Primary Key | Foreign Key | Unique | Not Null | -|:-----------:|:--------------:|:-------------:|:--------:|:----------:| -| serial | ✅ | ❌ | ✅ | ✅ | -| varchar | ✅ | ✅ | ✅ | ✅ | -| int | ✅ | ✅ | ✅ | ✅ | -| bigint | ✅ | ✅ | ✅ | ✅ | -| float | ✅ | ✅ | ✅ | ✅ | -| boolean | ❌ | ❌ | ❌ | ✅ | -| date with time | ❌ | ❌ | ❌ | ✅ | \ No newline at end of file +| Data Type | Primary Key | Foreign Key | Unique | Not Null | +|:--------------:|:--------------:|:-------------:|:------:|:----------:| +| serial | ✅ | ❌ | ✅ | ✅ | +| varchar | ✅ | ✅ | ✅ | ✅ | +| int | ✅ | ✅ | ✅ | ✅ | +| bigint | ✅ | ✅ | ✅ | ✅ | +| float | ✅ | ✅ | ✅ | ✅ | +| boolean | ❌ | ❌ | ❌ | ✅ | +| date with time | ❌ | ❌ | ❌ | ✅ | +| jsonb | ❌ | ❌ | ❌ | ✅ | \ No newline at end of file diff --git a/docs/docs/tooljet-db/database-editor.md b/docs/docs/tooljet-db/database-editor.md index 922822afc9..50139ec6ec 100644 --- a/docs/docs/tooljet-db/database-editor.md +++ b/docs/docs/tooljet-db/database-editor.md @@ -5,16 +5,13 @@ title: Database Editor You can manage the ToolJet Database directly from the Database Editor. ToolJet Database organizes the data into **tables** that can have different structures. All the tables will be listed lexicographically on the left. Click on any of the tables to view the table data. -
    - ToolJet database -
    +ToolJet database The sidebar on the left can also be collapsed to give more space to the database editor. -
    - ToolJet database -
    -
    +ToolJet database + +
    ## Create New Table @@ -26,25 +23,23 @@ To create a new table in the ToolJet Database: - Enter a **Table name**. - By default, an **id** column with **serial** data type is automatically created as the **primary key** of the table. You can change the primary key to any other column. -
    - ToolJet database -
    +ToolJet database - Add Columns: | **Option** | **Description** | | --- | --- | | **Column name** | Enter a unique name for the column. | -| **Data type** | Select the appropriate data type for the column from the dropdown menu. For more information on available data types, see the [Supported Data Types](./data-types#supported-data-types) section. | +| **Data type** | Select the appropriate data type for the column from the dropdown menu. For more information on available data types, see the [Supported Data Types](/docs/tooljet-db/data-types#supported-data-types) section. | | **Default value (optional)** | Specify any default value to be assigned to the column. If left blank, the column will allow null values. | -| **Primary Key** | Check this box to designate the column as the [Primary Key](#primary-key). Multiple columns can be selected, creating a composite primary key. | +| **Primary Key** | Check this box to designate the column as the [Primary Key](/docs/tooljet-db/constraints/primary-key). Multiple columns can be selected, creating a composite primary key. | | **NULL/NOT NULL toggle** | Use this toggle to determine whether the column should allow null values or require a value. By default, null values are permitted. | | **Unique toggle** | Click the kebab menu and toggle the **Unique** option to add a unique constraint to the column, ensuring all values are distinct. By default, duplicate values are allowed. | | **Foreign Key** | Click the **+ Add Relation** button to establish a foreign key relationship, linking this column to a primary key or unique constraint column(s) in another table. |
    -
    +
    ## Column Constraints @@ -60,288 +55,11 @@ ToolJet Database supports several column constraints to maintain data integrity **Not Null**: The not null constraint ensures that the designated column(s) cannot have null values, requiring a value for every row in the table. -For a detailed overview of which constraints are allowed for each data type, refer to the [Permissible Constraints per Data Type](./data-types#permissible-constraints-per-data-type) table. - -## Primary Key - -ToolJet Database supports both single field and composite primary keys. - -### Creating Single Field Primary Key - -When creating a new table, an `id` column with the `serial` data type is automatically generated to serve as the primary key. However, you can designate any other column as the primary key if desired. The primary key column can be of any supported data type except Boolean. -The constraints for the primary key column ensure the integrity and uniqueness of the primary key, which is essential for properly identifying and referencing records within the table. To create a single field primary key, follow these steps: - - - Create or edit an existing table. - - Check the **Primary** checkbox on the column which you want to set as the primary key. - - This will automatically add the primary key constraint to the column. - - Click on the **Create** button to create the table. - -ToolJet database - -#### Constraints -- The primary key column cannot contain null values. -- The primary key column must have unique values across all rows. - -#### Limitations -- Every table must have at least one primary key. -- The primary key column cannot have the Boolean data type. - -### Creating Composite Primary Key - -You have the option to convert an existing primary key column into a composite primary key, consisting of two or more columns. -By utilizing a composite primary key, you can uniquely identify records based on multiple column values, providing greater flexibility and control over your data structure. To create a composite primary key, follow these steps: - - - Create or edit an existing table. - - Check the **Primary** checkbox on multiple columns to set them as the composite primary key. - - This will automatically add the primary key constraint to the selected columns. - - Click on the **Save changes/Create** button to update/create the table. - -ToolJet database - -#### Constraints -- None of the composite key columns can contain null values. -- The combination of values across all composite key columns must be unique for each row in the table. - -#### Limitation -- The composite key columns cannot be of the Boolean data type. - -### Modifying Primary Key - -After creating a table, you can designate any column as the primary key, provided it adheres to the required constraints. If the chosen column already contains data, the existing values must comply with the primary key constraints. However, you cannot update or modify the primary key of a target table if it is currently being referenced as a foreign key in any other source tables. To modify the primary key, follow these steps: - - - Edit an existing table. - - Check the **Primary** checkbox on the column which you want to set as the primary key. - - This will automatically add the primary key constraint to the column. - - Uncheck the **Primary** checkbox on the existing primary key column. The primary key constraints will still stay in place for this column but are no longer necessary. - - Click on the **Save changes** button to update the table. - -ToolJet database - -### Deleting Primary Key - -An existing primary key column can be deleted through the **Edit Table** panel. To delete the primary key column, follow these steps: - -- Edit an existing table. -- Select a different column to serve as the new primary key for the table. -- Once the new primary key column is designated, you can proceed to the existing primary key column. -- Uncheck the **Primary** checkbox for the existing primary key column to remove its primary key status. -- After removing the primary key constraint, you can delete this column from the table. - -You cannot delete a Primary Key of a target table if it is being used as a foreign key in any source table(s). - -ToolJet database +For a detailed overview of which constraints are allowed for each data type, refer to the [Permissible Constraints per Data Type](/docs/tooljet-db/data-types#permissible-constraints-per-data-type) table.
    -
    - -## Foreign Key - -A foreign key relation refers to linking one column or set of columns of the current table with one column or set of columns in an existing table. This relationship establishes a connection between the two tables, enabling the current source table to reference the existing target table. While creating a Foreign Key relationship, you can select the desired [action](#foreign-key-actions) to be performed on the source row when the referenced(target) row is updated or deleted. - -### Constraints -- The target table must contain a column having the same data type as the column in the source table. -- The column that has to be referenced in the target table must have Unique constraint explicitly. -- The target table must already exist before adding the Foreign Key relationship in the source table. - -### Limitations -- Self-references are not allowed i.e. Target table and Source table cannot be the same. -- No foreign key can be created with a column of serial data type in the source table. -- No foreign key can be reference a column in target table that is a part of its composite Primary key. - -### Exception -- The foreign key created with a column having integer data type in the source table can also reference a column of serial data type in the target table. - -### Creating Foreign Key - -While creating/editing a table(target), you will be able to add one or more than one Foreign Keys referencing the column(s) of other existing(source) tables. -To create a Foreign Key relationship, follow these steps: - - - Create or edit an existing table. - - Click on the `+ Add Relation` button under the Foreign key relation section. - - The table which is being created/edited is the source table. - - Under the source section, select the desired column from the dropdown menu. - - Under the target section, select the desired target table and Column from the dropdown menu. - - Under the Actions section, select the desired action to be performed when the referenced row is updated or deleted. - - Click on the `Create` button to create the Foreign Key relationship. - -ToolJet database - - -
    - -### Foreign Key Actions - -When creating a foreign key relationship, ToolJet Database lets you choose from several actions to be performed on the source row when the referenced row in the target table is updated or deleted. - -#### On Update - -| Option | Description | -| --- | --- | -| Restrict (default) | Restrict any updates on target table if any referenced row is being updated. | -| Cascade | Any updates in referenced row in target table will show up in the source table as well. | -| Set NULL | Any updates in referenced row in target table will set it's instances in the source table as NULL. | -| Set to Default | Any updates referenced row in target table will set it's instances in the source table as default value of foreign key column of source table. | - -#### On Delete - -| Option | Description | -| --- | --- | -| Restrict (default) | Restrict any deletion on target table if any referenced row is being updated. | -| Cascade | Any deletion of referenced row in target table will delete the row having it's instance in the source table as well. | -| Set NULL | Any deletion of referenced row in target table will set it's instances in the source table as NULL. | -| Set to Default | Any deletion of referenced row in target table will set it's instances in the source table as default value of foreign key column of source table. | - -### Referential Integrity - -The foreign key constraint ensures referential integrity between the source and target tables. This constraint enforces that the foreign key column in the source table has one of the unique values present in the foreign key column in the target table.
    -- When creating a new row in the source table the column with the foreign key relation will have a dropdown with the unique values present in the target table. This ensures that the data in the source table is always consistent with the data in the target table. -- On the bottom of the dropdown, there is a button to **Open referenced table** which will take you to the target table. - -
    - ToolJet database -
    - -- When editing the value of a foreign key cell in an existing row of the source table, the dropdown will show the unique values present in the target table. This ensures that even when the data in the source table is being updated, it is always consistent with the data in the target table. - -
    - ToolJet database -
    - - -### Example - -Let's consider an example where we want to create a foreign key relationship between the `Orders` and `Customers` tables in an e-commerce application. - -First, create the following two tables in the ToolJet Database: - -**Customers** - -| Column Name | Data Type | Primary Key | Not Null | Unique | -|-------------|-----------|:--------------:|:--------:|:--------:| -| customer_id | int | ✅ | ✅ | ✅ | -| name | varchar | ❌ | ✅ | ❌ | -| email | varchar | ❌ | ✅ | ✅ | - -**Orders** - -| Column Name | Data Type | Primary Key | Not Null | Unique | -|--------------|-----------|:--------------:|:--------:|:--------:| -| order_id | int | ✅ | ✅ | ✅ | -| customer_id | int | ❌ | ✅ | ❌ | -| order_date | varchar | ❌ | ✅ | ❌ | -| total_amount | float | ❌ | ✅ | ❌ | - -We want to create a foreign key relationship between the `customer_id` column in the `Orders` table and the `customer_id` column in the `Customers` table. - -1. **Define the Foreign Key Relationship** - - Edit the `Orders` table. - - Click on the **+ Add Relation** button under the Foreign Key Relation section. - - In the **Source** section, select the `customer_id` column. - - In the **Target** section, select the `Customers` table and the `customer_id` column. - - Choose the desired action, for example, **RESTRICT** to prevent deleting a customer that has associated orders. - -3. **Save Changes**: Click the **Save Changes** button to create the foreign key relationship. - -Now, whenever you try to insert or update a record in the `Orders` table, the `customer_id` value must correspond to an existing `customer_id` value in the `Customers` table. This is also prevent you from deleting a customer that has associated orders. This ensures that orders are always associated with a valid customer, maintaining data integrity and consistency. - - -
    - -## Table Operations - -### Search Table - -Open the Search bar by clicking on the **Search** button and search for a table in the ToolJet database by entering the table name. - -
    - ToolJet database -
    - -
    - -
    - -### Rename Table - -To rename a table, click on the kebab menu icon on the right of the table name and then select the **Edit table** option. A drawer will open from the right from where you can edit the table name. - -
    - ToolJet database -
    - -
    - -
    - -### Add New Column - -To add a new column to a table, either click on the kebab menu icon on the right of the table name and then select the **Add new column** option or click on the **+** button present at the end of the column header. - -A drawer from the right will open up where you can enter the details for the new column: - -- **Column Name**: Enter a unique name for the new column, serving as its key identifier. -- **Data Type**: Choose the appropriate data type for the column from the [available options](./data-types#supported-data-types). For more information on data types and their associated constraints, see the [Supported Data Types](./data-types#supported-data-types) and [Permissible Constraints per Data Type](./data-types#permissible-constraints-per-data-type) sections. -- **Default Value**: Specify any default value that should be assigned to the column. Optionally, users can leave this field blank. When a table contains rows and NOT NULL is applied to one of its existing or new columns, specifying a default value becomes compulsory. -- **Foreign Key Relation**: Click on the toggle to add a foreign key relationship to the column. This will open a menu where you can select the target table and column to reference. - -
    - ToolJet database -
    - -
    - -
    - -### Export Schema - -The export schema option allows you to download the selected table schema in a JSON file. This does not export the table data or the relationships.
    -While exporting the app, you can choose to export the app with or without a table schema connected to the app.
    -To export the table schema, click on the three vertical dots icon on the right of the table name and then click on the **Export** option. A JSON file will be downloaded with the table schema. - -
    - ToolJet database -
    - -
    - -
    - -### Delete Table - -To delete a table, click on the three vertical dots icon on the right of the table name and then click on the **Delete** option. A confirmation modal will appear, click on the **Delete** button to delete the table. - -
    - ToolJet database -
    - -
    - -
    - -### Edit Column - -To edit a column, click on the kebab menu on the column name and select the option to **Edit column**. When you edit the column, the data type cannot be changed. - -
    - ToolJet database -
    - -
    - -
    - -### Delete Column - -To delete a column, click on the kebab menu on the column name and select the option to **Delete**. You cannot delete a column if it is being used as a primary key. You will have to remove the primary key constraint from the column before deleting it. - -
    - ToolJet database -
    - -
    - -
    +
    ## Adding and Modifying Data @@ -349,38 +67,20 @@ To delete a column, click on the kebab menu on the column name and select the op The Add new data button on the top of the table editor allows you to add data to the table. You can either **[Add new row](#add-new-row)** or **[Bulk upload data](#bulk-upload-data)** to add the data to the table. -
    - ToolJet database -
    - -
    - -
    +ToolJet database ### Add New Row To add a new row to a table, either click on the `Add new data` button on top and then select the **Add new row** option or click on the **+** button present at the bottom left.
    A drawer from the right will open up where the values for the new row can be provided. -
    - ToolJet database -
    - -
    - -
    +ToolJet database ### Edit Row To edit a row, hover on the row that you want to edit and the expand icon will appear next to the checkbox of that row. Click on the Expand icon to open the drawer and edit the row. -
    - ToolJet database -
    - -
    - -
    +ToolJet database ### Edit a Cell @@ -389,13 +89,7 @@ To edit a row, hover on the row that you want to edit and the expand icon will a - Click on the **Save** button or press **Enter** to save the changes. - For boolean-type columns, use the toggle to change the value. -
    - ToolJet database -
    - -
    - -
    +ToolJet database ### Bulk Upload Data @@ -414,28 +108,28 @@ Once the CSV file is ready, click on the file picker to select the file or drag - There is a limit of 1000 rows per CSV file that can be uploaded to the ToolJet database. - The CSV file should not exceed 2MB in size. -
    - ToolJet database -
    +:::info +You can overcome the above limitations in the self-hosted version by adding the following environment variables: +- `TOOLJET_DB_BULK_UPLOAD_MAX_ROWS`: Specifies the maximum number of rows that can be uploaded. The default is 1,000 rows. +- `TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB`: Specifies the maximum CSV file size for bulk uploads. The default maximum size is 5 MB. +::: -
    - -
    +ToolJet database ### Delete Records To delete one or many records/rows, click the checkbox to the right of the record or records you want to delete. As soon as you select a single record, the button to delete the record will appear on the top, click on the **Delete record** button to delete the selected records. -
    - ToolJet database -
    +ToolJet database
    -
    +
    ## Filter +### Add Filter + You can add as many filters as you want into the table by clicking on the **Filter** button present on the top of the database editor. #### Adding a filter on the table data @@ -459,20 +153,22 @@ You can add as many filters as you want into the table by clicking on the **Filt | **in** | This operation is used to check if the value of the column is in the list of values entered in the input field. ex: `(1,2,3)` | | **is** | This operation is used to check if the value of the column is equal to the value entered in the input field. This operation is used for boolean data types. | -
    - ToolJet database -
    +ToolJet database + +### Clear Filter + +You can either delete filters individually or clear all the filters together. + +ToolJet database
    -
    +
    ## Sort To sort the table data, click on the **Sort** button on top, select a **column** from the dropdown, and then choose an order **ascending** or **descending**. -
    - ToolJet database -
    +ToolJet database
    \ No newline at end of file diff --git a/docs/docs/tooljet-db/querying-tooljet-db.md b/docs/docs/tooljet-db/querying-tooljet-db.md index 15d2128620..c8483de264 100644 --- a/docs/docs/tooljet-db/querying-tooljet-db.md +++ b/docs/docs/tooljet-db/querying-tooljet-db.md @@ -175,9 +175,8 @@ The date with time column stores data in the ISO 8601 format. When querying a ta 1. Connect the query to the Table Component and navigate to its properties panel. 2. In the Columns section, select the column that stores the date with time. 3. Change the column type from String to **Date Picker**. -4. In the **Parse format** section, enable the **Parse in unix timestamp** and **Unix timestamp** options as needed. -5. Under the date format section, toggle on the **Enable date** and **Enable time** options accordingly. -6. In the transformation field, the `{{cellValue}}` variable contains the ISO 8601 formatted date. Convert it to a Date object using `{{new Date(cellValue)}}`, then format the Date object to meet your requirements. +4. Under the date format section, toggle on the **Enable date** and **Enable time** options accordingly. +5. In the transformation field, the `{{cellValue}}` variable contains the ISO 8601 formatted date. Convert it to a Date object using `{{new Date(cellValue)}}`, then format the Date object to meet your requirements.
    @@ -186,6 +185,108 @@ The date with time column stores data in the ISO 8601 format. When querying a ta
    +
    + +## Querying JSON Data Type + +In ToolJet Database, a column can be set to JSON Data Type. It can be used to store structured data like arrays or nested objects, making it useful for complex data structures such as configurations or logs. To query the JSON Data Type, follow the following steps: + +### Flat JSON Object + +A flat JSON object is a JSON structure where all key-value pairs exist at a single level, without any nesting. Each key is unique within the object, and all values are direct data entries rather than other objects or arrays. + +1. Add **ToolJet DB** as the Data Source from the query panel. +2. Select **GUI mode** (else you can select SQL mode as well). +3. Select the **Table name**. +4. Select the desired operation from the dropdown. +5. Click on **+ Add Condition** button in front of Filter. +6. Choose column that consist JSON Data, choose the desired operation and enter the value. +7. In the input box below the column name, enter the desired key by adding `->>` before the key, example `->>city`. + +ToolJet Database Date + +
    +**Response Example** + +```json +[ + { + "id":1, + "json":{ + "id":101, + "age":30, + "city":"Los Angeles", + "name":"Alice Johnson", + "email":"alice@example.com", + "country":"USA" + } + } +] +``` + +
    + +### Nested JSON Object + +A nested JSON object is a JSON structure that contains key-value pairs, where some values are themselves JSON objects or arrays. This creates a hierarchical, multi-level structure with nested layers, which can represent complex relationships between data elements. + +1. Add **ToolJet DB** as the Data Source from the query panel. +2. Select **GUI mode** (else you can select SQL mode as well). +3. Select the **Table name**. +4. Select the desired operation from the dropdown. +5. Click on **+ Add Condition** button in front of Filter. +6. Choose column that consist JSON Data, choose the desired operation and enter the value. +7. In the input box below the column name, enter the desired JSON path by adding `->` before each key, example `->user->preferences->settings->notifications->sms->alerts->appointments->cancellations`. + +ToolJet Database Date + +**Note:** You can use `->` to access nested JSON fields and use `->>` to access the text. + +
    +**Response Example** + +```json +[ + { + "id": 102, + "name": "Michael Brown", + "age": 25, + "email": "michael@example.com", + "user": { + "preference": { + "settings": { + "notification": { + "sms": { + "alert": false + } + } + } + } + } + }, + { + "id": 104, + "name": "David Miller", + "age": 35, + "email": "david@example.com", + "user": { + "preference": { + "settings": { + "notification": { + "sms": { + "alert": false + } + } + } + } + } + } +] +``` + +
    + +
    :::info diff --git a/docs/docs/tooljet-db/table-operations.md b/docs/docs/tooljet-db/table-operations.md new file mode 100644 index 0000000000..dd9e52b13b --- /dev/null +++ b/docs/docs/tooljet-db/table-operations.md @@ -0,0 +1,79 @@ +--- +id: table-operations +title: Table Operations +--- + +## Search Table + +Open the Search bar by clicking on the **Search** button and search for a table in the ToolJet database by entering the table name. + +ToolJet database + +
    + +## Rename Table + +To rename a table, click on the kebab menu icon on the right of the table name and then select the **Edit table** option. A drawer will open from the right from where you can edit the table name. + +ToolJet database + +
    + +
    + +## Add New Column + +To add a new column to a table, either click on the kebab menu icon on the right of the table name and then select the **Add new column** option or click on the **+** button present at the end of the column header. + +A drawer from the right will open up where you can enter the details for the new column: + +- **Column Name**: Enter a unique name for the new column, serving as its key identifier. +- **Data Type**: Choose the appropriate data type for the column from the [available options](/docs/tooljet-db/data-types#supported-data-types). For more information on data types and their associated constraints, see the [Supported Data Types](/docs/tooljet-db/data-types#supported-data-types) and [Permissible Constraints per Data Type](/docs/tooljet-db/data-types#permissible-constraints-per-data-type) sections. +- **Default Value**: Specify any default value that should be assigned to the column. Optionally, users can leave this field blank. When a table contains rows and NOT NULL is applied to one of its existing or new columns, specifying a default value becomes compulsory. +- **Foreign Key Relation**: Click on the toggle to add a foreign key relationship to the column. This will open a menu where you can select the target table and column to reference. + +ToolJet database + +
    + +
    + +## Export Schema + +The export schema option allows you to download the selected table schema in a JSON file. This does not export the table data or the relationships.
    +While exporting the app, you can choose to export the app with or without a table schema connected to the app.
    +To export the table schema, click on the three vertical dots icon on the right of the table name and then click on the **Export** option. A JSON file will be downloaded with the table schema. + +ToolJet database + +
    + +
    + +## Delete Table + +To delete a table, click on the three vertical dots icon on the right of the table name and then click on the **Delete** option. A confirmation modal will appear, click on the **Delete** button to delete the table. + +ToolJet database + +
    + +
    + +## Edit Column + +To edit a column, click on the kebab menu on the column name and select the option to **Edit column**. When you edit the column, the data type cannot be changed. + +ToolJet database + +
    + +
    + +## Delete Column + +To delete a column, click on the kebab menu on the column name and select the option to **Delete**. You cannot delete a column if it is being used as a primary key. You will have to remove the primary key constraint from the column before deleting it. + +ToolJet database + +
    diff --git a/docs/docs/tooljet-db/tooljet-database.md b/docs/docs/tooljet-db/tooljet-database.md index 6601e42844..af43b9bbe7 100644 --- a/docs/docs/tooljet-db/tooljet-database.md +++ b/docs/docs/tooljet-db/tooljet-database.md @@ -17,7 +17,7 @@ Requires: - PostgREST server - Additional configuration for ToolJet server -This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enable-tooljet-database--optional-) is set to `true`. +This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enable-tooljet-database-required) is set to `true`.
    @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: @@ -36,8 +37,7 @@ If this parameter is not specified, then PostgREST refuses authentication reques | PGRST_JWT_SECRET | JWT token client provided for authentication | | PGRST_DB_URI | database connection string for tooljet database | | PGRST_LOG_LEVEL | `info` | -| TOOLJET_DB_RECONFIG | `true` or `false` | -| TOOLJET_DB_STATEMENT_TIMEOUT | statement timeout in milliseconds | +| 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]` @@ -48,9 +48,8 @@ Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASS #### Additional ToolJet server configuration -|
    Variable
    |
    Description
    | +|
    Variable
    |
    Description
    | | ------------------ | -------------------------------------------- | -| ENABLE_TOOLJET_DB | `true` or `false` | | TOOLJET_DB | Default value is `tooljet_db` | | TOOLJET_DB_HOST | database host | | TOOLJET_DB_USER | database username | @@ -58,6 +57,8 @@ Please make sure that DB_URI is given in the format `postgres://[USERNAME]:[PASS | 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). @@ -91,7 +92,7 @@ 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.com)**, **[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.ai)**, **[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/docs/tutorial/creating-app.md b/docs/docs/tutorial/creating-app.md index 08d97e2496..425ef29e39 100644 --- a/docs/docs/tutorial/creating-app.md +++ b/docs/docs/tutorial/creating-app.md @@ -25,7 +25,8 @@ You will be redirected to the visual app editor once the app has been created. C
    The main components of an app: +an app: -- **[Widgets](https://docs.tooljet.com/docs/tutorial/adding-widget)** - UI components such as tables, buttons, dropdowns. -- **[Data sources](https://docs.tooljet.com/docs/tutorial/adding-a-datasource)** - ToolJet can connect to databases, APIs and external services to fetch and modify data. -- **[Queries](https://docs.tooljet.com/docs/tutorial/building-queries)** - Queries are used to access the connected data sources. \ No newline at end of file +- **[Widgets](/docs/tutorial/adding-widget)** - UI components such as tables, buttons, dropdowns. +- **[Data sources](/docs/tutorial/adding-a-datasource)** - ToolJet can connect to databases, APIs and external services to fetch and modify data. +- **[Queries](/docs/tutorial/building-queries)** - Queries are used to access the connected data sources. \ No newline at end of file diff --git a/docs/docs/tutorial/manage-users-groups.md b/docs/docs/tutorial/manage-users-groups.md deleted file mode 100644 index 9426c646c2..0000000000 --- a/docs/docs/tutorial/manage-users-groups.md +++ /dev/null @@ -1,210 +0,0 @@ ---- -id: manage-users-groups -title: Managing Users and Groups ---- - -# Managing Users and Groups - -This guide explains how to manage users and groups in ToolJet. For an overview of the permission system, please refer to the [Permissions](../org-management/permissions.md) documentation. - -## Managing Users Across Workspaces - -Admins can view and manage users across all workspaces in their ToolJet instance. To view users across workspaces: - -1. Go to **Settings** > **All Users**. -2. This will let you view all users in your instance across all workspaces. -3. The total users and builder count will be displayed on the top right corner of the page. - -
    -User Count -
    - -## Managing Users in a Workspace - -Admins of a workspace can invite users to the workspace, archive/unarchive existing users, and manage user metadata. To manage users in a workspace: - - 1. Go to the **Workspace Settings**. - 2. Click on the **Users** tab. - -
    - -Manage Users - -
    - -### Inviting Users - -Admins can invite users to a workspace using the email address. To invite new users to your workspace: - -1. Go to **Workspace Settings** > **Users**. -2. Click the **Add users** button. -3. In the drawer that opens, fill in the user's details: - - Full Name - - Email address - - User Role: - - Admin, Builder, or End-user - - Optional: Assign to custom groups - - Optional: Add user metadata (key-value pairs) -4. Click **Invite Users** to send the invitation. - -
    -Invite user modal -
    - -An email containing the invite link to join the workspace will be sent to the invited user. The status will change from **Invited** to **Active** once the user successfully joins your workspace using the invite link. - -:::tip -You can also copy the invitation URL by clicking on the **Copy** link next to the **Invited** status of the invited user. -::: - -### Bulk Inviting Users - -You can invite multiple users to your workspace using a CSV file. To bulk invite users: - -1. Click **Add users** and select the **Upload CSV file** tab. -2. Download the sample CSV file and fill it with user information, including optional metadata. -3. Upload the completed CSV file. - -
    -Bulk Invite Users -
    - -When preparing your CSV file, you can include an optional column for user metadata. The metadata should be formatted as a JSON string in the CSV file. - -
    -**Example CSV row with metadata** - - - ``` -Full Name,Email,Role,Groups,Metadata -William Cushing,william.cushing@altostrat.com,Admin,,"{'key1': 'value1', 'key2': 'value2'}" - - ``` - -
    - -### Edit User Details - -Admins can edit the details of any user in their workspace. To edit the details of a user: - -1. Go to the **Users** settings from the **Workspace Settings**. -2. Click on the kebab menu next to the user you want to edit and select **Edit user details**. -3. In the drawer that opens, you can: - - Add or remove the user from groups - - Change the user's role (Admin, Builder, or End-user) - - Add, edit, or remove user metadata (key-value pairs) -4. Once you have made the changes, click on the **Update** button. - -
    - -edit user - -
    - -## User Metadata - -User Metadata allows you to store additional information for users in your workspace. This custom data is stored at the workspace level and can include any key-value pairs relevant to your organization's needs. - -- User metadata can be added when inviting a new user or editing an existing user. Additionally, you can also specify metadata while bulk inviting users. -- It can store various types of information such as user preferences, API keys, or role-specific data. -- Metadata is accessible in your applications through the global variable `{{globals.currentUser.metadata}}`. -- All metadata values are encrypted in the database for security. -- In the user interface, metadata values are masked to protect sensitive information. - -### Using User Metadata in Applications - -You can access user metadata in the app builder using the following syntax: - -```javascript -{{globals.currentUser.metadata.}} // Replace with the key of the metadata value -``` - -:::info -Remember that while metadata values are masked in the user interface, they are accessible in the App builder. Ensure you handle any sensitive information appropriately in your app logic. -::: - -## Managing Groups - -### Default Groups - -By default, every workspace has three default groups corresponding to user roles: - -1. **Admin**: Full access to manage the workspace, including users, groups, and all resources. -2. **Builder**: Can create and edit apps, data sources, and other resources. -3. **End-user**: Can only view and use apps they have been given access to. - -These groups have predefined permissions. The **Admin** and **End-user** groups cannot be modified, while the **Builder** group can be edited to change permissions. A user can be added to only one default group at a time. - -
    -Archive/Unarchive User -
    - -### Creating Custom Groups - -Admins of a workspace can create custom groups to manage permissions. To create a custom group: - -1. Go to **Workspace Settings** > **Groups**. -2. Click **+ Create new group**. -3. Enter a name for the group and click **Create Group**. -4. Set up the group's properties: - - Users: Add users to the group - - Permissions: Set permissions for workspace resources. These include Apps, Folders & Workspace constants. - - Granular Permissions: Configure granular & asset-level permissions. - - Apps: Assign app access. - - Data Sources: Define data source access. - -
    -Create Custom Group -
    - -### Modifying Group Permissions - -:::info -For detailed information on permissions, refer to the [Permissions](../org-management/permissions.md) documentation. -::: - -When changing permissions for a custom group: - -1. Navigate to the group's settings. -2. Modify the permissions as needed. -3. If the changes affect user roles, a confirmation modal will appear showing all affected changes. -4. Review and confirm the changes. - -
    -Modify Group Permissions -
    - -:::caution -Changing group permissions may automatically update user roles. Review changes carefully before confirming. -::: - -### Deleting a Custom Group - -To delete a custom group: - -1. Go to **Workspace Settings** > **Groups**. -2. Click on the kebab menu next to the group you want to delete. -3. Select **Delete** from the dropdown and confirm the action in the popup dialog. - -
    -Deleting Custom Group -
    - -### Duplicate Group - -To duplicate a group: - -1. Go to **Workspace Settings** > **Groups**. -2. Click on the kebab menu next to the group you want to duplicate. -3. Select **Duplicate** from the dropdown and select the parts of the group you want to duplicate. -4. Click **Duplicate** to create a new group with the selected permissions. - -
    -Duplicate Group -
    - -:::tip -Regularly review group permissions and user roles to ensure proper access control. -::: - ---- \ No newline at end of file diff --git a/docs/docs/tutorial/pages.md b/docs/docs/tutorial/pages.md index c2abf405c7..e0dc3c1cd6 100644 --- a/docs/docs/tutorial/pages.md +++ b/docs/docs/tutorial/pages.md @@ -89,9 +89,9 @@ The duplicate page option allows you to create and add a copy of the page in the Like other ToolJet components, pages can also be attached to event handlers. For pages, the **On page load** event is available. You can use all the available actions for this event, along with the new actions added specifically for Pages. -- **[Switch Page](../actions/switch-page)** -- **[Set Page Variable](../actions/set-page-variable)** -- **[Unset Page Variable](../actions/unset-page-variable)** +- **[Switch Page](/docs/actions/switch-page)** +- **[Set Page Variable](/docs/actions/set-page-variable)** +- **[Unset Page Variable](/docs/actions/unset-page-variable)** ### Disable Page @@ -111,9 +111,9 @@ You can **delete** a page from an application using this option.
    | Variable | Description | | ----------- | ----------- | -| handle | The handle represents the slug of the page within an app. In the URL `https://app.tooljet.com/applications/crm2/home`, **crm2** refers to the app name, and **home** corresponds to the handle. The handle is automatically set when a page is added, and you can also [rename](#rename) the handle from the Page options. To access the value of the handle variable dynamically, use `{{page.handle}}`| +| handle | The handle represents the slug of the page within an app. In the URL `https://app.tooljet.ai/applications/crm2/home`, **crm2** refers to the app name, and **home** corresponds to the handle. The handle is automatically set when a page is added, and you can also [rename](#rename) the handle from the Page options. To access the value of the handle variable dynamically, use `{{page.handle}}`| | name | The name indicates the name of the page set during its creation. To access the value of the name variable dynamically, use `{{page.name}}` | | id | Each page in the ToolJet app receives a unique identifier upon creation. To access the value of the id dynamically, use `{{page.id}}` | -| variables | Variables is an object that contains all the variables created for a specific page using the [Set Page Variable](../actions/set-page-variable) action. The value of a specific variable can be accessed dynamically using `{{page.variables.}}`, where `` refers to the variable created for that page using the Set Page variable action. | +| variables | Variables is an object that contains all the variables created for a specific page using the [Set Page Variable](/docs/actions/set-page-variable) action. The value of a specific variable can be accessed dynamically using `{{page.variables.}}`, where `` refers to the variable created for that page using the Set Page variable action. |
    diff --git a/docs/docs/tutorial/tooljet-api.md b/docs/docs/tutorial/tooljet-api.md deleted file mode 100644 index 8b8cbcfdca..0000000000 --- a/docs/docs/tutorial/tooljet-api.md +++ /dev/null @@ -1,437 +0,0 @@ ---- -id: tooljet-api -title: ToolJet API ---- -
    Available on: Paid plans
    - -:::info BETA -ToolJet API is currently in beta and not recommended for production use. -::: - -ToolJet API allows you to interact with the ToolJet platform programmatically. You can use the APIs to manage users and their workspaces relations. The API endpoints are secured with an access token. You can perform various operations using the API such as: - - - [Get All Users](#get-all-users) - - [Get User by ID](#get-user-by-id) - - [Create User](#create-user) - - [Update User](#update-user) - - [Add User Metadata](#add-user-metadata) - - [Update User Metadata](#update-user-metadata) - - [Replace User Workspace](#replace-user-workspace) - - [Replace User Workspaces Relations](#replace-user-workspaces-relations) - - [Get All Workspaces](#get-all-workspaces) - -## Enabling ToolJet API - -By default, the ToolJet API is disabled. To enable the API, add these variables to your `.env` file: - -| variable | description | -| :-----------------------: | :------------------------------------------------:| -| ENABLE_EXTERNAL_API | `true` or `false` | -| EXTERNAL_API_ACCESS_TOKEN | `` (To authenticate API requests) | - - -## Security - -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' \ --H 'Authorization: Basic ' \ --H 'Content-Type: application/json' - -``` - -
    - -## API Endpoints - -### **Get All Users** - - **Description:** Retrieves a list of all the users. - - **URL:** `/api/ext/users` - - **Method:** GET - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Response:** Array of User objects. -
    - **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": "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" - } - ] - } - ] - } - ] -``` -
    - -### **Get User by ID** - - **Description:** Returns a user by their ID. - - **URL:** `/api/ext/user/:id` - - **Method:** GET - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Params:** - - id (string): The ID of the user. - - **Response:** User object. -
    - **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": "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" - } - ] - } - ] -} -``` -
    - - -### **Create User** - - **Description:** Creates a new user. - - **URL:** `/api/ext/users` - - **Method:** POST - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Body:** The body object can contain the following fields: - - `name` (string, required): The name of the user. - - `email` (string, required): The email address of the user. - - `password` (string, optional): The user's password. Must be between 5 and 100 characters. - - `status` (string, optional): The status of the user. Can be either `active` or `archived`. Defaults to `archived` if not provided. - - `workspaces` (array, required): An array of workspace objects associated with the user. Each workspace object should contain: - - `id` (string, required): The unique identifier of the workspace. - - `name` (string, required): The name of the workspace. - - `status` (string, optional): The status of the workspace. Can be either `active` or `archived`. - - `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`. -
    - **Request Body Example** -```json -{ - "name": "Alice Johnson", - "email": "alice@example.com", - "password": "qwy@4xt123", - "status": "active", - "workspaces": [ - { - "name": "team-spac", - "status": "active", - "groups": [ - { - "name": "all_users" - } - ] - } - ] -} -``` -
    - - **Response:** `201 Created` - -### **Update User** - - **Description:** Finds and updates a user by their ID. - - **URL:** `/api/ext/user/:id` - - **Method:** PATCH - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Params:** - - id (string): The ID of the user. - - **Body:** The body object can contain the following fields: - - `name` (string, optional): The updated name of the user. - - `email` (string, optional): The updated email address of the user. - - `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`. - - `workspaces` (array, optional): An updated array of workspace objects associated with the user. Each workspace object should contain: - - `id` (string, required): The unique identifier of the workspace. - - `name` (string, required): The name of the workspace. - - `status` (string, optional): The status of the workspace. Can be either `active` or `archived`. - - `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`. -
    - -Request Body Example - -```json - -{ - "name": "Allen Johnson", - "email": "allen@example.com" -} - -``` - -
    - - - **Response:** `200 OK` - - -### **Add User Metadata** - - **Description:** Adds metadata to a user's profile. - - **URL:** `/api/ext/user/:id/metadata` - - **Method:** POST - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Params:** - - id (string): The ID of the user. - - **Body:** - ```json - { - "metadata": { - "key1": "value1", - "key2": "value2" - } - } - ``` -
    - -Request Body Example - -```json - -{ -} - -``` - -
    - - - **Response:** `200 OK` - -### **Update User Metadata** - - **Description:** Updates existing metadata of a user's profile. - - **URL:** `/api/ext/user/:id/metadata` - - **Method:** PUT - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Params:** - - id (string): The ID of the user. - - **Body:** - ```json - { - "metadata": { - "key1": "new_value1", - "key3": "value3" - } - } - ``` - -
    - -Request Body Example - -```json - -{ -} - -``` - -
    - - **Response:** `200 OK` -  -### **Replace User Workspaces Relations** - - - **Description:** Replaces all workspaces relations associated with a user. - - **URL:** `/api/ext/user/:id/workspaces` - - **Method:** PUT - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Params:** - - id (string): The ID of the user. - - **Body:** Array of workspace data transfer objects. It may contain the following fields: - - `id` (string, required): The unique identifier of the workspace. - - `name` (string, required): The name of the workspace. - - `status` (string, optional): The status of the workspace. Can be either `active` or `archived`. - - `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`. - - **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` - - **Method:** PATCH - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Params:** - - id (string): The ID of the user. - - workspaceId (string): The ID of the workspace. - - **Body:** The body object can contain the following fields: - - `id` (string, optional): The ID of the workspace. - - `name` (string, optional): The updated name of the workspace. - - `status` (string, optional): The updated status of the workspace. Can be either `active` or `archived`. - - `groups` (array, optional): An array of group objects associated with the workspace. Each group object can contain: - - `id` (string, optional): The ID of the group. - - `name` (string, optional): The name of the group. -
    - -Request Body Example - -```json - -{ - "status": "archived", - "groups": [ - { - "name": "all_users" - } - ] -} - -``` - -
    - - **Note:** If no body is given or body is an empty object, it will not do anything. - - **Response:** `200 OK` - -### **Get All Workspaces** - - - **Description:** Retrieves a list of all workspaces. - - **URL:** `/api/ext/workspaces` - - **Method:** GET - - **Authorization:** `Basic ` - - **Content-Type:** `application/json` - - **Response:** Array of Workspace objects. - -
    -Response Example - -```json -[ - { - "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" - } - ] - } -] -``` -
    - - - diff --git a/docs/docs/user-authentication/general-settings.md b/docs/docs/user-authentication/general-settings.md deleted file mode 100644 index 27da47f7ff..0000000000 --- a/docs/docs/user-authentication/general-settings.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -id: general-settings -title: General Settings ---- - -# Single Sign-On General Settings - -- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard -
    - - General Settings: SSO - -
    - -- Select `SSO` from sidebar and then select **General Settings** -
    - - General Settings: SSO - -
    - -## Enable Signup - -You can enable/disable `Enable signup`. If it is enabled, new account will be created for user's first time SSO sign in else only existing users will be allowed to sign in via SSO. - -## Allowed domains - -You can set allowed domains for SSO login, can add multiple domains comma separated. Allowed all domains by default. - -## Login URL - -You can use the login URL to login directly to the workspace. This will be hidden if Multi-Workspace is disabled. - -
    - -General Settings: SSO - -
    diff --git a/docs/docs/user-authentication/password-login.md b/docs/docs/user-authentication/password-login.md deleted file mode 100644 index 5cd821b919..0000000000 --- a/docs/docs/user-authentication/password-login.md +++ /dev/null @@ -1,71 +0,0 @@ ---- -id: password-login -title: Password Login ---- - -## Enable Password Login - -Password login is a method of user authentication where user can login using their email and password. This method is enabled by default for all workspaces. User with admin privilege can enable/disable it. - -- Go to **Workspace Settings** > **SSO** > **General Settings**. - -- Under **General Settings** section, toggle **Password Login** to enable/disable it. - -
    - -General Settings: Password login - -
    - -## Retry limits - -The user password authentication method will be disabled after predefined numbers of wrong password attempts. This feature can be disabled using setting `DISABLE_PASSWORD_RETRY_LIMIT` to `true` in environment variables. Number of retries allowed will be 5 by default, it can be override by `PASSWORD_RETRY_LIMIT` environment variable. - -## Reset Password - -There are two ways through which a user can reset their password. The first method is where user can reset their password by themselves. The second method is where a **Super Admin** can reset password for a user. - -### 1. Forgot Password - -- On the login page, click on the **Forgot Password**. -- Enter the registered email address associated with the account and then click on the **Send a reset link** button. -- Receive a password reset link via email. -- Click on the link to be directed to the password reset page. -- Follow the prompts to set a new password. - -
    - -General Settings: Reset Password - -
    - -### 2. **Super Admin** - -- Reach out to the **[Super Admin](/docs/Enterprise/superadmin)** of the workspace. -- The **Super Admin** can reset the password for the user from the **Settings** > **All Users** section. -- Select the user for whom the password needs to be reset. -- Click on the kebab icon(three dots) on the right side of the user's name and select **Reset Password**. -- A modal will appear with two options to reset the password: **Automatically generate a password** and **Create password**. - -#### Automatically Generate Password - -- Selecting this option will automatically generate a new password for the user. -- Click on the **Reset** button to reset the password and the new password will be displayed in the modal. -- Super Admin can copy this password and provide it to the user securely. - -
    - -General Settings: Reset Password - -
    - -#### Create Password - -- Selecting this option will allow the Super Admin to create a new password for the user. -- Enter the new password and click on the **Reset** button. - -
    - -General Settings: Reset Password - -
    \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/_category_.json b/docs/docs/user-authentication/sso/_category_.json deleted file mode 100644 index 109724a4fd..0000000000 --- a/docs/docs/user-authentication/sso/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Single Sign-on", - "position": 10, - "collapsed": true -} \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/auto-sso-login.md b/docs/docs/user-authentication/sso/auto-sso-login.md deleted file mode 100644 index a4fb89b7f4..0000000000 --- a/docs/docs/user-authentication/sso/auto-sso-login.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -id: auto-sso-login -title: Automatic SSO Login ---- - -
    Available on: Paid plans
    - -ToolJet supports automatic SSO login for your workspace, allowing users to bypass the login screen and directly access the application when only one SSO method is configured. - -### Configuring Automatic SSO Login - -To enable automatic SSO login, you need to configure the following settings: - -1. Go to **Workspace settings** > **Workspace login**. - -2. Ensure that only one SSO method is enabled and password login is disabled. - -3. Look for the **Automatic SSO Login** toggle. This toggle will be disabled if multiple SSO methods are enabled or password login is enabled. - -
    - Automatic SSO Login -
    - -4. Enable the **Automatic SSO Login** toggle. - -5. Click **Save Changes**. \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/github.md b/docs/docs/user-authentication/sso/github.md deleted file mode 100644 index 04d48ee4ba..0000000000 --- a/docs/docs/user-authentication/sso/github.md +++ /dev/null @@ -1,129 +0,0 @@ ---- -id: github -title: GitHub ---- - -# GitHub Single Sign-on Configuration - -To enable GitHub Single Sign-on (SSO) for your ToolJet instance, follow these steps: - -1. From the ToolJet dashboard, go to **Settings** (⚙️) from the bottom of the left sidebar and select the **Workspace Settings**. - -2. In the **Workspace Settings**, select **Workspace login** from the sidebar. On the right, you'll see toggles to enable SSO via different clients. All the client toggles are disabled by default. After turning it on, a modal will appear with input fields for parameters such as Host name, Client ID, and Client secret. 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` that you will need to utilize in the GitHub Developer settings. - - GitHub SSO - -3. Now go to the **[GitHub Developer settings](https://github.com/settings/developers)** and navigate to `OAuth Apps` and create a new OAuth App. - -- Enter the **App Name**, **Homepage URL**, and **Authorization callback URL**. The **Authorization callback URL** should be the generated `Redirect URL` in the ToolJet GitHub manage SSO page. Click on the **Register application** button to create the OAuth App. - -
    - GitHub SSO -
    - -- The **Client ID** will be generated automatically. -- Generate the **Client Secret** by clicking the `Generate a new client secret` button. - -
    - GitHub SSO -
    - -4. Open the ToolJet's GitHub SSO settings and enter the obtained **Client ID** and **Client Secret**. - -
    - GitHub SSO -
    - -5. If you are using **GitHub Enterprise** self-hosted, enter the `Host Name`. The host name should be a URL and should not end with `/`, for example, `https://github.tooljet.com`. If it is not self-hosted, you can skip this field. - -6. Finally, click on the **Save changes** button and the GitHub sign-in button will now be available in your ToolJet login screen. - -7. Obtain the Login URL from the **[General Settings](/docs/user-authentication/general-settings#login-url)** of the SSO page. - -
    - -### Setting Default SSO - -To set GitHub as the default SSO for the instance, use the following environment variables: - -|
    Variable
    |
    Description
    | -| ---------------------------- | ----------------------------------------------- | -| SSO_GIT_OAUTH2_CLIENT_ID | GitHub OAuth client ID | -| SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | -| SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self-hosted | - -**Redirect URL should be `/sso/git`** - -
    - -
    - -### Exposed ssoUserInfo - -Once the GitHub SSO is configured (on ToolJet version **`2.28.0-ee2.12.2`** or above), ToolJet will expose the user info returned by the GitHub. The user info will be available under the `ssoUserInfo` property of the `currentUser` global variable. Check the **[Inspector](/docs/how-to/use-inspector)** doc to learn more. - -The exposed user info can be dynamically accessed throughout the apps using JS **`{{globals.currentUser.ssoUserInfo.}}`** - -The following is an example of the user info returned by GitHub: - -|
    Key
    |
    Description
    |
    Syntax to Access
    | -| :---------------------- | :------------------------------------------------------------------- | :-------------------------------------------------------- | -| **login** | GitHub username | `{{globals.currentUser.ssoUserInfo.login}}` | -| **id** | GitHub user ID | `{{globals.currentUser.ssoUserInfo.id}}` | -| **node_id** | GitHub user node ID | `{{globals.currentUser.ssoUserInfo.node_id}}` | -| **avatar_url** | GitHub user avatar URL | `{{globals.currentUser.ssoUserInfo.avatar_url}}` | -| **gravatar_id** | GitHub user gravatar ID | `{{globals.currentUser.ssoUserInfo.gravatar_id}}` | -| **url** | GitHub user URL | `{{globals.currentUser.ssoUserInfo.url}}` | -| **html_url** | GitHub user HTML URL | `{{globals.currentUser.ssoUserInfo.html_url}}` | -| **followers_url** | GitHub user followers URL | `{{globals.currentUser.ssoUserInfo.followers_url}}` | -| **following_url** | GitHub user following URL | `{{globals.currentUser.ssoUserInfo.following_url}}` | -| **gists_url** | GitHub user gists URL | `{{globals.currentUser.ssoUserInfo.gists_url}}` | -| **starred_url** | GitHub user starred URL | `{{globals.currentUser.ssoUserInfo.starred_url}}` | -| **subscriptions_url** | GitHub user subscriptions URL | `{{globals.currentUser.ssoUserInfo.subscriptions_url}}` | -| **organizations_url** | GitHub user organizations URL | `{{globals.currentUser.ssoUserInfo.organizations_url}}` | -| **repos_url** | GitHub user repos URL | `{{globals.currentUser.ssoUserInfo.repos_url}}` | -| **events_url** | GitHub user events URL | `{{globals.currentUser.ssoUserInfo.events_url}}` | -| **received_events_url** | GitHub user received events URL | `{{globals.currentUser.ssoUserInfo.received_events_url}}` | -| **type** | GitHub user type | `{{globals.currentUser.ssoUserInfo.type}}` | -| **site_admin** | GitHub user site admin | `{{globals.currentUser.ssoUserInfo.site_admin}}` | -| **name** | GitHub user name | `{{globals.currentUser.ssoUserInfo.name}}` | -| **company** | GitHub user company | `{{globals.currentUser.ssoUserInfo.company}}` | -| **blog** | GitHub user blog | `{{globals.currentUser.ssoUserInfo.blog}}` | -| **location** | GitHub user location | `{{globals.currentUser.ssoUserInfo.location}}` | -| **email** | GitHub user email | `{{globals.currentUser.ssoUserInfo.email}}` | -| **hireable** | GitHub user hireable | `{{globals.currentUser.ssoUserInfo.hireable}}` | -| **bio** | GitHub user bio | `{{globals.currentUser.ssoUserInfo.bio}}` | -| **twitter_username** | GitHub user twitter username | `{{globals.currentUser.ssoUserInfo.twitter_username}}` | -| **public_repos** | GitHub user public repos | `{{globals.currentUser.ssoUserInfo.public_repos}}` | -| **public_gists** | GitHub user public gists | `{{globals.currentUser.ssoUserInfo.public_gists}}` | -| **followers** | GitHub user followers | `{{globals.currentUser.ssoUserInfo.followers}}` | -| **following** | GitHub user following | `{{globals.currentUser.ssoUserInfo.following}}` | -| **created_at** | GitHub user created at | `{{globals.currentUser.ssoUserInfo.created_at}}` | -| **updated_at** | GitHub user updated at | `{{globals.currentUser.ssoUserInfo.updated_at}}` | -| **access_token** | GitHub user access token. Sensitive information of a logged-in user. | `{{globals.currentUser.ssoUserInfo.access_token}}` | - -
    - GitHub SSO -
    - -
    - -
    - -### Example: Getting User Information Using the access_token - -Once a user is logged in to ToolJet using GitHub SSO, the access token of the user becomes available. This access token can be utilized within ToolJet apps to retrieve detailed user information from the GitHub API. - -1. Log in to ToolJet using GitHub Single Sign-on as outlined in the previous setup steps. - -2. Create a new ToolJet application and then create new REST API query. Set the method to `GET` and the URL to `https://api.github.com/user/followers`. This API call will return the list of followers for the logged-in GitHub user. - -3. In the Headers section of the query, include the **key** `Authorization` and set the **value** to `Bearer {{globals.currentUser.ssoUserInfo.access_token}}`. This will pass the user's GitHub access token as a Bearer token in the request header. - -4. Execute the query to fetch the list of followers for the logged-in user. The response will contain the list of followers for the authenticated GitHub user. - -
    - GitHub SSO -
    - -
    \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/google.md b/docs/docs/user-authentication/sso/google.md deleted file mode 100644 index cf69818088..0000000000 --- a/docs/docs/user-authentication/sso/google.md +++ /dev/null @@ -1,70 +0,0 @@ ---- -id: google -title: Google ---- - -# Google Single Sign-on Configuration - -To enable Google Single Sign-on (SSO) for your ToolJet instance, follow these steps: - -1. From the ToolJet dashboard, go to **Settings** (⚙️) from the bottom of the left sidebar and select the **Workspace Settings**. - -2. In the **Workspace Settings**, select **Workspace login** from the sidebar. On the right, you'll see toggles to enable SSO via different clients. All the client toggles are disabled by default. Turn on the Google toggle, a modal will appear with the input field for the parameter Client ID. At the top left of the modal, there is a toggle to enable this modal. Turn it on, and then, without entering the Client ID, click on the **Save changes** button. This will generate a `Redirect URL` that you will need to utilize in the Google Cloud console. - - Generate Redirect URL - -3. Go to **[Google Cloud console](https://console.cloud.google.com/)** and create a project. -
    - - Create New Project - -
    - -- Go to the **[Google Cloud console credentials page](https://console.cloud.google.com/apis/credentials)**, and create an OAuth client ID. -
    - - General Settings: SSO - -
    - -- You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, -select 'External'. -
    - - General Settings: SSO - -
    - -- You'll be led to an app registration page where you can set OAuth scopes. Select 'Add or remove scopes' and add the scopes -`userinfo.email` and `userinfo.profile` as shown in the image. This will allow ToolJet to store the email and name of the -user who is signing in. -
    - - General Settings: SSO - -
    - -- Set the domain on which ToolJet is hosted as an authorized domain. -
    - - General Settings: SSO - -
    - -- Under Authorized redirect URIs, enter the `Redirect URL` which was generated in ToolJet's Google SSO settings. -
    - - General Settings: SSO - -
    - -Lastly, set the `Client ID` in ToolJet's Google SSO settings. This value will be available from your [Google Cloud console credentials page](https://console.cloud.google.com/apis/credentials). - -The Google sign-in button will now be available in your ToolJet login screen. - -## Setting default SSO -To set Google as default SSO for the instance use environment variable. - -|
    Variable
    |
    Description
    | -| ------------------------------------- | ----------------------------------------------------------- | -| SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/ldap.md b/docs/docs/user-authentication/sso/ldap.md deleted file mode 100644 index 5b5071bf42..0000000000 --- a/docs/docs/user-authentication/sso/ldap.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -id: ldap -title: LDAP ---- - -To set up LDAP as Single Sign-On (SSO) for ToolJet, follow these steps: - -1. Access the ToolJet dashboard and click on the ⚙️ icon to open **Workspace Settings** from the left sidebar. - -
    - - SSO :LDAP - -
    - -2. In the Workspace Settings, navigate to the **SSO** section and choose **LDAP**. By default, LDAP login will be **disabled**. - -
    - - SSO :LDAP - -
    - -3. To **enable** LDAP, toggle the switch. Then, add the configuration: - - - **Name**: Enter the name of the SSO. - - **Hostname**: Provide the hostname or IP address of your LDAP server. - - **Port**: Enter the Port number of LDAP server. - - **Base DN**: Enter the base distinguished name. - - **SSL**: Toggle this option to enable the SSL. After enabling you can select the type of SSL: **None** or **Certificates**. If you choose Certificates, you'll need to provide the **Client Key**, **Client Certificate**, and **Server Certificate**. - -
    - - SSO :LDAP - -
    - -4. After making the necessary configurations, click the Save Changes button located at the bottom. - - -5. Next, proceed to the **[General Settings](/docs/user-authentication/general-settings)** and copy the **Login URL** provided. Furthermore, you have the flexibility to choose whether to turn on 'Enable Signups,' allowing users to signup without an invite. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. Conversely, with this option disabled, only invited users can log in, provided SSO authentication is successful. - -
    - - SSO :LDAP - -
    - -6. The **Login URL** obtained can be utilized for accessing the workspace. Please note that ToolJet supports LDAP login at the workspace level and not at the instance level. Thus, users will be logged in specifically to the chosen workspace. - -
    - - SSO :LDAP - -
    - -7. Click on the **Sign in with ``** button, and provide your username and password to log in to the workspace. For signing in, ToolJet uses the **common name (cn)** associated with each LDAP server user as the **Username**. Upon the initial login, users will be redirected to the **Workspace Invite** page, while subsequent logins will lead them directly to the ToolJet dashboard. - -
    - - SSO :LDAP - -
    - -:::info -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. -::: diff --git a/docs/docs/user-authentication/sso/oidc-group-sync.md b/docs/docs/user-authentication/sso/oidc-group-sync.md deleted file mode 100644 index 88197d9895..0000000000 --- a/docs/docs/user-authentication/sso/oidc-group-sync.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -id: oidc -title: OIDC Group Sync ---- - -
    Available on: Paid plans
    - - -# OIDC Group Synchronization - -## Overview - -ToolJet's OIDC (OpenID Connect) group synchronization feature enables seamless integration between your Identity Provider (IdP) and ToolJet's user management system. This functionality automates the process of synchronizing user groups, enhancing security and streamlining user access management. - -## Key Features - -- Centralized access management -- Reduced risk of manual errors -- Automated updates -- Simplified user onboarding - -Group synchronization occurs at each user login, ensuring up-to-date access rights. Users must log out and log back in for changes to take effect, maintaining security integrity across the platform. - -## Implementation - -### 1. Configure OIDC Integration in Your IdP - -Set up an OIDC application in your Identity Provider with the following details: - -- Configure grant types, sign-in redirect URIs, and sign-out redirect URIs as required -- Optionally limit access to specific groups for filtering - - -### 2. Configure OIDC Group Sync in ToolJet - -To set up OIDC group synchronization in ToolJet follow these steps: - -1. Navigate to the **Workspace Settings** > **Workspace Login** Tab. -2. Click on the **OpenID Connect** under the **SSO** section. -3. Enable the **OpenID Connect** toggle and provide the following information: - - - **Name**: Enter a descriptive name for this OIDC configuration. - - **Client ID**: Input the Client ID provided by your Identity Provider (IdP). - - **Client secret**: Enter the Client Secret provided by your IdP. - - **Well known URL**: Provide the Well-Known URL for your OIDC provider. - -
    - OIDC Config Group Sync -
    - -:::info -For a detailed guide on setting up OIDC in ToolJet, refer to our [OIDC](/docs/category/openid-connect/) documentation. -::: - -4. Once you have entered the information related to your IdP credentials, you can proceed to configure group synchronization settings. - -5. Enable the **Group Sync** toggle and provide the following information: - -- **Claim name**: Enter the name of the claim in the OIDC token that contains group information (e.g., `groups`). -- **Group mapping**: Configure how IdP groups map to ToolJet groups. Use the format: - ``` - IdP Group -> ToolJet Group, Another IdP Group -> Another ToolJet Group - ``` - For example: - ``` - Marketing Team -> marketing, Sales Team -> sales - ``` - -
    - OIDC Group Sync Config -
    - -## Group Mapping - -Group mapping in ToolJet follows these principles: - -- Default 1:1 mapping based on group names (case-sensitive) -- Custom group mapping options available -- New custom groups can be created if no exact match exists -- Users without a matching group are assigned to the **end-users** group - -### Group Mapping Scenarios - -| Groups in IdP | Groups in ToolJet | Role Mapping Settings | Result | -|---------------|-------------------|------------------------|--------| -| **admin**, **builder**, **end-user** | Exists | None | User added to corresponding default user group | -| **engineers** | Exists (no permissions) | None | User added to **engineers** custom group and **end-users** default group | -| **engineers** | Exists (with permissions) | None | User added to **engineers** custom group and either **end-users** or **builders** based on permissions | -| **engineers** | Doesn't exist | **engineers → all apps** | User added to **all apps** custom group and **builder** or **end-user** default group based on permissions | -| **engineers** | Doesn't exist | **engineers → builders** | User added to **builders** default group | -| **admin**, **all apps** | Exists | None | User added to **all apps** and assigned **admin** role | -| no group | N/A | None | User added to **end-users** default group | - -## Important Considerations - -- Group synchronization occurs at every login. Users must log out and log back in for changes to be reflected. -- Manual editing of groups is not recommended as changes will be overwritten upon subsequent logins. -- User roles are assigned based on custom group permissions, taking priority over default user roles. -- Group filtering should be configured at the IdP level during OIDC application setup. - -## Licensing - -- If a license expires or downgrades to a plan without group sync, both SSO and group sync features will be disabled. -- Users will need to log in via alternative SSO methods or email/password. -- If the license limit is reached, new users will not be allowed to log in. - -For more information on managing users and groups in ToolJet, please refer to our [Managing Users and Groups](/docs/tutorial/manage-users-groups/) documentation. \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/openid/google-openid.md b/docs/docs/user-authentication/sso/openid/google-openid.md deleted file mode 100644 index 433f85fc68..0000000000 --- a/docs/docs/user-authentication/sso/openid/google-openid.md +++ /dev/null @@ -1,82 +0,0 @@ ---- -id: google-openid -title: Google (Open ID) ---- - -- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard -
    - - Google Open ID - -
    - -- Select `SSO` from workspace options -
    - - Google Open ID - -
    - -- Select `Open ID Connect` from the left sidebar -
    - - Google Open ID - -
    - -- Set **Name** as `Google` and get the **Client ID** and **Client Secret** from your [Google Cloud Console](https://console.cloud.google.com/apis/credentials). - -- Set the **Well Known URL** to `https://accounts.google.com/.well-known/openid-configuration` - -#### Generating Client ID and Client Secret on GCS - -- Go to [Google cloud console](https://console.cloud.google.com/) and create a project. -
    - - Google Open ID - -
    - -- Go to the [Google cloud console credentials page](https://console.cloud.google.com/apis/credentials), and create an OAuth client ID -
    - - Google Open ID - -
    - -- You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, -select 'External'. -
    - - Google Open ID - -
    - -- You'll be led to an app registration page where you can set OAuth scopes. Select 'Add or remove scopes' and add the scopes -userinfo.email and userinfo.profile as shown in the image. This will allow ToolJet to store the email and name of the -user who is signing in -
    - - Google Open ID - -
    - -- Set the domain on which ToolJet is hosted as an authorized domain -
    - - Google Open ID - -
    - -- Set the `Redirect URL` generated at manage SSO `Open ID` page under Authorized redirect URIs -
    - - Google Open ID - -
    - -- Now, you can view your **client ID** and **client secret** from the [Credentials page](https://console.developers.google.com/apis/credentials) in API Console: - - Go to the Credentials page. - - Click the name of your credential or the pencil icon. Your client ID and secret are at the top of the page. - - diff --git a/docs/docs/user-authentication/sso/openid/okta.md b/docs/docs/user-authentication/sso/openid/okta.md deleted file mode 100644 index 4bb6dbef20..0000000000 --- a/docs/docs/user-authentication/sso/openid/okta.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -id: okta -title: Okta ---- - -# Okta Single Sign-On - -1. Sign in to the [Okta developer console](https://developer.okta.com/). - -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. -
    -Okta: SSO -
    - -4. Enter an **App integration name** and set the **Sign-in redirect URIs** to `/sso/openid`. -
    - Okta: SSO -
    - -5. Create the application and configure **Client Credentials** in the UI. -
    - Okta: SSO -
    - -6. To display your application on Okta, edit the application and set the following: - - **Login initiated by**: Either Okta or App - - Set visibility according to your preference - - **Login flow**: Redirect to app to initiate login (OIDC Compliant) -
    - Okta: SSO -
    - -:::info Change Grant type -To change the Login flow to **Redirect to app to initiate login (OIDC Compliant)**, you must change the **Grant type** in the **Client acting on behalf of a user** section to **Implicit (hybrid)** and enable **Allow Access Token with implicit grant type**. -::: - -7. The Okta sign-in button will now appear on your ToolJet login screen. - -:::info Find Well Known URL -For more information on finding the Well Known URL, refer to the [Okta Auth Servers documentation](https://developer.okta.com/docs/concepts/auth-servers/#org-authorization-server). -::: \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/openid/setup.md b/docs/docs/user-authentication/sso/openid/setup.md deleted file mode 100644 index 709a6eeeac..0000000000 --- a/docs/docs/user-authentication/sso/openid/setup.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -id: setup -title: OpenID Setup ---- - -
    Available on: Paid plans
    - -# Configure OpenId Connect Single Sign-on - - -- Go to the **Workspace Settings** (⚙️) from the left sidebar in the ToolJet dashboard -
    - - General Settings: SSO - -
    - -- Select `SSO` from workspace options -
    - - Okta: SSO - -
    - -- Select `OpenId Connect`. -
    - - Okta: SSO - -
    - -- Find and set **Name**, **Client Id**, **Client Secret**, and **Well Known URL** from your Open Id provider. - -
    - -### Exposed ssoUserInfo - -Once the OpenID is configured (on ToolJet version **`v2.6.2-ee2.1.0`** or above), ToolJet will expose the user info returned by the OpenID provider. The user info will be available under the `ssoUserInfo` property of the `currentUser` variable. Check the **[Inspector](/docs/how-to/use-inspector)** doc to learn more. - -The exposed user info can be dynamically accessed throughout the apps using JS **`{{globals.currentUser.ssoUserInfo.}}`** - -The following is an example of the user info returned by Google OpenID provider: - -|
    Key
    |
    Description
    |
    Syntax to access
    | -|:--- |:----------- |:------- | -| **sub** | Subject - Identifier for the End-User at the Issuer. | `{{globals.currentUser.ssoUserInfo.sub}}` | -| **name** | End-User's full name in displayable form including all name parts, possibly including titles and suffixes, ordered according to the End-User's locale and preferences. | `{{globals.currentUser.ssoUserInfo.name}}` | -| **given_name** | Given name(s) or first name(s) of the End-User. | `{{globals.currentUser.ssoUserInfo.given_name}}` | -| **family_name** | Surname(s) or last name(s) of the End-User. | `{{globals.currentUser.ssoUserInfo.family_name}}` | -| **picture** | URL of the End-User's profile picture. This URL MUST refer to an image file (for example, a PNG, JPEG, or GIF image file), rather than to a Web page containing an image. | `{{globals.currentUser.ssoUserInfo.picture}}` | -| **email** | End-User's preferred e-mail address. Its value MUST conform to the RFC 5322 [RFC5322] addr-spec syntax. | `{{globals.currentUser.ssoUserInfo.email}}` | -| **email_verified** | True if the End-User's e-mail address has been verified; otherwise false. | `{{globals.currentUser.ssoUserInfo.email_verified}}` | -| **locale** | End-User's locale, represented as a BCP47 [RFC5646] language tag. This is typically an ISO 639-1 Alpha-2 [ISO639‑1] language code in lowercase and an ISO 3166-1 Alpha-2 [ISO3166‑1] country code in uppercase, separated by a dash. For example, en-US or fr-CA. As a compatibility note, some implementations have used an underscore as the separator rather than a dash, for example, en_US; Relying Parties MAY choose to accept this locale syntax as well. | `{{globals.currentUser.ssoUserInfo.locale}}` | -| **hd** | End-User's hosted domain, if any. | `{{globals.currentUser.ssoUserInfo.hd}}` | -| **access_token** | Access token returned by the OpenID provider. | `{{globals.currentUser.ssoUserInfo.access_token}}` | -| **id_token** | ID token returned by the OpenID provider. | `{{globals.currentUser.ssoUserInfo.id_token}}` | -| **id_token_encrpted** | It is the JSON value of encrypted `id_token` | `{{globals.currentUser.ssoUserInfo.id_token_encrpted}}` | - -
    - -ssouserinfo - -
    - -
    \ No newline at end of file diff --git a/docs/docs/user-authentication/sso/saml.md b/docs/docs/user-authentication/sso/saml.md deleted file mode 100644 index 39b78fbb10..0000000000 --- a/docs/docs/user-authentication/sso/saml.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -id: saml -title: SAML ---- - -ToolJet supports SAML authentication for your workspace. The supported SAML providers are: Okta, Active Directory Federation Services, Azure AD, Auth0 and other SAML SSO providers. - -
    - -### Configuring SAML - -To enable SAML authentication, you need to configure the following workspace settings: - -1. Go to **Workspace Settings** > **SSO** > **SAML**. - -
    - - SSO :SAMP - -
    - -2. By default, SAML is disabled. Toggle it on to enable SAML authentication. - -
    - - SSO :SAMP - -
    - -3. Enter the following configuration details: - - - **SAML Provider Name**: Enter the name of your SAML provider. This name will be displayed on the login page. - - **Identity provider metadata**: Upload the data from the metadata file provided by your SAML provider. This file contains the SAML configuration details. - - **Group Attribute**: Enter the name of the attribute that contains the group information of the user. This attribute is used to map the user to the appropriate group. - - **Redirect URL**: Copy the redirect URL provided and paste it in the SAML provider's configuration page. - - :::tip Downloading the metadata from your identity provider - Generally, the metadata is available in the form of an XML file which can be downloaded from your identity provider's dashboard. - - Copy the metadata from the XML file and paste it into the ToolJet's SAML SSO configuration settings. Please ensure that the metadata is pasted in the correct format, as it contains essential configuration details from the identity provider necessary for authentication. - - Additionally, you can often find this data by navigating to https://<your-identity-provider>/federationmetadata/2007-06/federationmetadata.xml - ::: - -
    - - SSO :SAMP - -
    - -4. Once configured, click **Save Changes**. - -
    - -
    - -### Logging in with SAML - -1. Go to the **[General Settings](/docs/user-authentication/general-settings)** and copy the **Login URL** provided. Furthermore, you have the flexibility to choose whether to turn on 'Enable Signups,' allowing users to signup without an invite. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. Conversely, with this option disabled, only invited users can log in, provided SSO authentication is successful. - -
    - - SSO :SAML - -
    - -2. The **Login URL** obtained can be used to access the workspace. Please note that ToolJet supports SAML login at the workspace level, ensuring users are logged in specifically to the selected workspace. - - As a result, users can now log in to your workspace using the provided Login URL. The login page will prominently feature the name of the SAML provider configured in your workspace settings. - -
    - - SSO :SAMP - -
    - -3. Click on **Sign in with `SAML Name`** button and you will be redirected to the SAML provider's login page. - -
    - - SSO :SAMP - -
    - -4. Enter your credentials and click **Login**. If the user is signing in for the first time, they will be redirected to the ToolJet's onboarding page. - -
    \ No newline at end of file diff --git a/docs/docs/user-authentication/user-lifecycle.md b/docs/docs/user-authentication/user-lifecycle.md deleted file mode 100644 index ddebcf9ae0..0000000000 --- a/docs/docs/user-authentication/user-lifecycle.md +++ /dev/null @@ -1,124 +0,0 @@ ---- -id: user-lifecycle -title: User Lifecycle ---- - -# User Lifecycle - -:::info -Check Workspace docs [here](/docs/tutorial/workspace_overview). -::: - -
    - -### User Onboarding - - - User can sign up using the sign up link provided on the login page, user will receive a welcome email with activation link. New workspace will be created for the user. - -
    - - ToolJet - Workspace sign up - -
    - - - Users can be added to multiple workspaces. Users can create their own workspaces and manage them. - -
    - - ToolJet - Workspace sign up - -
    - - - Existing user in active state for a workspace can be invited and on boarded to other workspaces, User will receive an invitation email with join link. If a user does not exist in the system, then they will receive a welcome email to setup the account, user can follow the link and on setup the account, once its done the user will be assigned to the new workspace created for the user. - -
    - - ToolJet - Workspace sign up - -
    - - - Invited user can onboard through SSO login, without using an invitation link from the workspace [login page](/docs/user-authentication/general-settings#login-url) - -
    - - ToolJet - Workspace accept invite - -
    - - - If `enable sign up` option in enabled in SSO [general settings](/docs/user-authentication/general-settings#enable-signup) for the workspace, user can setup account through SSO login without an invite from the workspace [login page](/docs/user-authentication/general-settings#login-url) - -
    - - ToolJet - Workspace sign up using SSO - -
    - -
    - -
    - -### Archive User - - User can be archived by workspace admin from using `Manage User` page - -
    - - ToolJet -Workspace Archive user - -
    - -
    - -
    - -### Unarchive User - - User can be unarchive by workspace admin from using `Manage User` page - -
    - - ToolJet - Single-Workspace Unarchive user - -
    - - :::info - Archive or unarchive will not affect user login, user can login and use other workspaces where user is in active state. - ::: - -
    - -
    - -### Switch Between Workspaces - -
    - - ToolJet - Workspace sign up using SSO - -
    - -
    - -
    - - -## User Status - -|
    Status
    |
    Able to log in
    |
    How to activate
    | -| -------- | ---------------- | ------------------------------------ | -| active | Yes | | -| invited | No (Yes with SSO)| Login through SSO or invitation link | -| archived | No | Not able to activate. Invite from `Manage Users` page, status will be changed to invited | - -
    - -
    - -## Workspace SSO Flow - - Diagram shows how SSO configurations are chosen in common login page and workspace login page. Instance level SSO is configured in environment variables and Workspace level SSO is configured in respective `Manage SSO` page. - -
    - - ![ToolJet - SSO Flow](/img/user-lifecycle/sso-flow.png) - -
    - -
    diff --git a/docs/docs/user-authentication/workspace-settings.md b/docs/docs/user-authentication/workspace-settings.md deleted file mode 100644 index 63784dc4da..0000000000 --- a/docs/docs/user-authentication/workspace-settings.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -id: workspace-login -title: Workspace Login ---- - -## Accessing Workspace Login - -To access the Workspace Login, navigate to the ToolJet dashboard and click on the gear icon (⚙️) located at the bottom of the left sidebar. From the dropdown, select `Workspace Settings` and then select the `Workspace Login` tab. Workspace login/SSO can be configured by both workspace admins and super admins. - -
    - Workspace settings -
    - -
    - -## Workspace Login State: Enabled/Inherited - -The workspace login state can be either `Enabled` or `Inherited`. When the workspace login state is `Enabled`, it overrides the instance login configurations, including allowed domains, enable sign-up toggle, and password login toggle. Workspace admins can separately choose to enable or disable the SSO options of the workspace. - -
    - Workspace settings -
    - -When the workspace login state is `Inherited`, the workspace login settings are inherited from the instance login settings. The workspace login settings are disabled, and the workspace admins cannot change the SSO settings. Only super admins can change the SSO settings from the instance login settings. - -
    - Workspace settings -
    - -
    - -
    - -## Configuring Workspace Login - -
    - -### Allowed Domains - -The allowed domains field is used to specify the domains that are allowed to access the workspace. If the allowed domains field is empty, all domains are allowed to access the workspace. If the allowed domains field is not empty, only the specified domains are allowed to access the workspace. The allowed domains field can be a comma-separated list of domains. - -
    - -
    - -### Login URL - -Login URL is automatically generated and can be used to login directly to the workspace. The login URL is unique to the workspace and can be shared with the users to access the workspace. - -
    - -
    - -### Enable Sign-up - -The enable sign-up toggle is used to enable or disable the sign-up option for the workspace. If the enable sign-up toggle is enabled, new users can sign up for the workspace. If the enable sign-up toggle is disabled, new users cannot sign up for the workspace. - -
    - -
    - -
    - -## Password Login - -Password login is a method of user authentication where user can login using their email and password. This option is enabled by default. If the password login toggle is disabled, users can only login to the workspace using the SSO options. - -
    - -
    - -### Retry Limits - -The user password authentication method will be disabled after predefined numbers of wrong password attempts. This feature can be disabled using setting `DISABLE_PASSWORD_RETRY_LIMIT` to `true` in environment variables. Number of retries allowed will be 5 by default, it can be override by `PASSWORD_RETRY_LIMIT` environment variable. - -
    - -
    - -### Reset Password - -There are two ways through which a user can reset their password. The first method is where user can reset their password by themselves. The second method is where a **Super Admin** can reset password for a user. - -#### 1. Forgot Password - -- On the login page, click on the **Forgot Password**. -- Enter the registered email address associated with the account and then click on the **Send a reset link** button. -- Receive a password reset link via email. -- Click on the link to be directed to the password reset page. -- Follow the prompts to set a new password. - -
    - Workspace settings -
    - -#### 2. **Super Admin** - -- Reach out to the **[Super Admin](/docs/Enterprise/superadmin)** of the workspace. -- The **Super Admin** can reset the password for the user from the **Settings** > **All Users** section. -- Select the user for whom the password needs to be reset. -- Click on the kebab icon(three dots) on the right side of the user's name and select **Reset Password**. -- A modal will appear with two options to reset the password: **Automatically generate a password** and **Create password**. - -#### Automatically Generate Password - -- Selecting this option will automatically generate a new password for the user. -- Click on the **Reset** button to reset the password and the new password will be displayed in the modal. -- Super Admin can copy this password and provide it to the user securely. - -
    - Workspace settings -
    - -#### Create Password - -- Selecting this option will allow the Super Admin to create a new password for the user. -- Enter the new password and click on the **Reset** button. - -
    - Workspace settings -
    - -
    - -## Direct App Access - -When users access ToolJet applications via direct links, they experience a streamlined login process that bypasses the dashboard and takes them straight to the specific app. When a user clicks on a direct application URL, the following scenarios are possible based on the user's session status: - -1. **User with a Valid Session:** - - The application loads directly without going through the dashboard. - -2. **User without a Valid Session:** - - The user is redirected to the workspace's login page. - - After successful authentication, the user is automatically redirected back to the original application URL. - - The dashboard is bypassed, providing immediate access to the desired application. - -:::info -Access to specific applications depends on the user's group permission settings within the workspace. Even with direct access links, users may only access applications they are authorized to view. -::: \ No newline at end of file diff --git a/docs/docs/user-management/authentication/cloud-login.md b/docs/docs/user-management/authentication/cloud-login.md new file mode 100644 index 0000000000..1be8cad8d4 --- /dev/null +++ b/docs/docs/user-management/authentication/cloud-login.md @@ -0,0 +1,56 @@ +--- +id: cloud-login +title: Cloud Authentication +--- + +In cloud deployment, you can setup the authentication on your workspaces and is managed by the Admins of the respective groups. Each workspace can have different Authentication method. We will learn about the available Authentication methods in this documentation. + + +### Configuration + +To configure the authentication: + +1. Go to **Workspace Settings** > **Workspace login**. (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + +2. On this page, you can configure the following settings: + +cloud  workspace level login + + +### SSO (Single Sign-On) + + * SSO makes it easier for organizations to manage user access. Users can use one login for different tools, and admins can quickly add or remove access when needed. Thus, it improves an organization's onboarding and offboarding experience. + + * You can configure SSO with Google, GitHub, OpenID Connect, LDAP, and SAML. Please check the [SSO docs](/docs/user-management/sso/overview) for a detailed guide on SSO configuration. + + +### Default SSO (Single Sign-On) + * ToolJet supports preconfigured Google and GitHub as default SSO options, which can be easily enabled from the workspace login page. + + +### Allowed Domains + + * This feature helps restrict login access to specific email domains, ensuring that only authorized users from your organization can sign up or log in. + + * You can add multiple domains for login by specifying allowed domain names, separated by commas. **Example:** `corp.com`, `corp.io`, `corp.ai` + + +### Sign-Up Without Invitations + + * This feature allows organizations to simplify onboarding by letting users sign up without needing an invitation. + + * The **Enable Signup** feature lets users create accounts without being invited. + + * When users sign up with this feature enabled, they are assigned to the end user of that workspace. Workspace admin can later change the [role](/docs/user-management/role-based-access/user-roles) of the user once the user is on-boarded to the workspace. + +### Password Login + + * Password login allows users to log in using their email and password. However, organizations can also use SSO for better security and control. + + * Toggle this setting to **enable** or **disable** password login on the login page. Make sure to disable password login only when your SSO is configured otherwise, you will get locked out. + +### Automatic SSO Login + + * This feature eliminates the need for users to interact with the login page by directly authenticating them via the configured SSO provider. + + * To Enable the Automatic SSO Login, ensure the password login is disabled and only one SSO provider is configured. \ No newline at end of file diff --git a/docs/docs/user-management/authentication/self-hosted/instance-login.md b/docs/docs/user-management/authentication/self-hosted/instance-login.md new file mode 100644 index 0000000000..e1fedab00f --- /dev/null +++ b/docs/docs/user-management/authentication/self-hosted/instance-login.md @@ -0,0 +1,76 @@ +--- +id: instance-login +title: Instance Login +--- + +In self-hosted deployments, it can be configured at two levels: **Instance Level**, which applies globally across all workspaces and is configurable only by the super admin, and **Workspace Level**, which overrides the instance-level settings for specific workspaces and can be configured by both super admins and workspace admins. This guide focuses on configuring instance-level authentication. + +### Configuration + +To configure the instance-level authentication configuration + +1. Go to **Settings** > **Instance login**. (Example URL - `https://app.corp.com/instance-settings/instance-login`) + +2. On this page, you can configure the following settings: + +only instance level login + +### SSO (Single Sign-On) + +- SSO makes it easier for organizations to manage user access. Users can use one login for different tools, and admins can quickly add or remove access when needed. Thus, it improves an organization's onboarding and offboarding experience. + +- At the instance level you can configure SSO with Google, GitHub, and OpenID Connect. Please check the [SSO docs](/docs/user-management/sso/overview) for a detailed guide on SSO configuration. + +- You can also configure the Google or Github with Environment Variables. To set Google as default SSO use the following environment variable. + + | Variable | Description | + | --------- |:-----:| + | SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | + +- To set GitHub as the default SSO use the following environment variables: + + | Variable | Description | + | --------- |:-----:| + | SSO_GIT_OAUTH2_CLIENT_ID | GitHub OAuth client ID | + | SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | + | SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self-hosted | + + +### Allowed Domains + +- This feature helps restrict login access to specific email domains, ensuring that only authorized users from your organization can sign up or log in. + +- You can add multiple domains for login by specifying allowed domain names, separated by commas. **Example:** `corp.com`, `corp.io`, `corp.ai` + + +### Sign-Up Without Invitations + +- This feature allows organizations to simplify onboarding by letting users sign up without needing an invitation. + +- The **Enable Signup** feature lets users create accounts without being invited. + +- This feature is available only when the Personal Workspace option is enabled in the Manage Instance settings. When users sign up with this feature enabled, a new personal workspace is automatically created for them, and they are assigned as the admin of that workspace. Refer to [Sign-Up Documentation](/docs/user-management/onboard-users/self-signup-user#enable-sign-up-at-instance-level) to learn more. + +### Password Login + +- Password login allows users to log in using their email and password. However, organizations can also use SSO for better security and control. + +- Toggle this setting to **enable** or **disable** password login on the login page. Make sure to disable password login only when your SSO is configured otherwise, you will get locked out. + +### Enable Workspace Login Configuration + +- This feature allows workspace admins to customize login settings for their specific workspaces. It is useful when different workspaces in the same instance require distinct login configurations. + +- Once enabled, workspace-specific settings will override the instance-level configuration for those workspaces. + +### Automatic SSO Login + +- This feature eliminates the need for users to interact with the login page by directly authenticating them via the configured SSO provider. + +- To Enable the Automatic SSO Login, ensure the password login is disabled and only one SSO provider is configured. + +### Custom Logout URL + +- A Custom Logout URL allows organizations to redirect users to a specific page after they log out. This can be useful for redirecting users to a company portal or a feedback form. + +- Enter the desired logout URL in the **Custom Logout URL** field to configure this. \ No newline at end of file diff --git a/docs/docs/user-management/authentication/self-hosted/overview.md b/docs/docs/user-management/authentication/self-hosted/overview.md new file mode 100644 index 0000000000..c07c2455da --- /dev/null +++ b/docs/docs/user-management/authentication/self-hosted/overview.md @@ -0,0 +1,61 @@ +--- +id: overview +title: Overview +--- + +Authentication in ToolJet ensures secure access to your applications and data.In self-hosted deployments, authentication can be configured at two levels: + +- **Instance Level:** Applies globally across all workspaces within the instance. Only the super admin can configure this. + +- **Workspace Level:** Overrides instance-level configuration for workspaces where it is applied. Both super admins and workspace admins can configure it. + + +## Scenarios for Authentication Configuration + +ToolJet supports flexible authentication setups, allowing instance-level, workspace-level, or a mix of both configurations. You can configure [SSO](/docs/user-management/sso/overview) or email-password login at both the levels. Below are common scenarios to guide your setup. + +### 1\. Only Instance-Level Login + +Instance-level login configuration is a global setting that applies across all workspaces within a ToolJet instance. + + +**Example:** Imagine a company, Nexus Corp, that wants to build internal application with ToolJet for three departments: Marketing, Sales, and Engineering. To ensure better collaboration, they need to isolate the applications and data sources for each department. Since all these departments use the same login system as they belong to the same company, an instance-level configuration is suitable setup for this scenario. Here’s how this can be set up: + +- Create three workspaces—one for each department: Marketing, Sales, and Engineering. This ensures the applications and data sources for each department remain isolated. + +- Since all workspaces belong to a single instance of the company, configure authentication at the instance level. For example, if the company uses Google Workspace, they can configure Google SSO at the instance level. + +- This allows users across all workspaces to log in using the same authentication system. + +only instance level login + + +### 2\. Only Workspace-Level Login + +Workspace-level login allows individual workspaces to define their own authentication configurations, overriding the global instance-level settings. This approach is ideal for organizations with diverse authentication needs across departments or teams. + + +**Example** Consider a service-based company, Pixel Technologies Inc., that serves three client companies: GreenTech Ltd., BlueWave Corp., and EcoBuild Enterprises. To provide customized solutions, Tech Solutions Inc. have to isolate applications, users and datasource and access control configuration for each client company. In this scenario, service-based company can do the following setup: + +- Create a workspace for each client company: GreenTech Ltd., BlueWave Corp., and EcoBuild Enterprises. This ensures the applications and data sources for each client remain isolated. + +- Configure individual workspace-level login settings for each workspace. For example, GreenTech Ltd may use Google SSO, BlueWave Corp. may prefer Azure AD, and EcoBuild Enterprises might us both SAML SSO and a custom email-password authentication system. + +only instance level login + +### 3\. Instance-Level and Workspace-Level Login (Mixed Configuration) + +In this setup, some workspaces inherit the instance-level configuration, while others override it with workspace-specific login settings. + + +**Example** Consider a large company, Global Dynamics Ltd., with three departments: Marketing, Engineering, and HR. To ensure better collaboration, they need to isolate the applications and data sources for each department. Global Dynamics Ltd. wants to maintain a separate login for the applications related to the HR department to comply with strict security and compliance requirements. For the other departments, they prefer to use a common authentication at the instance level. + +In such scenarios where company wants to implement a mixed authentication configuration, they can do the following setup. + +- Create three workspaces—one for each department: Marketing, Engineering, and HR. This ensures the applications and data sources for each department remain isolated. + +- The Marketing and Engineering workspaces can inherit the instance-level configuration. For instance, they use Google OAuth configured at instance level. + +- The HR workspace, due to compliance and security policies, requires isolated login settings. Thus configures workspace-level login settings, such as SAML authentication, which will override the instance level configuration. + +only instance level login \ No newline at end of file diff --git a/docs/docs/user-management/authentication/self-hosted/workspace-login.md b/docs/docs/user-management/authentication/self-hosted/workspace-login.md new file mode 100644 index 0000000000..e4dbb534da --- /dev/null +++ b/docs/docs/user-management/authentication/self-hosted/workspace-login.md @@ -0,0 +1,62 @@ +--- +id: workspace-login +title: Workspace Login +--- + + +In self-hosted deployments, it can be configured at two levels: **Instance Level**, which applies globally across all workspaces and is configurable only by the super admin, and **Workspace Level**, which overrides the instance-level settings for specific workspaces and can be configured by both super admins and workspace admins. This guide focuses on configuring workspace-level authentication. + + +### Configuration + +To configure the workspace-level authentication configuration + +1. Go to **Workspace Settings** > **Workspace login**. (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + +2. On this page, you can configure the following settings: + + workspace level login + + +### SSO (Single Sign-On) + +- SSO makes it easier for organizations to manage user access. Users can use one login for different tools, and admins can quickly add or remove access when needed. Thus, it improves an organization's onboarding and offboarding experience. + +- At the workspace level, you can enable the **Instance SSO** toggle to inherit instance-level configured SSO, or you can also configure the workspace-level SSO with Google, GitHub, OpenID Connect, LDAP, and SAML. Please check the [SSO docs](/docs/user-management/sso/overview) for a detailed guide on SSO configuration. + + +### Allowed Domains + +- This feature helps restrict login access to specific email domains, ensuring that only authorized users from your organization can sign up or log in. + +- You can add multiple domains for login by specifying allowed domain names, separated by commas. **Example:** `corp.com`, `corp.io`, `corp.ai` + + +### Sign-Up Without Invitations + +- This feature allows organizations to simplify onboarding by letting users sign up without needing an invitation. + +- The **Enable Signup** feature lets users create accounts without being invited. + +- When users sign up with this feature enabled, they are assigned to the end user of that workspace. Workspace admin can later change the [role](/docs/user-management/role-based-access/user-roles) of the user once the user is on-boarded to the workspace. Refer to [Sign-Up Documentation](/docs/user-management/onboard-users/self-signup-user#enable-sign-up-at-workspace-level) to learn more. + + +### Password Login + +- Password login allows users to log in using their email and password. However, organizations can also use SSO for better security and control. + +- Toggle this setting to **enable** or **disable** password login on the login page. Make sure to disable password login only when your SSO is configured otherwise, you will get locked out. + +- User password authentication will be disabled after a predefined number of failed login attempts to enhance security. By default, users are allowed **5 retries**, but this can be adjusted using the `PASSWORD_RETRY_LIMIT` environment variable. To disable this feature, set `DISABLE_PASSWORD_RETRY_LIMIT` to `true`. + + | Variable | Description | Default Value | + | --------- |-------------|---------------| + | `DISABLE_PASSWORD_RETRY_LIMIT` | Set to `true` to disable the password retry limit feature. | `false` | + | `PASSWORD_RETRY_LIMIT` | Specifies the maximum number of allowed retries before disabling authentication. | `5` | + + +### Automatic SSO Login + +- This feature eliminates the need for users to interact with the login page by directly authenticating them via the configured SSO provider. + +- To Enable the Automatic SSO Login, ensure the password login is disabled and only one SSO provider is configured. \ No newline at end of file diff --git a/docs/docs/user-management/group-sync/oidc.md b/docs/docs/user-management/group-sync/oidc.md new file mode 100644 index 0000000000..a9ae276dd0 --- /dev/null +++ b/docs/docs/user-management/group-sync/oidc.md @@ -0,0 +1,64 @@ +--- +id: oidc +title: OpenID Connect +--- + +
    + Icon + Paid feature +
    + +In ToolJet, you can use the group synchronization feature to automatically update user roles and custom groups from the identity provider. This functionality enables centralized access management, reduces the risk of manual errors, enhances security, and simplifies the user onboarding process. Group Sync is only available at the workspace level. + +Group synchronization occurs at every login. Users must log out and log back in for changes to be reflected. Manual editing of groups in ToolJet is not recommended as changes will be overwritten upon subsequent logins. + +:::caution Deleting a user from Identity provider +Whenever a user is deleted from the Identity Provider, admins needs to manually archive the user in ToolJet. Otherwise, if password login is enabled, the user can still log in using their password. +::: + +If the license expires or downgrades to a plan without group sync, both SSO and group sync features will be disabled. Users will need to log in via alternative SSO methods or email/password. If the license limit is reached, new users will not be allowed to log in. + +## Group Mapping + +Group mapping in ToolJet follows these principles: + +- Default 1:1 mapping based on group names (case-sensitive). +- Custom group mapping can be configured. +- Users without a matching group are assigned to the **end-users** group. + +### Group Mapping Scenarios + +| Groups in IdP |
    Groups in ToolJet
    | Role Mapping Settings | Result | +|---------------|-------------------|------------------------|--------| +| **admin**, **builder**, **end-user** | Exists (User Roles) | None | User is assigned with the corresponding user role. | +| **engineers** | Exists | None | User added to **engineers** custom group and assigned either **end-users** or **builders** user role based on permissions. | +| **engineers** | **engineers** - Doesn't exist
    **developer** - Exists | **engineers → developers** | User added to **developers** custom group and assigned **builder** or **end-user** role based on permissions. | +| **admin**, **developers** | Exists | None | User added to **developers** custom group and assigned **admin** user role. | +| no group | N/A | None | User added to **end-users** default group. | + +## Configure OIDC Group Sync in ToolJet + +To set up OIDC group synchronization in ToolJet follow these steps: + +1. Navigate to the **Workspace Settings** > **Workspace Login** Tab.
    + (Example URL: ) +2. Click on the OpenID Connect under the SSO section. +3. Setup the OpenID Connect SSO by following this [guide](/docs/user-management/sso/oidc/setup). +4. Enable the **Group Sync** toggle and provide the following information: + +- **Claim name**: Enter the name of the claim in the OIDC token that contains group information (e.g., groups). +- **Group mapping**: Configure how IdP groups map to ToolJet groups. Use the format: + ``` + IdP Group -> ToolJet Group, Another IdP Group -> Another ToolJet Group + ``` + For example: + ``` + Marketing Team -> marketing, Sales Team -> sales + ``` + + OIDC Group Sync Config diff --git a/docs/docs/user-management/onboard-users/archive-user.md b/docs/docs/user-management/onboard-users/archive-user.md new file mode 100644 index 0000000000..470c1d2f97 --- /dev/null +++ b/docs/docs/user-management/onboard-users/archive-user.md @@ -0,0 +1,91 @@ +--- +id: archive-user +title: Archive and Unarchive +--- + +Admins can archive users in a workspace which will remove the access to the workspace for the user but will preserve all the apps and changes done by the user and the user can be re-invited to the workspace by unarchiving the user if needed. + +:::info +1. Archived users will not be counted for billing/licensing. +2. There must be at least one active admin; all the admins in a workspace cannot be archived. +::: + +## Steps to Archive User + +### Instance Level + +When a user is archived at the instance level, they will automatically be archived from all the workspaces and cannot be invited to any new workspace. Follow these steps to archive a user at the instance level: + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user that need to be archived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Select **Archive user**. + +5. The status of the user will be updated to archived. + Workspace Level Permissions + +### Workspace Level + +Archiving a user at the workspace level will only remove their access to that specific workspace. The user will still have access to any other workspaces where they are invited. Follow these steps to archive a user at the workspace level: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user that need to be archived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Select **Archive user**. + +5. The status of the user will be updated to archived. + Workspace Level Permissions + +## Steps to Unarchive User + +### Instance Level + +When a user is unarchived at the instance level, after that the admins will need to unarchive or invite the user again at individual workspace. + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user that need to be unarchived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Select **Unarchive user**. + +5. The status of the user will be updated to invited. + Workspace Level Permissions + +### Workspace Level + +If a user is unarchived at the workspace level, they are automatically unarchived at the instance level as well. + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user that need to be unarchived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +3. Select **Unarchive user**. + +4. The status of the user will be updated to invited and the user will recive a new invitation mail to join the workspace. + Workspace Level Permissions diff --git a/docs/docs/user-management/onboard-users/bulk-invite-user.md b/docs/docs/user-management/onboard-users/bulk-invite-user.md new file mode 100644 index 0000000000..bc43259cad --- /dev/null +++ b/docs/docs/user-management/onboard-users/bulk-invite-user.md @@ -0,0 +1,69 @@ +--- +id: bulk-invite-users +title: Bulk Invite +--- + +Admins can bulk invite users to a workspace using a CSV file containing user email addresses, **[roles](/docs/user-management/role-based-access/user-roles)**, **[groups](/docs/user-management/role-based-access/custom-groups)**, and other details. The invited users receive an email with instructions to join the workspace, ensuring a seamless onboarding process. + +## Steps to Bulk Invite Users + +Role Required: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Click on the **Add users** button. + Add user button + +4. Switch to **Upload CSV file** tab. + +5. Upload a CSV file consisting following fields: + + | Field | Required/Optional | Example | + |:-----|:---------|:-------| + | First Name | Either of first or last name is required. | John | + | Last Name | Either of first or last name is required. | Doe | + | Email address | Required | john@corp.com | + | User Role | Required | Admin | + | Group | Optional | Manager | + | Metadata | Optional | `{"apiKey": "abc123"}` | + + You can also download the template to edit. +6. Click on **Upload users**. + Add user button + +## Email Invitation + +Pre-Requisite: **[Setup SMTP Server](/docs/tj-setup/smtp-setup/configuration)** + +Once a user is invited to the workspace, they will receive an email containing a unique workspace invite link. By clicking the link, the user will be redirected to the workspace login or signup page to complete the onboarding process. + +Workspace Level Permissions + +## Invitation URL + +On Self-Hosted ToolJet, admin users can copy unique invitation URL and share with the user. + +Workspace Level Permissions + +## User Status + +Admin users can track the status of users as follows: + +### Self-Hosted ToolJet + +- **Invited**: The user has been invited to join the workspace. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +### ToolJet Cloud + +- **Requested**: The user has been invited to the current workspace but doesn't have a ToolJet account. +- **Invited**: The user has been invited to the current workspace and has a ToolJet account. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +Workspace Level Permissions + diff --git a/docs/docs/user-management/onboard-users/invite-user.md b/docs/docs/user-management/onboard-users/invite-user.md new file mode 100644 index 0000000000..7389ba7130 --- /dev/null +++ b/docs/docs/user-management/onboard-users/invite-user.md @@ -0,0 +1,66 @@ +--- +id: invite-user +title: Invite +--- + +Admins can invite users to a workspace using their email addresses and assign them specific **[roles](/docs/user-management/role-based-access/user-roles)** and **[groups](/docs/user-management/role-based-access/custom-groups)** to manage permissions. The invited users receive an email with instructions to join the workspace, ensuring a seamless onboarding process. + +## Steps to Invite a User + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Click on the **Add users** button. + Add user button + +4. Fill out the following details: + | Field | Required/Optional | Example | + |:-----|:---------|:-------| + | Name | Required | John Doe | + | Email address | Required | john@corp.com | + | Select groups | Required | USER ROLE: **Admin** | + | | Optional | CUSTOM GROUPS: **Manager** | + | [User metadata](/docs/user-management/onboard-users/user-metadata) | Optional | `{"apiKey": "abc123"}` | + + Invite User + +5. Click on the **Invite users** button to send the invitation. + + +## Email Invitation + +Pre-Requisite: **[Setup SMTP Server](/docs/tj-setup/smtp-setup/configuration)** + +Once a user is invited to the workspace, they will receive an email containing a unique workspace invite link. By clicking the link, the user will be redirected to the workspace login or signup page to complete the onboarding process. + +Workspace Level Permissions + +## Invitation URL + +On Self-Hosted ToolJet, admins can copy unique invitation URL and share with the user. + +Workspace Level Permissions + +## User Status + +Admin users can track the status of users as follows: + +### Self-Hosted ToolJet + +- **Invited**: The user has been invited to join the workspace. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +### ToolJet Cloud + +- **Requested**: The user has been invited to the current workspace but doesn't have a ToolJet account. +- **Invited**: The user has been invited to the current workspace and has a ToolJet account. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +Workspace Level Permissions + diff --git a/docs/docs/user-management/onboard-users/overview.md b/docs/docs/user-management/onboard-users/overview.md new file mode 100644 index 0000000000..a0195eb361 --- /dev/null +++ b/docs/docs/user-management/onboard-users/overview.md @@ -0,0 +1,27 @@ +--- +id: overview +title: Overview +--- + +ToolJet provides flexible options for onboarding users and a straightforward process for offboarding users when needed. + +## Onboarding Users + +Users can be added to ToolJet either through an invitation or by signing up. + +### Inviting Users + +Admin users can onboard users by sending invitations: +- **Individually**: Send a personalized invitation to a single user by entering their email address. For detailed steps, refer to the **[Invite User](/docs/user-management/onboard-users/invite-user)** guide. +- **In Bulk**: Upload a CSV file containing user details to invite multiple users at once. For detailed steps, refer to the **[Bulk Invite Users](/docs/user-management/onboard-users/bulk-invite-users)** guide. + +Invited users will receive an email to join the ToolJet workspace. + +### User Sign-Up + +Admin users can enable the sign-up feature, allowing users to register themselves. By sharing the login URL, users can create their accounts and join the workspace without needing an invitation. For more details, refer to the **[Sign-Up Users](/docs/user-management/onboard-users/self-signup-user)** Guide. + +## Offboarding Users + +To offboard users, admins can **[archive](/docs/user-management/onboard-users/archive-user#steps-to-archive-user)** the user accounts. When archived, the user’s access to the workspace/instance is disabled while preserving their data.
    +Archived accounts can be **[unarchived](/docs/user-management/onboard-users/archive-user#steps-to-unarchive-user)** at any time, restoring the user’s access and roles. \ No newline at end of file diff --git a/docs/docs/user-management/onboard-users/self-signup-user.md b/docs/docs/user-management/onboard-users/self-signup-user.md new file mode 100644 index 0000000000..90f507adc0 --- /dev/null +++ b/docs/docs/user-management/onboard-users/self-signup-user.md @@ -0,0 +1,71 @@ +--- +id: self-signup-user +title: Sign-Up +--- + +In ToolJet, the sign-up feature lets admins enable direct user registration via a sign-up URL, eliminating the need for invitations. For Self-Hosted version, the enable sign-up can be done at both instance level and workspace level. + +## Enable Sign-Up at Instance Level + +Role Required: **Super Admin**
    + +Super admin can enable sign-up at instance level, and whenever a user joins an instance using the self sign-up, a new personal workspace is created for that user and the workspace admin role will be assigned to the user. + +Follow the steps to enable sign-up at instance level: + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > Manage instance settings**.
    + (Example URL - `https://app.corp.com/instance-settings/manage-instance-settings`) + +3. Ensure that you have allowed personal workspace. + Workspace Level Permissions + +4. Now, go to **Instance login** tab.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + +5. Enter allowed domains that can access the workspace, you can enter multiple domain names separated by comma.
    +If you don't enter allowed domain then anyone with the login URL can sign-up to the workspace. + Workspace Level Permissions + +6. Click on the toggle button for the enable signup, by default enable signup is disabled. + Workspace Level Permissions + +7. Click on the **Save changes** button at the bottom of the page. + + Now, the users can signup on the ToolJet deployment URL.
    + (Example URL: `https://app.corp.com/signup`) + + Workspace Level Permissions + +## Enable Sign-Up at Workspace Level + +Role Required: **Admin**
    + +Admin can enable sign-up at workspace level and whenever a user joins a workspace using the self sign-up the end user role will be assigned to the user. + +Follow the steps to enable sign-up at workspace level: + +1. Go to **Workspace settings > Workspace login**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + +2. Enter allowed domains that can access the workspace, you can enter multiple domain names separated by comma.
    +If you don't enter allowed domain then anyone with the login URL can sign-up to the workspace. + Workspace Level Permissions + +3. Click on the toggle button for the enable signup, by default enable signup is disabled. + Workspace Level Permissions + +4. Click on the **Save changes** button at the bottom of the page. + +5. Copy the Login URL and share it with the users. + + Now users will be able to see a sign-up option on the login page.
    + (Example URL: `https://app.corp.com/login/nexus`) + + Workspace Level Permissions + + Users can navigate to the sign-up page from there and register themselves. + + Workspace Level Permissions + diff --git a/docs/docs/user-management/onboard-users/user-metadata.md b/docs/docs/user-management/onboard-users/user-metadata.md new file mode 100644 index 0000000000..239925e9e7 --- /dev/null +++ b/docs/docs/user-management/onboard-users/user-metadata.md @@ -0,0 +1,43 @@ +--- +id: user-metadata +title: Metadata +--- + +In ToolJet, user metadata allows you to store additional information about users, such as user personal details, API keys, or role-specific data. This custom data is stored at the workspace level and can be used within your ToolJet applications. All metadata values are encrypted in the database for security, and in the user interface, metadata values are masked to protect sensitive information. + +## Adding User Metadata + +User metadata can be added either when inviting the user or after the user has joined the workspace. Follow these steps to add user metadata: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user whose metadata needs to be updated, click on the kebab menu (three dots) at the end of their row, and select **Edit user details**. + Edit User Details + +4. Click on **+ Add more** below User metadata, and enter the key-value pair. + Edit User Details + +5. Click on **Update** button at the bottom. + +## Using User Metadata in App Builder + +User metadata can be accessed within any application in the workspace through the global variable using the following syntax: + +```js +{{globals.currentUser.metadata}} +``` +To access a specific key-value pair from the metadata, use the following syntax: + +```js +{{globals.currentUser.metadata.}} // Replace with the key of the metadata value +``` + +:::info +Remember that while metadata values are masked in the user interface, they are accessible in the App builder. Ensure you handle any sensitive information appropriately in your app logic. +::: + diff --git a/docs/docs/user-management/overview.md b/docs/docs/user-management/overview.md new file mode 100644 index 0000000000..aabef88d13 --- /dev/null +++ b/docs/docs/user-management/overview.md @@ -0,0 +1,13 @@ +--- +id: overview +title: Overview +--- + +ToolJet provides comprehensive User Management and Access Control capabilities, allowing you to onboard and offboard users efficiently, configure diverse authentication methods, manage role-based permissions, and integrate with SSO providers. With features like group sync and user profile management, ToolJet ensures secure and flexible access control for your organization. + +- **Onboarding and Offboarding Users**: ToolJet provides flexible options to onboard and offboard users. +- **Authentication**: ToolJet ensures secure access with multiple login methods, SSO, and Two-Factor Authentication (2FA). +- **Role Based Access Control**: ToolJet enables granular access permissions by different roles and custom groups. +- **Single Sign-On (SSO)**: ToolJet streamlines authentication by allowing integrations with various identity providers. +- **Group Sync**: ToolJet supports group sync which helps keep group memberships updated automatically based on your organization's identity system. +- **User Management**: In ToolJet you can easily manage user profiles, including editing details and resetting passwords. diff --git a/docs/docs/user-management/profile-management/reset-password.md b/docs/docs/user-management/profile-management/reset-password.md new file mode 100644 index 0000000000..7c2e25daae --- /dev/null +++ b/docs/docs/user-management/profile-management/reset-password.md @@ -0,0 +1,43 @@ +--- +id: reset-password +title: Reset Password +--- + +When password login is enabled then there are two ways through which a user can reset their password. The first method is where user can reset their password by themselves. The second method is where a **Super Admin** can reset password for a user. + +## Forgot Password + +1. On the login page, click on the **Forgot Password**. + +2. Enter the registered email address associated with the account and then click on the **Send a reset link** button. + + General Settings: Reset Password + +3. Receive a password reset link via email. + +4. Click on the link to be directed to the password reset page. + + General Settings: Reset Password + +## Super Admin Reset Password + +If a user forgets their password or it needs to be updated, the super admin can easily reset the password for any user in the instance by following these steps: + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user for whose the password needs to be reset. + +4. Click on the kebab icon (three dots) on the right side of the user's name and select **Reset Password**. + + General Settings: Reset Password + +5. A modal will appear with two options to reset the password: + + a. **Automatically Generate Password**: Selecting this option will automatically generate a new password for the user.
    + b. **Create Password**: Selecting this option will allow the Super Admin to create a new password for the user. + + General Settings: Reset Password + diff --git a/docs/docs/user-management/profile-management/user-details.md b/docs/docs/user-management/profile-management/user-details.md new file mode 100644 index 0000000000..00c4176ab1 --- /dev/null +++ b/docs/docs/user-management/profile-management/user-details.md @@ -0,0 +1,25 @@ +--- +id: user-details +title: Edit User Details +--- + +At the instance level, Super Admins can edit a user's name or promote them to the Super Admin role. A Super Admin has access to all workspaces and inherits all the permissions of a Workspace Admin. At the workspace level, admins can update **[user roles](/docs/user-management/role-based-access/user-roles)**, **[groups](/docs/user-management/role-based-access/custom-groups)** or **[user metadata](/docs/user-management/onboard-users/user-metadata)**. + +## Update User's Name + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user whose details needs to be updated and click on the kebab menu (three dots) located at the end of their row. + Edit User Details Menu + +4. Select **Edit user details**. + +5. Update the user's name. + Edit User's Name' + +6. Click on **Update** at the bottom of the drawer. \ No newline at end of file diff --git a/docs/docs/user-management/profile-management/user-profile.md b/docs/docs/user-management/profile-management/user-profile.md new file mode 100644 index 0000000000..106b96485d --- /dev/null +++ b/docs/docs/user-management/profile-management/user-profile.md @@ -0,0 +1,25 @@ +--- +id: user-profile +title: Profile Settings +--- + +Using **Profile Settings**, a user can update their name, upload a profile avatar, or change their password. Follow these steps to make changes: + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Profile Settings**.
    + (Example URL - `https://app.corp.com/nexus/settings`) + +3. On the Profile Settings page, there are two sections: + + a. **Profile** + - Update your name, or upload an image for profile avatar. + - Click on **Update** button at the bottom of the section. + + b. **Change password** + - Enter your current password. + - Enter and confirm your new password. + - Click on **Change password** button at the bottom of the section. + +
    + Edit User Details Menu diff --git a/docs/docs/user-management/role-based-access/access-control.md b/docs/docs/user-management/role-based-access/access-control.md new file mode 100644 index 0000000000..62beb41161 --- /dev/null +++ b/docs/docs/user-management/role-based-access/access-control.md @@ -0,0 +1,88 @@ +--- +id: access-control +title: Access Control +--- + +ToolJet enables you to manage access control by configuring permissions like create and delete. Access control can be applied to all of your resources such as apps and data sources. Additionally, ToolJet supports granular access control, allowing you to configure permissions for individual resources to ensure precise and secure management. + +## 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. | +| **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. | + +To configure view or edit access, please refer to **[Granular Access Control](#granular-access-control)**. + +:::info +If a user has the create permission and creates a resource, the user becomes the owner of that resource and has all the permissions related to it by default.
    +For example, if a user creates a data source A, then by default, the user will have the configure and build access for data source A. +::: + +### Configuring Permissions + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) + +3. Select the group to configure permissions. + +4. Switch to the **Permissions** tab and configure the required permissions. + Create Custom Group + + +## Granular Access Control + +In ToolJet, you can set granular level access control for apps and data sources, by configuring permissions like view access or edit access, to manage who can interact with the resources in your workspace. You can apply permissions either to all resources (e.g., all apps or all data sources) or to specific, selected resources, offering flexibility and precision in managing access.
    +To configure Granular Access Control, you need to create custom groups. Refer to **[custom groups](/docs/user-management/role-based-access/custom-groups)** guide for more information. + +### Apps + +- **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. + +- **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. + +- **All apps**: Provides the selected access (Edit or View) to all the apps in the workspace, including any newly created apps. + +- **Custom**: Provide the selected access (Edit or View) only to the specified apps. + + Create Custom Group + +### Data Sources + +- **Configure**: Users in the group can access and edit the configuration details of the selected data sources. This permission should be given to the admin users who needs to configure the data source. + +- **Build with**: Users in the group can use the selected data sources in apps and workflows to create queries. This permission should be given to the builders or developers who will create the queries for the apps or workflows. + +- **All data sources**: Provides the selected access (Configure or Build with) to all the data sources in the workspace, including any newly created data source. + +- **Custom**: Provide the selected access (Configure or Build with) only to the specified data sources. + + Create Custom Group + +### Configuring Granular Access Permission + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) + +3. Select the group to configure granular access permissions. + +4. Switch to the **Granular access** tab and click on **+ Add permission** button. + +5. Select the resource (Apps/Data source) based on requirement. Give a name for the permission, configure required permission and click on **Add** at the bottom of the modal. + + Create Custom Group diff --git a/docs/docs/user-management/role-based-access/custom-groups.md b/docs/docs/user-management/role-based-access/custom-groups.md new file mode 100644 index 0000000000..1b8b0aaffa --- /dev/null +++ b/docs/docs/user-management/role-based-access/custom-groups.md @@ -0,0 +1,53 @@ +--- +id: custom-groups +title: Custom Groups +--- + +ToolJet allows you to create custom groups to manage permissions, access, and users effectively. Each custom group can be configured with a specific set of permissions and can include only the users who require those permissions. This helps maintain precise control over what users can access and modify within your workspace. + +For example, if you have apps built for two teams, HR and Sales, and you want team members to only have access to the apps that are relevant to their team, then you can create two custom groups named HR and Sales, and then select the desired apps by configuring the **[granular access permissions](/docs/user-management/role-based-access/access-control#granular-access-control)**. + +## Creating Custom Groups + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) +3. Click **+ Create new group**. +4. Enter a name for the group and click **Create Group**. + +Refer to the **[Access Control](/docs/user-management/role-based-access/access-control)** guide to configure permissions. + +Create Custom Group + +## Deleting a Custom Group + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) +3. Click on the kebab menu next to the group you want to delete. +4. Select **Delete** from the dropdown and confirm the action in the pop-up dialog. + + Deleting Custom Group + +## Duplicate Group + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) +3. Click on the kebab menu next to the group you want to duplicate. +4. Select **Duplicate** from the dropdown and select the parts of the group you want to duplicate. +5. Click **Duplicate** to create a new group with the selected permissions. + + Duplicate Group + +## Inheritance and Overrides +- Users inherit permissions from their assigned role and any custom groups they belong to. +- Adding users to custom groups with higher permissions than their current role will automatically upgrade their user role to match the higher access level. +- If a user’s role is downgraded to one with lower permissions, they will automatically be removed from any custom groups that provided higher access than their new role allows. +- When a user belongs to multiple groups, they receive the highest level of permission granted by any of their groups. \ No newline at end of file diff --git a/docs/docs/user-management/role-based-access/super-admin.md b/docs/docs/user-management/role-based-access/super-admin.md new file mode 100644 index 0000000000..2d16d8111b --- /dev/null +++ b/docs/docs/user-management/role-based-access/super-admin.md @@ -0,0 +1,62 @@ +--- +id: super-admin +title: Super Admin +--- + +On a self-hosted ToolJet, a Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance. An instance can have more than one Super Admin. A Super Admin has full control over other users' workspaces and can create users, groups, and other super admins. The user who creates the instance gets the Super Admin role by default. + +## Admin v/s Super Admin + +### User Management + +| Privilege | Admin | Super Admin | +| --------- |:-----:|:-----------:| +| Manage Users in their workspace ([Invite](/docs/user-management/onboard-users/invite-user)/[Archive](/docs/user-management/onboard-users/archive-user#steps-to-archive-user)/[Unarchive](/docs/user-management/onboard-users/archive-user#steps-to-unarchive-user)) | ✅ | ✅ | +| [Archive](/docs/user-management/onboard-users/archive-user#steps-to-archive-user)/[Unarchive](/docs/beta/user-management/onboard-users/archive-user#steps-to-unarchive-user) any user from all the workspaces in the instance | ❌ | ✅ | +| [Reset password of any user](/docs/user-management/profile-management/reset-password#super-admin-reset-password) | ❌ | ✅ | +| [Edit name of any user](/docs/user-management/profile-management/user-details) | ❌ | ✅ | +| [Make any user Super Admin](#promote-a-user-to-super-admin) | ❌ | ✅ | + +### Workspace Management + +| Privilege | Admin | Super Admin | +| --------- |:-----:|:-----------:| +| Manage Groups in their workspace ([Create Group](/docs/user-management/role-based-access/custom-groups#creating-custom-groups)/ Add or Delete Users from groups/ Modify Group Permissions) | ✅ | ✅ | +| [Manage SSO](/docs/user-management/sso/overview) in their workspace | ✅ | ✅ | +| [Manage Workspace Variables](/docs/security/constants/variables) in their workspace | ✅ | ✅ | +| [Manage Workspace Constants](/docs/security/constants/) in their workspace | ✅ | ✅ | +| [Manage Data Sources](/docs/data-sources/overview) for the user group in their workspace | ✅ | ✅ | +| Access any user's personal workspace (Create/Edit/Delete Apps) | ❌ | ✅ | +| Archive Admin or any user of any workspace | ❌ | ✅ | +| Access any user's ToolJet Database (Create/Edit/Delete Database)) | ❌ | ✅ | +| Manage any workspace's setting (Groups/SSO/Workspace constants) | ❌ | ✅ | +| Manage all users from all the workspaces in the instance | ❌ | ✅ | + +### Instance Management + +| Privilege | Admin | Super Admin | +| --------- |:-----:|:-----------:| +| Manage all workspaces in the instance(Archive/Unarchive) | ❌ | ✅ | +| Restrict creation of personal workspace of users | ❌ | ✅ | +| Configure instance level login | ❌ | ✅ | +| Enable Multiplayer editing | ❌ | ✅ | +| Implement White Labelling | ❌ | ✅ | + +## Promote a User to Super Admin + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user whose details needs to be updated and click on the kebab menu (three dots) located at the end of their row. + Edit User Details Menu + +4. Select **Edit user details**. + +5. Enable the toggle in front of **Super Admin** to promote the user to a Super Admin. + Super Admin Toggle + +6. Click on **Update** at the bottom of the drawer. \ No newline at end of file diff --git a/docs/docs/user-management/role-based-access/user-roles.md b/docs/docs/user-management/role-based-access/user-roles.md new file mode 100644 index 0000000000..92e4399901 --- /dev/null +++ b/docs/docs/user-management/role-based-access/user-roles.md @@ -0,0 +1,52 @@ +--- +id: user-roles +title: User Roles +--- + +ToolJet enables you to use Role-Based Access Control (RBAC) system to manage security and access to your resources such as apps, data sources and workspace variables, etc. ToolJet provides a set of pre-defined user roles and the ability to create **[custom groups](/docs/user-management/role-based-access/custom-groups)** for more granular access control. User roles are taken into account for licensing and billing purposes, refer **[ToolJet Pricing](https://www.tooljet.com/pricing)** for more information. + +## Default User Roles + +ToolJet has three default user roles at the workspace level, each with different levels of access: + +1. **Admin**: An admin is a user with access to manage settings, control user permissions, and oversee the overall functionality. The admin user has full access to all resources. +2. **Builder**: A builder is a user responsible for creating, customizing, and configuring the application. +3. **End-user**: An end user is a consumer who interacts with the final application to perform tasks or achieve specific goals. + +## Permissions for User Roles + +Admin user has access to all the permission at workspace level, while an end user can only view and use the released apps they are given access to and permissions can be configured for a builder. + +| Resource | Permission | Admin | Builder | End User | +|:----------|:-----------|:-----------:|:---:|:---:| +| **Apps** | Create/Update/Delete | ✅ | Configurable | ❌ | +| | View | ✅ | Configurable | Configurable | +| **Data sources** | Create/Update/Delete | ✅ | Configurable | ❌ | +| **Folder** | Create/Update/Delete | ✅ | Configurable | ❌ | +| **Workspace constants/variables** | Create/Update/Delete | ✅ | Configurable | ❌ | + +## Manage User Roles + +In ToolJet, user roles can be updated easily, follow these steps to update user role: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user whose roles need to be updated and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Click on **Edit user details**, a right panel will appear. + +5. Update the role from the User groups dropdown. + Workspace Level Permissions + +6. Click on **Update** button present at the bottom of the panel. + +7. Read and accept the pop-up warning by clicking on **Continue** button. + Workspace Level Permissions + +8. The user role will be updated for that user. diff --git a/docs/docs/user-management/sso/github.md b/docs/docs/user-management/sso/github.md new file mode 100644 index 0000000000..2669e52b79 --- /dev/null +++ b/docs/docs/user-management/sso/github.md @@ -0,0 +1,48 @@ +--- +id: github +title: GitHub +--- + +GitHub SSO in ToolJet enables seamless authentication, allowing users to log in with their GitHub credentials. This integration simplifies team access management, enhances security, and streamlines workflows for developers and collaborators. + +## Configure GitHub SSO + +To enable GitHub Single Sign-on (SSO) for your ToolJet, follow these steps: + +Role Required:
    +     For Instance Level: **Super Admin**
    +     For Workspace Level: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. For Instance Level:
    +Go to **Settings > Instance login**.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + + For Workspace Level:
    + Go to **Workspace Settings > Workspace 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 GitHub. + Add user button + +4. After turning it on, a modal will appear with input fields for parameters such as Host name, Client ID, and Client secret. 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 that you will need to utilize in the GitHub Developer settings. + Add user button + +5. Go to **[GitHub Developer Settings](https://github.com/settings/developers)** and navigate to **OAuth Apps** and create a new OAuth App. + Add user button + +6. Enter the **App Name**, **Homepage URL**, and **Authorization callback URL**. The Authorization callback URL should be the generated **Redirect URL** in the ToolJet GitHub manage SSO page. Click on the Register application button to create the OAuth App. + Add user button + +7. The **Client ID** will be generated automatically. Generate the **Client Secret** by clicking the **Generate a new client secret** button. + Add user button + +8. Open the ToolJet's GitHub SSO settings and enter the obtained **Client ID** and **Client Secret**. + Add user button + +9. If you are using GitHub Enterprise self-hosted, enter the Host Name. The host name should be a URL and should not end with `/`, for example, `https://github.tooljet.com`. If it is not self-hosted, you can skip this field. + +10. Finally, click on the **Save changes** button and the GitHub sign-in button will now be available in your ToolJet login screen. + +11. Obtain the Login URL from the Instance/Workspace login page. diff --git a/docs/docs/user-management/sso/google.md b/docs/docs/user-management/sso/google.md new file mode 100644 index 0000000000..0163166e06 --- /dev/null +++ b/docs/docs/user-management/sso/google.md @@ -0,0 +1,54 @@ +--- +id: google +title: Google +--- + +You can configure Google SSO in ToolJet at both instance and workspace level for seamless authentication and enanched security. + +## Configure Google SSO + +To enable GitHub Single Sign-on (SSO) for your ToolJet, follow these steps: + +Role Required:
    +     For Instance Level: **Super Admin**
    +     For Workspace Level: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. For Instance Level:
    +Go to **Settings > Instance login**.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + + For Workspace Level:
    + Go to **Workspace Settings > Workspace 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 Google. + Add user button + +4. After turning it on, a modal will appear with input fields for parameters such as Host name, Client ID, and Client secret. 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 that you will need to utilize in the Google Cloud Console. + Add user button + +5. Go to **[Google Cloud console](https://console.cloud.google.com/)** and create a project. + Create New Project + +6. Go to the **[Google Cloud console credentials page](https://console.cloud.google.com/apis/credentials)**, and create an OAuth client ID. + General Settings: SSO + +7. You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. + General Settings: SSO + +8. You'll be led to an app registration page, fill out the required details and click on **SAVE AND CONTINUE** button at the bottom. + +9. On the second page you can set OAuth scopes. Select **ADD OR REMOVE SCOPES** and add the scopes **userinfo.email** and **userinfo.profile** as shown in the image. This will allow ToolJet to store the email and name of the user who is signing in. Click on **SAVE AND CONTINUE**. + General Settings: SSO + +10. Go to **Credentials** tab, click on **+ CREATE CREDENTIAL** and select **OAuth client ID**. Select Application type and give a name, under **Authorised JavaScript origins**, set the domain on which ToolJet is hosted and under **Authorized redirect URIs**, enter the Redirect URL which was generated in ToolJet's Google SSO settings. + General Settings: SSO + +11. Click on **Create** and copy the **Client ID**. + General Settings: SSO + +12. Configure the **Client ID** in ToolJet's Google SSO settings. + General Settings: SSO diff --git a/docs/docs/user-management/sso/ldap.md b/docs/docs/user-management/sso/ldap.md new file mode 100644 index 0000000000..03075d9d7e --- /dev/null +++ b/docs/docs/user-management/sso/ldap.md @@ -0,0 +1,43 @@ +--- +id: ldap +title: LDAP +--- + +Lightweight Directory Access Protocol (LDAP) is a protocol used to access and manage directory information, enabling centralized authentication and user management. By configuring LDAP with directory services you can streamline secure user authentication and access control in ToolJet. + +## Configure LDAP SSO + +To set up LDAP as Single Sign-On (SSO) for ToolJet, follow these steps: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Workspace login**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + + SSO :LDAP + +3. To **enable** LDAP, toggle the switch. Then, add the configuration: + + - **Name**: Enter the name of the SSO. + - **Hostname**: Provide the hostname or IP address of your LDAP server. + - **Port**: Enter the Port number of LDAP server. + - **Base DN**: Enter the base distinguished name. + - **SSL**: Toggle this option to enable the SSL. After enabling you can select the type of SSL: **None** or **Certificates**. If you choose Certificates, you'll need to provide the **Client Key**, **Client Certificate**, and **Server Certificate**. +
    + SSO :LDAP + +4. After making the necessary configurations, click the **Save Changes** button located at the bottom. + +5. Next, proceed to the **Workspace login** and copy the **Login URL** provided. + +6. The **Login URL** obtained can be utilized for accessing the workspace. Please note that ToolJet supports LDAP login at the workspace level and not at the instance level. Thus, users will be logged in specifically to the chosen workspace. + SSO :LDAP + +7. Click on the **Sign in with ``** button, and provide your username and password to log in to the workspace. For signing in, ToolJet uses the **common name (cn)** associated with each LDAP server user as the **Username**. Upon the initial login, users will be redirected to the **Workspace Invite** page, while subsequent logins will lead them directly to the ToolJet dashboard. + +:::info +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. +::: + diff --git a/docs/docs/user-authentication/sso/openid/azuread.md b/docs/docs/user-management/sso/oidc/azuread.md similarity index 50% rename from docs/docs/user-authentication/sso/openid/azuread.md rename to docs/docs/user-management/sso/oidc/azuread.md index 5ce61d5819..43797eb263 100644 --- a/docs/docs/user-authentication/sso/openid/azuread.md +++ b/docs/docs/user-management/sso/oidc/azuread.md @@ -10,55 +10,25 @@ To construct a Well Known URL refer this link :: https://docs.microsoft.com/en-u ::: - Open your organization page and select `App registration`, and then select `New registration`. - -
    - -Azure AD: SSO - -
    + Azure AD: SSO - Enter name, select supported account type and enter the redirect URL which can be copied from `Manage SSO -> Open Id -> Redirect URL, click on register`. - -
    - -Azure AD: SSO - -
    + Azure AD: SSO - Application will be registered and will be able to view the details - Configure Application (Client) ID as `client id` in Open Id configuration page. - -
    - -Azure AD: SSO - -
    + Azure AD: SSO - Click on `Add certificate or secret` next to the **Client credentials**. -- Click on `+New Client Secret` - -
    - -Azure AD: SSO - -
    +- Click on `+ New Client Secret` + Azure AD: SSO - Give a description, set the expiry, and then click on the `Add` button. - -
    - -Azure AD: SSO - -
    + Azure AD: SSO - Secret will be created, copy value and add it to the `client secret` section of Open Id SSO config. - You can brand the redirect page using the branding and properties option. - -
    - -Azure AD: SSO - -
    \ No newline at end of file + Azure AD: SSO diff --git a/docs/docs/user-management/sso/oidc/google.md b/docs/docs/user-management/sso/oidc/google.md new file mode 100644 index 0000000000..ec3a3136d9 --- /dev/null +++ b/docs/docs/user-management/sso/oidc/google.md @@ -0,0 +1,31 @@ +--- +id: google +title: Google (OIDC) +--- + +Google can be configured as the Identity Provider for OIDC, which is an authentication protocol that securely verifies user identities through a trusted provider. This document explains how to obtain the required credentials from the Google console. Refer to the **[OIDC Setup](/docs/user-management/sso/oidc/setup)** Guide to configure OIDC in your application. + +## Generating Client ID and Client Secret on GCS + +1. Go to **[Google Cloud console](https://console.cloud.google.com/)** and create a project. + Create New Project + +2. Go to the **[Google Cloud console credentials page](https://console.cloud.google.com/apis/credentials)**, and create an OAuth client ID. + General Settings: SSO + +3. You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. + General Settings: SSO + +4. You'll be led to an app registration page, fill out the required details and click on **SAVE AND CONTINUE** button at the bottom. + +5. On the second page you can set OAuth scopes. Select **ADD OR REMOVE SCOPES** and add the scopes **userinfo.email** and **userinfo.profile** as shown in the image. This will allow ToolJet to store the email and name of the user who is signing in. Click on **SAVE AND CONTINUE**. + General Settings: SSO + +6. Go to **Credentials** tab, click on **+ CREATE CREDENTIAL** and select **OAuth client ID**. Select Application type and give a name, under **Authorised JavaScript origins**, set the domain on which ToolJet is hosted and under **Authorized redirect URIs**, enter the Redirect URL which was generated in ToolJet's Google SSO settings. + General Settings: SSO + +7. Click on **Create** and copy the **Client ID** and **Client secret**. + General Settings: SSO + +8. Use `https://accounts.google.com/.well-known/openid-configuration` as the **Well Known URL**. diff --git a/docs/docs/user-management/sso/oidc/okta.md b/docs/docs/user-management/sso/oidc/okta.md new file mode 100644 index 0000000000..3c04a56277 --- /dev/null +++ b/docs/docs/user-management/sso/oidc/okta.md @@ -0,0 +1,26 @@ +--- +id: okta +title: Okta +--- + +Okta can be configured as the Identity Provider for OIDC, which is an authentication protocol that securely verifies user identities through a trusted provider. This document explains how to obtain the required credentials from the Okta Developer Console. Refer to the **[OIDC Setup](/docs/user-management/sso/oidc/setup)** guide to configure OIDC in your application. + +## Generating Client ID and Client Secret on Okta Developer Console + +1. Sign in to the [Okta Developer Console](https://developer.okta.com/). + +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. + Okta: SSO + +4. Enter an **App integration name** and set the **Sign-in redirect URIs** to Redirect URL from ToolJet. + Okta: SSO + +5. Create the application. + +6. Copy the Client Credential and configure them in ToolJet. + Okta: SSO + +7. Follow [Okta Auth Servers Documentation](https://developer.okta.com/docs/concepts/auth-servers/#org-authorization-server) to find the well known URL. \ No newline at end of file diff --git a/docs/docs/user-management/sso/oidc/setup.md b/docs/docs/user-management/sso/oidc/setup.md new file mode 100644 index 0000000000..d55fecb638 --- /dev/null +++ b/docs/docs/user-management/sso/oidc/setup.md @@ -0,0 +1,44 @@ +--- +id: setup +title: OpenID Connect Setup +--- + +
    + Icon + Paid feature +
    + +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. + +## Configuring OIDC + +Follow these steps to enable OIDC in your system: + +Role Required:
    +     For Instance Level: **Super Admin**
    +     For Workspace Level: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. For Instance Level:
    +Go to **Settings > Instance login**.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + + For Workspace Level:
    + Go to **Workspace Settings > Workspace 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 + +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 + +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. + +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/docs/user-management/sso/overview.md b/docs/docs/user-management/sso/overview.md new file mode 100644 index 0000000000..824e9a096e --- /dev/null +++ b/docs/docs/user-management/sso/overview.md @@ -0,0 +1,15 @@ +--- +id: overview +title: Overview +--- + +Single Sign-On (SSO) is an authentication process that allows users to access multiple applications or services with a single set of login credentials. By eliminating the need to log in separately to each application, SSO enhances user experience and security. + +Companies use SSO to simplify authentication, enhance security, and improve user experience by allowing access to multiple applications with one set of credentials. It reduces password fatigue, streamlines IT management, and boosts productivity while maintaining robust security compliance. + +ToolJet supports various SSOs such as: +- **[GitHub](/docs/user-management/sso/github)** +- **[Google](/docs/user-management/sso/google)** +- **[OpenID Connect](/docs/user-management/sso/oidc/setup)** +- **[LDAP](/docs/user-management/sso/ldap)** +- **[SAML](/docs/user-management/sso/saml/setup)** \ No newline at end of file diff --git a/docs/docs/user-management/sso/saml/okta.md b/docs/docs/user-management/sso/saml/okta.md new file mode 100644 index 0000000000..360d6d02cf --- /dev/null +++ b/docs/docs/user-management/sso/saml/okta.md @@ -0,0 +1,65 @@ +--- +id: okta +title: Okta +--- + +Okta can be configured as the Identity Provider for SAML, which is an authentication protocol that securely verifies user identities through a trusted provider. This document explains how to obtain the required credentials from the Okta Developer Console. Refer to the **[SAML Setup](/docs/user-management/sso/saml/setup)** guide to configure SAML in your application. + +## Generating Metadata + +1. Sign in to the [Okta Developer Console](https://developer.okta.com/). + +2. Navigate to the **Applications** section and click **Create App Integration**. + Okta: SSO + +3. Select **SAML 2.0** as the **Sign-in method**. Click on the **Next** button. + Okta: SSO + +4. Configure the **General Settings**: + - **App Name**: Enter the application name to be displayed on the login page. + - **App Logo (optional)**: Upload a logo to be shown on the login page.

    + Okta General Settings + + +5. In the **Configure SAML** tab, configure the following fields:

    + **General**: + - **Single sign-on URL**: Redirect URL copied from the SAML configuration page in ToolJet. + - **Audience URI** (SP Entity ID): entityID present in XML file. + - **Default RelayState**: Leave this field blank. + - **Name ID format**: EmailAddress. + - **Application username**: Email. + - **Update application username on**: Create and update.

    + Okta Configure SAML General + + **Attribute Statements**: + + | Name | Name format | Value | + | --- | --- | ---- | + | email | Unspecified | user.email | + | name | Unspecified | user.firstName | + + Okta Configure SAML ATTRIBUTE STATEMENTS + + **Group Attribute Statements**: + + | Name | Name format | Filter | Value | + | --- | --- | --- | --- | + | groups | Unspecified | Matches regex | "*" | + + Okta Configure SAML ATTRIBUTE STATEMENTS + +6. Review and click on the **Next** button. + +7. Click on the **Finish** button to complete the Okta application configuration. + +8. Navigate to the **Sign On** tab and make sure **Application username format** is set to **Email**, otherwise click on the **Edit** button and update. + +9. Copy the **Metadata URL**. This URL will retrieve the XML metadata file for the Okta application. + Okta Sign On + +10. Paste the metadata URL into the **Identity provider metadata** field in the ToolJet SAML configuration. + +11. Ensure that Audience URI (SP Entity ID) from the XML file is added to the Configure SAML tab in the Okta application configuration. + +12. Test the SAML configuration by logging in to ToolJet using the Login URL. + SSO :SAMP diff --git a/docs/docs/user-management/sso/saml/setup.md b/docs/docs/user-management/sso/saml/setup.md new file mode 100644 index 0000000000..71f0bdcf95 --- /dev/null +++ b/docs/docs/user-management/sso/saml/setup.md @@ -0,0 +1,51 @@ +--- +id: setup +title: SAML Setup +--- + +Security Assertion Markup Language (SAML) is a protocol that facilitates secure SSO authentication by exchanging user identity data between an identity provider and a service provider. Integrating SAML with providers like Okta, Active Directory Federation Services, Auth0 or Azure AD allows you to implement seamless and secure authentication for your users in ToolJet. + +## Configuring SAML + +To enable SAML authentication, you need to configure the following workspace settings: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Workspace login**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + SSO :SAMP + +2. By default, SAML is disabled. Toggle it on to enable SAML authentication. + SSO :SAMP + +3. Enter the following configuration details: + - **SAML Provider Name**: Enter the name of your SAML provider. This name will be displayed on the login page. + - **Identity provider metadata**: Upload the data from the metadata file provided by your SAML provider. This file contains the SAML configuration details. + - **Group Attribute**: Enter the name of the attribute that contains the group information of the user. This attribute is used to map the user to the appropriate group. + - **Redirect URL**: Copy the redirect URL provided and paste it in the SAML provider's configuration page. + +
    + + :::tip Downloading the metadata from your identity provider + Generally, the metadata is available in the form of an XML file which can be downloaded from your identity provider's dashboard. + + Copy the metadata from the XML file and paste it into the ToolJet's SAML SSO configuration settings. Please ensure that the metadata is pasted in the correct format, as it contains essential configuration details from the identity provider necessary for authentication. + + Additionally, you can often find this data by navigating to `https://your-identity-provider/federationmetadata/2007-06/federationmetadata.xml` + ::: + +4. Once configured, click **Save Changes**. + +## Logging in with SAML + +1. Go to the **Workspace login** tab and copy the **Login URL** provided. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. + +2. The **Login URL** obtained can be used to access the workspace. Please note that ToolJet supports SAML login at the workspace level, ensuring users are logged in specifically to the selected workspace.
    + As a result, users can now log in to your workspace using the provided Login URL. The login page will prominently feature the name of the SAML provider configured in your workspace settings. + SSO :SAMP + +3. Click on **Sign in with `SAML Name`** button and you will be redirected to the SAML provider's login page. + +4. Enter your credentials and click **Login**. If the user is signing in for the first time, they will be redirected to the ToolJet's onboarding page. diff --git a/docs/docs/versions.md b/docs/docs/versions.md index df360e1dd6..4824fa0672 100644 --- a/docs/docs/versions.md +++ b/docs/docs/versions.md @@ -3,19 +3,20 @@ id: versions title: ToolJet Documentation Versions --- -**Current LTS Version (Stable)** +## Current LTS Versions (Stable) -| Version | Documentation | -|-------------|-------------------------------------------| -| 2.50.0-LTS | [Documentation](https://docs.tooljet.com/docs/) | +| Version | Documentation | +|------------|-------------------------------------------------| +| 3.0.0-LTS | [Documentation](https://docs.tooljet.ai/docs/) | +| 2.50.0-LTS | [Documentation](https://docs.tooljet.ai/docs/2.50.0-LTS/) | -**Beta Version (Pre-Release)** +## Beta Version (Pre-Release) | Version | Documentation | |-------------|-------------------------------------------| -| 2.68.0-Beta 🚧 | [Documentation](https://docs.tooljet.com/docs/2.68.0) | +| 3.1.0-Beta 🚧 | [Documentation](https://docs.tooljet.ai/docs/beta/) | -**Past Versions (Not Maintained Anymore)** +## Past Versions (Not Maintained Anymore) | Version | Documentation | |-------------|-------------------------------------------| diff --git a/docs/docs/widgets/button-group.md b/docs/docs/widgets/button-group.md index 48dbffee3e..e8e4eface3 100644 --- a/docs/docs/widgets/button-group.md +++ b/docs/docs/widgets/button-group.md @@ -12,29 +12,27 @@ The **Button Group** component is used to group a series of buttons together in
    -
    +
    ## Properties |
    Properties
    |
    Description
    |
    Expected Value
    | |:----------- |:----------- |:-------------- | -| label | Sets the title of the button-group. | Any **String** value: `Select the options` or `{{queries.queryname.data.text}}` | -| values | Sets the values of the Button Group items. | **Array** of strings and numbers: `{{[1,2,3]}}` | -| Labels | Sets the labels of the Button Group items. | **Array** of strings and numbers: `{{['A','B','C']}}` | +| label | Sets the title of the button-group. | Any **String** value: `Select the options` or `{{queries.queryname.data.text}}`. | +| values | Sets the values of the Button Group items. | **Array** of strings and numbers: `{{[1,2,3]}}`. | +| Labels | Sets the labels of the Button Group items. | **Array** of strings and numbers: `{{['A','B','C']}}`. | | Default selected | Sets the initial selected values. | **Array** of strings and numbers: `{{[1]}}` will select the first button by default. | -| Enable multiple selection | Toggle on or off to enable multiple selection. | **Boolean** value: `{{true}}` or `{{false}}` | +| Enable multiple selection | Toggle on or off to enable multiple selection. | **Boolean** value: `{{true}}` or `{{false}}`. |
    -
    +
    ## Events -Events are actions that can be triggered programmatically when the user interacts with the component. Click on the component handle to open its properties on the right. Go to the **Events** accordion and click on **+ Add handler**. - |
    Events
    |
    Description
    | |:----------- |:----------- | -| On click | This event is triggered when the user clicks on the button in the Button Group. | +| On click | Triggers whenever the user clicks on the button in the Button Group. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -42,7 +40,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
    -
    +
    ## Component Specific Actions (CSA) @@ -50,17 +48,17 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
    -
    +
    ## Exposed Variables |
    Variable
    |
    Description
    |
    How To Access
    | | :---------- | :---------- | :----------| -| selected | If the **enable multiple selection** option is turned off, then the variable is an array of objects, and the first object holds the value of the selected button. However, if it is turned on, the variable type changes from an array to an object, and the selected button values are stored as a string within that object. | Access the value using `{{components.buttongroup1.selected[0]}}` or `{{components.buttongroup1.selected}}` | +| selected | Holds the currently selected button value as an array of objects. | Accessible dynamically with JS (for e.g., `{{components.buttongroup1.selected[0]}} or {{components.buttongroup1.selected}}`). |
    -
    +
    ## General #### Tooltip @@ -75,30 +73,32 @@ A Tooltip is often used to display additional information when the user hovers t
    -
    +
    -## Layout +## Devices -|
    Layout
    |
    Description
    | -| :----------- | :----------- | -| Desktop | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**.| -| Mobile | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**. | +|
    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 |
    Style
    |
    Description
    |
    Expected Value
    | | :---------- | :---------- | :-------------- | -| Background color | Set a background color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Text color | Set a text color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Visibility | Make the component visible or hidden. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{true}}` | -| Disable | Disable the component. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{false}}` | -| Border radius | Add a border radius to the buttons in the component using this property. | Any numerical value from `0` to `100` | -| Selected text color | Use this property to modify the text color of selected button | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Selected background color | Use this property to modify the background color of selected button | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent X, Y, blur, spread, and color. Example: `9px 11px 5px 5px #00000040`` | +| Background color | Set a background color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Text color | Set a text color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Visibility | Make the component visible or hidden. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{true}}`. | +| Disable | Disable the component. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{false}}`. | +| Border radius. | Add a border radius to the buttons in the component using this property. | Any numerical value from `0` to `100`. | +| Selected text color | Use this property to modify the text color of selected button. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Selected background color | Use this property to modify the background color of selected button. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent X, Y, blur, spread, and color. Example: `9px 11px 5px 5px #00000040`. | -
    \ No newline at end of file +
    diff --git a/docs/docs/widgets/button.md b/docs/docs/widgets/button.md index f078f3f891..3d6b69122f 100644 --- a/docs/docs/widgets/button.md +++ b/docs/docs/widgets/button.md @@ -69,16 +69,16 @@ Following actions of Button component can be controlled using the component spec | 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 (e.g., `Button to Submit Form` ). | +
    + ## Devices -**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. | +
    --- diff --git a/docs/docs/widgets/chart/chart.md b/docs/docs/widgets/chart/chart.md index 7778bcb14e..6a115f8585 100644 --- a/docs/docs/widgets/chart/chart.md +++ b/docs/docs/widgets/chart/chart.md @@ -71,13 +71,10 @@ Check [Action Reference](/docs/category/actions-reference) docs to get detailed ## Devices -**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 diff --git a/docs/docs/widgets/chat/csa.md b/docs/docs/widgets/chat/csa.md new file mode 100644 index 0000000000..09a890d4dd --- /dev/null +++ b/docs/docs/widgets/chat/csa.md @@ -0,0 +1,31 @@ +--- +id: csa +title: Component Specific Actions & Exposed Variables +--- + +This guide covers component-specific actions for the **Chat Component** and its exposed variables. To learn how to build a chatbot, refer to the [Chat Component Overview](/docs/widgets/chat/) guide. For more information on Chat Component Properties, check out the [Properties](/docs/widgets/chat/properties) guide. + +## Component Specific Actions (CSA) + +|
    Action
    |
    Description
    | How to Access | +|--------|-------------|---------------| +| sendMessage( ) | Sends a message in the chat. | Employ a RunJS query (for e.g. `components.chat1.sendMessage({message: "Hey! How can I help you?", type: "response"})`) or trigger it using an event. | +| clearHistory( ) | Clear chat history. | Employ a RunJS query (for e.g. `components.chat1.clearHistory()`) or trigger it using an event. | +| deleteMessage( ) | Delete a message using the MessageID | Employ a RunJS query (for e.g. `components.chat1.deleteMessage(MessageID)`) or trigger it using an event. | +| downloadChat( ) | Download the chat in JSON format. | Employ a RunJS query (for e.g. `components.chat1.downloadChat()`) or trigger it using an event. | +| setHistory( ) | Sets the chat history. | Employ a RunJS query (for e.g. `components.chat1.setHistory(History Object)`) or trigger it using an event. | +| appendHistory( ) | Appends chat history. | Employ a RunJS query (for e.g. `components.chat1.appendHistory(Message Object)`) or trigger it using an event. | +| setResponderAvatar( ) | Sets Responder's Avatar. | Employ a RunJS query (for e.g. `components.chat1.setResponderAvatar(Image URL)`) or trigger it using an event. | +| setUserAvatar( ) | Sets User's Avatar. | Employ a RunJS query (for e.g. `components.chat1.setUserAvatar(Image URL)`) or trigger it using an event. | + +## Exposed Variables + +| Variable |
    Description
    | How to Access | +|----------|-------------|---------------| +| history | Access the chat history. | Accessible dynamically with JS (for e.g., `{{components.chat1.history}}`). | +| isHistoryLoading | Indicates if the history is loading. | Accessible dynamically with JS (for e.g., `{{components.chat1.isHistoryLoading}}`). | +| isResponseLoading | Indicates if the response is loading. | Accessible dynamically with JS (for e.g., `{{components.chat1.isResponseLoading}}`). | +| isInputDisabled | Indicates if the input is disabled. | Accessible dynamically with JS (for e.g., `{{components.chat1.isInputDisabled}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.chat1.isVisible}}`). | +| lastMessage | Holds the last message object of type message in the array. | Accessible dynamically with JS (for e.g., `{{components.chat1.lastMessage}}`). | +| lastResponse | Holds the last message object of type response in the array. | Accessible dynamically with JS (for e.g., `{{components.chat1.lastResponse}}`). | diff --git a/docs/docs/widgets/chat/markdown.md b/docs/docs/widgets/chat/markdown.md new file mode 100644 index 0000000000..543b01bc10 --- /dev/null +++ b/docs/docs/widgets/chat/markdown.md @@ -0,0 +1,475 @@ +--- +id: markdown +title: Supported Markdown Syntax +--- + +In ToolJet, the Chat Component supports Markdown formatting for both responses and messages. This can be used enhance text formatting using Markdown syntax, making conversations more readable and structured. + +## Supported Markdown Syntax + +#### Headings + +|
    Heading
    |
    Format
    | +|:-------:|:------:| +| H1 | `# Heading`| +| H2 | `## Heading` | +| H3 | `### Heading` | +| H4 | `#### Heading` | +| H5 | `##### Heading` | +| H6 | `###### Heading` | + +#### Text Formatting + +##### Bold + +
    + +
    + +Format: +``` +**Text** +``` + +
    + +
    + +
    + +Result: + +**Text** + +
    + +
    + +##### Italic + +
    + +
    + +Format: +``` +*Text* +``` + +
    + +
    + +
    + +Result: + +*Text* + +
    + +
    + +##### Bold and Italic + +
    + +
    + +Format: +``` +***Text*** +``` + +
    + +
    + +
    + +Result: + +***Text*** + +
    + +
    + +##### Strikethrough + +
    + +
    + +Format: +``` +~~Text~~ +``` + +
    + +
    + +
    + +Result: + +~~Text~~ + +
    + +
    + +#### Lists + +##### Unordered Lists + +
    + +
    + +Format: +``` +- Item 1 +- Item 2 + - Nested Item 2.1 + - Nested Item 2.2 +``` + +
    + +
    + +
    + +Result: +- Item 1 +- Item 2 + - Nested Item 2.1 + - Nested Item 2.2 + +
    + +
    + + +##### Ordered Lists + +
    + +
    + +Format: +``` +1. First Item +2. Second Item + 1. Nested Item 2.1 + 2. Nested Item 2.2 +``` + +
    + +
    + +
    + +Result: +1. First Item +2. Second Item + 1. Nested Item 2.1 + 2. Nested Item 2.2 + +
    + +
    + + +##### Task Lists + +
    + +
    + +Format: +``` +- [x] Completed task +- [ ] Pending task +``` + +
    + +
    + +
    + +Result: +- [x] Completed task +- [ ] Pending task + +
    + +
    + +#### Code + +##### Inlince Code + +
    + +
    + +Format: +``` +This is `inline code`. +``` + +
    + +
    + +
    + +Result: + +This is `inline code`. +
    + +
    + +##### Code Block + +
    + +
    + +Format: +``` +\```javascript +const hello = "world"; +console.log(hello); +\``` +``` +Note: Please remove `\` from the syntax. + +
    + +
    + +
    + +Result: +```javascript +const hello = "world"; +console.log(hello); +``` +
    + +
    + +#### Block Quotes + +
    + +
    + +Format: +``` +> Single level quote +>> Nested quote +>>> Deep nested quote +``` + +
    + +
    + +
    + +Result: +> Single level quote +>> Nested quote +>>> Deep nested quote +
    + +
    + +#### Links and Images + +##### Links + +
    + +
    + +Format: +``` +[Link Text](https://example.com) +``` + +
    + +
    + +
    + +Result: + +[Link Text](https://example.com) + +
    + +
    + +##### Image + +
    + +
    + +Format: +``` +![Image Alt Text](https://images.unsplash.com/photo-1509966756634-9c23dd6e6815?q=80&w=3176&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D) +``` + +
    + +
    + +
    + +Result: + +![Image Alt Text](https://images.unsplash.com/photo-1509966756634-9c23dd6e6815?q=80&w=3176&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D) + +
    + +
    + +#### Tables + +
    + +
    + +Format: +``` +| Header 1 | Header 2 | +|-----------|-----------| +| Cell 1 | Cell 2 | +| Cell 3 | Cell 4 | +``` + +
    + +
    + +
    + +Result: + + Header 1 | Header 2 | +|-----------|-----------| +| Cell 1 | Cell 2 | +| Cell 3 | Cell 4 | + +
    + +
    + +#### Horizontal Rules + +
    + +
    + +Format: +``` +--- +OR +___ +OR +*** +``` + +
    + +
    + +
    + +Result: + +--- + +
    + +
    + +#### HTML Content + +
    + +
    + +Format: +``` +
    + Colored text +
    +
    + + + +
    HTML Table
    +``` + +
    + +
    + +
    + +Result: + +
    + Colored text +
    + + + + +
    HTML Table
    + +
    + +
    + +#### Footnotes + +
    + +
    + +Format: +``` +Here's a sentence with a footnote[^1]. + +[^1]: This is the footnote. +``` + +
    + +
    + +
    + +Result: + +Here's a sentence with a footnote[^1]. + +[^1]: This is the footnote. + +
    + +
    + diff --git a/docs/docs/widgets/chat/overview.md b/docs/docs/widgets/chat/overview.md new file mode 100644 index 0000000000..a68e7fc4e2 --- /dev/null +++ b/docs/docs/widgets/chat/overview.md @@ -0,0 +1,58 @@ +--- +id: overview +title: Overview +slug: /widgets/chat/ +--- + +The **Chat Component** is used to implement a chat-based interface in an application. It can be integrated with AI plugins to build an AI-enabled chatbot or used for traditional chat functionalities, making it suitable for both AI-powered and human-to-human conversations. + +This guide explains how to build an AI-enabled support chatbot using the Chat Component. For more details, refer to the following guides: +- **[Chat Component Properties](/docs/widgets/chat/properties)** +- **[Component Specific Actions (CSA)](/docs/widgets/chat/csa)** +- **[Supported Markdown Syntax](/docs/widgets/chat/markdown)** + +## Building AI Enabled Chatbot + +1. Drag a **Chat Component** on the canvas. + +Drag a New Chat Component + +2. Customize the **Chat Component**. + + a. Enter a Chat Title.
    + b. Set Initial Chat.
    + c. Configure User Name and Avatar.
    + d. Configure Respondent Name and Avatar.
    + +Customize your Chat Component + +3. Setup an AI query to generate responses. Check out **[marketplace](/docs/marketplace/marketplace-overview)** for all the available plugins. Alternatively, you can configure it with any data source or use it as a chat between multiple users. To do this, specify the type 'response' in the message object. + +Setup the AI Query + +4. Add a new event handler for the query with the following configurations: + - Event: **Query Success** + - Action: **Control Component** + - Component: **chat1** *(Select your chat component name from the dropdown.)* + - Action: **Append History** + - Message: + `{{{message: queries.openai1.data, type:"response"}}}` + +Query Event Handler + +5. Now add a new event handler for the **Chat Component**, with the following configuration: + - Event: **On Message Sent** + - Action: **Run Query** + - Query: **openai1** *(Select your AI query name from the dropdown.)* + +Component Event Handler + +6. To add Response loading state, click on **fx** in front of Response loading state option and configure it with `{{queries.openai1.isLoading}}`. + +Add Response Loading State + +By following the above steps, your AI Enabled Chatbot will be ready. + +Final Chatbot + + diff --git a/docs/docs/widgets/chat/properties.md b/docs/docs/widgets/chat/properties.md new file mode 100644 index 0000000000..6ebf47251e --- /dev/null +++ b/docs/docs/widgets/chat/properties.md @@ -0,0 +1,56 @@ +--- +id: properties +title: Properties +--- + +The **Chat Component** can be customized by configuring various properties or adding events to perform specific actions. To learn how to build a chatbot, refer to the [Chat Component Overview](/docs/widgets/chat/) guide. For more information on CSAs and Exposed Variables, check out the [Component Specific Actions](/docs/widgets/chat/csa) guide. + +## Properties + +| Property | Description | Expected Value | +|----------|-------------|--------------- | +| Chat Title | Title of the chat component. | String (e.g. `ToolJet Support Chatbot`) | +| Initial Chat | Initial messages to be loaded when the chat starts. | Array of Objects ( e.g. `{{[ { message: 'Hey! Welcome to ToolJet. How may I help you?' } ]}}` ) | +| User Name | Defines the user's name. | String (e.g. `John Doe`) | +| User Avatar | Defines the user's avatar. | Image URL | +| Respondent Name | Defines the respondent's name. | String (e.g. `ToolJet Bot`) | +| Respondent Avatar | Defines the respondent's avatar. | Image URL | + +## Message Object Properties + +| Property | Description | Required | Expected Value | +|----------|-------------|----------|----------------| +| Message | The content of the message. | Required | String (e.g. `"Hey! How can I help you?"`) | +| Message ID | ID of the message. | Auto-generated | String (e.g. `"e3dd6f60-d5e8-46c5-b73b-006f2f4a34f2"`) | +| Timestamp | Date and Time of the message. | Auto-generated | DateTime in ISO 8601 format (e.g. `"2025-02-05T09:33:32.468Z"`) | +| Name | Message sender's name. | Optional | String (e.g. `"John Doe"`) | +| Avatar | Message sender's avatar. | Optional | Image URL | +| Type | Type of the message. | Required | Accepted Values: `"response"`, `"message"` or `"error"`. | + +## Events + +| Event | Description | +|-------|-------------| +| On history cleared | Triggers whenever the history is cleared. | +| On message sent | Triggers whenever a message is sent. | + +## Additional Actions + +All the following actions can be enabled or disabled either by using the toggle switch or by dynamically configuring the value by clicking on **fx** and entering a logical expression. + +| Action | Description | +|--------|-------------| +| Visibility | Controls the component's visibility. | +| Disable input state | Enables or disables the input state. | +| Histroy loading state | Enables the history loading state, often used with `isLoading` to indicate progress. | +| Response loading state | Enables the response loading state, often used with `isLoading` to indicate progress. | +| Enable clear history button | Enables or disables the clear history button. | +| Enable download history button | Enables or disables the delete history button. | + +## 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. | + diff --git a/docs/docs/widgets/checkbox.md b/docs/docs/widgets/checkbox.md index 7db2ea0de4..9cb0c38bad 100644 --- a/docs/docs/widgets/checkbox.md +++ b/docs/docs/widgets/checkbox.md @@ -6,7 +6,7 @@ title: Checkbox The **Checkbox** component allows users to make a binary choice, such as selecting or deselecting an option. -
    +
    ## Properties @@ -15,19 +15,19 @@ The **Checkbox** component allows users to make a binary choice, such as selecti | Property | Description | Expected Value | |:---------------|:---------------|:-----------------------| | Label | The text to be used as the label for the checkbox. | String (e.g., `Select payment preference`). | -| Default status | Sets the default status when the app is loaded. | Toggle the on/off switch or click on `fx` and dynamically set the value. | +| Default status | Sets the default status when the app is loaded. | Toggle the on/off switch or click on **fx** and dynamically set the value. |
    -
    +
    ## Events |
    Event
    |
    Description
    | |:----------- |:----------- | -| On change | On change event is triggered when checkbox input is changed. | -| On check (deprecated) | On check event is triggered when checkbox input is checked. | -| On uncheck (deprecated)| On uncheck event is triggered when checkbox input is unchecked. | +| On change | Triggers whenever the checkbox input is changed. | +| On check (deprecated) | Triggers whenever the checkbox input is checked. | +| On uncheck (deprecated)| Triggers whenever the checkbox input is unchecked. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -35,7 +35,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
    -
    +
    ## Component Specific Actions (CSA) @@ -53,7 +53,7 @@ Following actions of Checkbox component can be controlled using the component sp
    -
    +
    ## Exposed Variables @@ -69,13 +69,13 @@ Following actions of Checkbox component can be controlled using the component sp
    -
    +
    ## Validation |
    Validation Option
    |
    Description
    |
    Expected Value
    | |:---------------|:-------------------------------------------------|:-----------------------------| -| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | | Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.checkbox1.value === false &&"Value needs to be checked"}}`). | To add regex inside `Custom Validation`, you can use the below format: @@ -88,20 +88,21 @@ To add regex inside `Custom Validation`, you can use the below format: |
    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. | +| 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 (e.g., `Are you a registered user?` ). | +
    + ## Devices -**Show on desktop** +|
    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. | -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. +
    --- @@ -111,18 +112,18 @@ Makes the component visible in mobile view. You can set it with the toggle butto |
    Label Property
    |
    Description
    |
    Configuration Options
    | |:---------------|:------------|:---------------| -| Text color | Sets the color of the component's label. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on `fx` to input code that programmatically returns an alignment value - `left` or `right`. | +| Text color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `left` or `right`. | ## Switch |
    Label Property
    |
    Description
    |
    Configuration Options
    | |:---------------|:------------|:---------------| -| Border color | Sets the color of the checkbox. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Checked color | Sets the color of the checkbox when it is checked. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Unchecked color | Sets the color of the checkbox when it is not checked. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Handle color | Sets the color of the checked symbol inside the checkbox. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using `fx`. | +| Border color | Sets the color of the checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Checked color | Sets the color of the checkbox when it is checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Unchecked color | Sets the color of the checkbox when it is not checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Handle color | Sets the color of the checked symbol inside the checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. |
    diff --git a/docs/docs/widgets/code-editor.md b/docs/docs/widgets/code-editor.md index 2108b6fb19..4f94b5456f 100644 --- a/docs/docs/widgets/code-editor.md +++ b/docs/docs/widgets/code-editor.md @@ -5,11 +5,6 @@ title: Code Editor **Code Editor** component is a versatile text editor for editing code and supports several languages. -
    - -ToolJet - Component Reference - Code editor - -
    @@ -21,12 +16,12 @@ Any property having **fx** button next to its field can be **programmatically co |
    Property
    |
    Description
    |
    Expected Value
    | |:----------- |:----------- |:----------------- | -| Placeholder | Specifies a hint that describes the expected value.| This field requires a `String` value | -| Mode | Specifies the language to be used for the code-editor.| See `info` below for the list of all supported languages | -| Show line number | Show or hides line numbers to the left of the editor.| This fields expects a boolean value `{{true}}` or `{{false}}` | +| Placeholder | Specifies a hint that describes the expected value.| This field requires a `String` value. | +| Mode | Specifies the language to be used for the code-editor.| See `info` below for the list of all supported languages. | +| Show line number | Show or hides line numbers to the left of the editor.| This fields expects a boolean value `{{true}}` or `{{false}}`. | :::info -
    +
    Supporting all commonly used languages.
    • APL
    • @@ -169,7 +164,13 @@ Any property having **fx** button next to its field can be **programmatically co ## Component Specific Actions (CSA) -There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. +Following actions of Code Editor component can be controlled using the component specific actions(CSA): + +|
      Action
      |
      Description
      |
      How To Access
      | +|:----------- |:----------- |:---------| +| setValue | Sets the value of the code editor. | Employ a RunJS query (e.g., `components.codeeditor1.setValue('const getRandomNumber = () => Math.floor(Math.random() * 100) + 1')`) or trigger it using an event. | + +**Note:** If the setValue component specific action is executed using a JavaScript query, you will have to pass the code inside backticks.
    @@ -179,7 +180,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
    Variables
    |
    Description
    |
    How To Access
    | |:----------- |:----------- |:---------- | -| value | Holds the value of the user inputs in the code editor. | Access the value dynamically using JS (for e.g., `{{components.codeeditor1.value}}`). | +| value | Holds the current input value entered by the user in the code editor. | Accessible dynamically with JS (for e.g., `{{components.codeeditor1.value}}`). |
    @@ -196,12 +197,12 @@ Under the General accordion, you can set the value in the string format.
    -## Layout +## Devices -|
    Layout
    |
    Description
    | -|:----------- |:----------- | -| Show on desktop | Toggle on or off to display the component in desktop view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display the component in mobile view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +|
    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.|
    diff --git a/docs/docs/widgets/container.md b/docs/docs/widgets/container.md index 3abfd525a1..9ff64cc65e 100644 --- a/docs/docs/widgets/container.md +++ b/docs/docs/widgets/container.md @@ -3,89 +3,66 @@ id: container title: Container --- -Containers are used to group components together. You can move the desired number of components inside a container to organize your app better. +Containers are used to group components together. You can move a group of related components inside a container for better organization of your UI elements. :::caution Restricted components -In order to avoid excessively complex situations, certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the Container component using drag-and-drop functionality. - -If the builder attempts to add any of the aforementioned components inside the container, an error message will be displayed: - -` cannot be used as a child component within the container.` +Certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the Container component. ::: -
    +## Show header -## Enabling Vertical Scroll on Container - -To enable the vertical scroll on the container, drag and place any component to the bottom grid of the container and the container will automatically enable the scrolling. - -
    - -
    - -## Loading State - -To activate the loader on the Container component, access its properties and dynamically adjust the **Loading State** property by clicking the **fx** button. You can set it to either `{{true}}` or `{{false}}`. - -For instance, if you wish to display the loader on the container when the query named `restapi1` is in progress, set the **Loading State** value to `{{queries.restapi1.isLoading}}`. - -
    - -
    +The show header toggle can be used to display or hide a header for the component. If you keep the toggle on, the container will display a header on which you can place other components. The styling of the header can be controlled separately under the Styles tab. ## Component Specific Actions (CSA) -There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. +Following actions of component can be controlled using the component specific actions(CSA): -
    - -
    +|
    Action
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.container1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.container1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.container1.setDisable(true)`) or trigger it using an event. | ## Exposed Variables -There are currently no exposed variables for the component. +| Variable | Description | How To Access | +|:--------|:-----------|:------------| +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.container1.isLoading}}`).| +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.container1.isVisible}}`).| +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.container1.isDisabled}}`).| -
    +## Tooltip -
    +You can add a Tooltip to the component in string format. Once you pass a value in the tooltip input, hovering over the component will display the value on the right. -## General -### Tooltip +## Additional Actions -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. +|
    Action
    |
    Description
    |
    Configuration Options
    | +|:------------------|:------------|:------------------------------| +| Loading state | Enables a loading spinner, often used with the isLoading property to indicate progress. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Visibility | Controls component visibility. | 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. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | -Under the **General** accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. +## Devices -
    - -
    - -## Layout - -|
    Layout
    |
    Description
    | -|:----------- |:----------- | :-----------| +|
    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. | - -
    +| 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 -|
    Style
    |
    Description
    |
    Default Value
    | -|:----------- |:----------- |:---------| -| Background color | Change the background color of the Container by entering the `Hex color code` or choosing a color of your choice from the color picker. | | -| Border radius | Modifies the border radius of the container. The field expects only numerical values from `1` to `100`.| Default is `0`. | -| Border color | Change the border color of the Container by entering the `Hex color code` or choosing a color of your choice from the color picker. | | -| Visibility | Controls the visibility of the component. If `{{false}}` the component will not be visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | -| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | +|
    Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the container. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Header | Sets the background color of the header. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Header height | Sets the height of the header within the component. | Enter a number or click on **fx** and input a number programmatically using code. | +| Border radius | Sets the radius of the component. | Enter a number or click on **fx** and input a number programmatically using code. | +| Border color | Sets the color of the border. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. | + -:::info -Any property having **fx** button next to its field can be **programmatically configured**. -::: -
    diff --git a/docs/docs/widgets/date-range-picker.md b/docs/docs/widgets/date-range-picker.md index 3086237b90..d9322541a1 100644 --- a/docs/docs/widgets/date-range-picker.md +++ b/docs/docs/widgets/date-range-picker.md @@ -23,7 +23,7 @@ The **Date-Range Picker** component allows users to select a range of dates. |
    Event
    |
    Description
    | |:----------- |:----------- | -| On select | Triggered when a start date and end date are selected. | +| On select | Triggers whenever a start date or end date is selected in the date range picker component. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -45,8 +45,8 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
    Variables
    |
    Description
    |
    How To Access
    | |:----------- |:----------- |:--------- | -| endDate | This variable holds the date of the endDate selected in the component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. | -| startDate | This variable holds the value assigned inside the `code` for the custom component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. | +| endDate | Holds the date selected as the end date in the component. | Accessible dynamically with JS (e.g., `{{components.daterangepicker1.endDate}}`). | +| startDate | Holds the date selected as the start date in the component. | Accessible dynamically with JS (e.g., `{{components.daterangepicker1.startDate}}`). |
    @@ -63,12 +63,12 @@ Under the General accordion, you can set the value in the string format.
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| 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. |
    diff --git a/docs/docs/widgets/datepicker.md b/docs/docs/widgets/datepicker.md index 2740da0915..5d1ca78de8 100644 --- a/docs/docs/widgets/datepicker.md +++ b/docs/docs/widgets/datepicker.md @@ -35,7 +35,7 @@ To add an event to a date-picker component, click on the component handle to ope |
    Event
    |
    Description
    | |:----------- |:----------- | -| On select | On select event is triggered when an date is selected. | +| On select | Triggers whenever the user selects a date. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -57,7 +57,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
    Variables
    |
    Description
    |
    How To Access
    | |:----------- |:----------- | :---------- | -| value | This variable holds the date selected on the component, the date value will be returned according to the format set in the Date Picker properties. | Access the value dynamically using JS: `{{components.datepicker1.value}}`.| +| value | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g.,`{{components.datepicker1.value}}`).|
    @@ -89,12 +89,12 @@ Under the General accordion, you can set the value in the string format.
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| 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. |
    diff --git a/docs/docs/widgets/divider.md b/docs/docs/widgets/divider.md index 8eeab1e6a8..ade7cd22a9 100644 --- a/docs/docs/widgets/divider.md +++ b/docs/docs/widgets/divider.md @@ -37,26 +37,23 @@ Under the General accordion, you can set the value in the string format. ## Layout -|
    Layout
    |
    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. | +| Layout | 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 -|
    Style
    |
    Description
    | -| ------------------------------------------- | ----------------------------------------------------------------------------------------------- | -| Divider Color | It is used to set the color of the divider. Use hex code to set the background color. | -| Visibility | This property is used to set the visibility of the divider. The property accepts Boolean value. | - -:::info -Any property having **fx** button next to its field can be **programmatically configured**. -::: +| Property | Description | Configuration Options | +|:---------- |:------------ |:-----------------------| +| Divider Color | Sets the color of the divider. | Select the color or click on **fx** and input code that programmatically returns a HEX color code. | +| 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. | +| Box Shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust related properties or set it programmatically using **fx**. |
    diff --git a/docs/docs/widgets/dropdown.md b/docs/docs/widgets/dropdown.md index 0882bb0ddc..4bcfc7bbea 100644 --- a/docs/docs/widgets/dropdown.md +++ b/docs/docs/widgets/dropdown.md @@ -4,118 +4,165 @@ title: Dropdown --- # Dropdown -The **Dropdown** component can be used to collect user input from a list of options. +The Dropdown component can be used to collect user input from a list of options. This document goes through all the properties related to the **Dropdown** component. -
    +:::info +To get the configuration of legacy Dropdown component, please refer to **[this](/docs/2.50.0-LTS/widgets/dropdown)** document. +::: -## Properties +## Data +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the field. | String (e.g., `Country`). | +| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `Choose an option`). | -|
    Property
    |
    Description
    | -|:----------- |:----------- | -| Label | Set the value of the label in the dropdown. The value can also be set dynamically using JavaScript. For example, set the Label value to `Select the {{components.text1.text}}` | -| Default value | Specify the default selected option in the dropdown | -| Option value | The option values correspond to the different options available in the dropdown. Dynamically set the option values based on your query, for example: `{{queries.datasource.data.map(item => item.value)}}` | -| Option labels | The option values correspond to the different options available in the dropdown. Dynamically set the option values based on your query, for example: `{{queries.datasource.data.map(item => item.value)}}` | -| Options loading state | Enable this property to display a loading state in the widget. By default, it is turned off. You can programmatically toggle it by setting the values to `{{true}}` or `{{false}}` using the `Fx` button | -| Default placeholder | Set a placeholder value that appears in the dropdown when no default option is selected or set | -| Advanced | The option labels represent the displayed labels for each value in the dropdown list. Dynamically set the option labels based on your query, for example: `{{queries.datasource.data.map(item => item.value)}}` | +## Options +Allows you to add options to the dropdown field. You can click on `Add new option` and add options manually or enable `Dynamic options` and enter the options using code. -For example: -```json -{{[ {label: 'One',value: 1,disable: false,visible: true},{label: 'Two',value: 2,disable: false,visible: true},{label: 'Three',value: 3,disable: false,visible: true} ]}} +### Example Code for Dynamic Columns + +1. Passing an array of objects and specifying each value: + +```js +{{ + [{label: 'option1', value: 1, disable: false, visible: true, default: true}, + {label: 'option2', value: 2, disable: false, visible: true}, + {label: 'option3', value: 3, disable: false, visible: true}] +}} ``` -Each object in the array should include the following key-value pairs: -|
    Key
    |
    Value
    | -|:--- |:----- | -| label | Option label | -| value | Option value | -| disable | Set to true to disable the option for selection, and false to keep it enabled | -| visible | Set to true to display the option in the dropdown list, and false to hide it | +2. Passing an array of objects with a default value from a **Table** component's selected row: -
    +```js +{{ + queries.getEmployees.data.map(option => ({ + label: option.firstname, + value: option.firstname, + disable: false, + visible: true, + default: option.firstname === components.table1.selectedRow.firstname + })) +}} +``` -
    +### Options loading state +Allows you to add a loading state to the dynamically generated options. You can enable or disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. ## Events -|
    Event
    |
    Description
    | -|:----------- |:----------- | -| On select | On select event is triggered when an option is selected | -| On search text changed | This event is triggered whenever the user searches through the options by typing on the dropdown's input box. The corresponding search text will be exposed as `searchText` | +**On select**
    +Triggers when an option is selected. -
    +**On search text changed**
    +Triggers when search text changes. -
    +**On focus**
    +Triggers whenever the user clicks inside the component. -## Component Specific Actions (CSA) +**On blur**
    +Triggers whenever the user clicks outside the component. -|
    Actions
    |
    Description
    |
    How To Access
    | -|:-------- |:----------- |:-------- | -| selectOption | You can set an option on the Dropdown component via a component-specific action within any event handler.| The option to employ a RunJS query to execute component-specific actions such as `await components.dropdown1.setOption(1)` | +## Component specific actions (CSA) -
    +Following actions of the component can be controlled using the component specific actions(CSA): -
    + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| clear() | Clears the selected option. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.setDisable(true)`) or trigger it using an event. | +| selectOption() | Selects an option. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.selectOption(2)`) or trigger it using an event. | + +**Note:** The data type passed to CSAs like `selectOption()` depends on how you configure the component. When adding options manually using the **Add new option** button, values must be strings (for example, `components.dropdown1.selectOption(['2'])`). When using dynamic options, supply values with the correct data types as they appear in your code logic. + +For example, if the code is: +```javascript +{{ + [ + { label: 'option1', value: 1, disable: false, visible: true, default: true }, + { label: 'option2', value: 2, disable: false, visible: true }, + { label: 'option3', value: 3, disable: false, visible: true } + ] +}} +``` + +You should pass numeric values in the `selectOptions` component-specific action since the value type is **Number**: + +```javascript +components.dropdown1.selectOption([2]) +``` ## Exposed Variables -|
    Variable
    |
    Description
    |
    How To Access
    | -|:-------- |:----------- |:--------- | -| Value | Holds the value of the currently selected item on the dropdown.| Value can be accesed using `{{components.dropdown1.value}}` | -| searchText | This variable is initially empty and will hold the value whenever the user searches on the dropdown. | searchText's value can be accesed using`{{components.dropdown1.searchText}}` | -| label | The variable label holds the label name of the dropdown. | label's value can be accesed using`{{components.dropdown1.searchText}}` | -| optionLabels | The optionLabels holds the option labels for the values of the dropdown. | optionLabels can be accesed using`{{components.dropdown1.optionLabels}}` for all the option labels in the array form or `{{components.dropdown1.optionLabels[0]}}` for particular option label | -| selectedOptionLabel | The variable holds the label of the selected option in the dropdown components. | The selected option label can be accessed dynamically using `{{components.dropdown1.selectedOptionLabel}}` | - -
    - -
    +|
    Variable
    |
    Description
    |
    How To Access
    | +|:----------|:----------|:------------| +| searchText | This variable is initially empty and holds the value whenever the user searches on the dropdown. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.searchText}}`). | +| label | Holds the label name of the dropdown. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.label}}`). | +| value | Holds the value selected by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.value}}`). | +| selectedOption | Holds the label and value of the selected option in array form. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.selectedOption.label}}` or
    `{{components.dropdown1.selectedOption.value}}`). | +| isValid | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isValid}}`). | +| options | Holds all the option values of the dropdown in array form. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.options}}` or
    `{{components.dropdown1.options[0].label}}` for a specific option). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isVisible}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isLoading}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isDisabled}}`). | +| isMandatory | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isMandatory}}`). | ## Validation -### Custom Validation +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no option is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.dropdown.value<5&&"Value needs to be more than 5"}}`). | -Add a validation for the options in Dropdown widget using the ternary operator. + +## 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 (e.g., `Enter your name here.` ). | + +
    + +## 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. |
    -
    +--- -## General -### Tooltip +## Label -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. +## Field -
    +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Accent | Sets the color of the border when the dropdown is opened. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Error text | Sets the text color of validation message that displays. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color | +| 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. | -
    -## Layout +## Container -|
    Layout
    |
    Description
    |
    Expected Value
    | -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. -
    - -
    - -## Styles - -|
    Style
    |
    Description
    | -|:--------------- |:----------------------------------------- | -| Border radius | Use this property to modify the border radius of the dropdown. The field expects only numerical value from `1` to `100`. By default, it's set to `0` | -| Visibility | This is to control the visibility of the widget. If `{{false}}` the widget will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}` | -| Selected text color | Change the text color of the selected option in the widget by providing the `HEX color code` or choosing the color from color picker| -| Disable | This property only accepts boolean values. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}` | -| Align text | You can align the text inside the widget in following ways: left, right, center, justified | - -:::info -Any property having `Fx` button next to its field can be **programmatically configured**. -::: - -
    \ No newline at end of file diff --git a/docs/docs/widgets/form.md b/docs/docs/widgets/form.md index 1f8a2e265b..5b31be33d0 100644 --- a/docs/docs/widgets/form.md +++ b/docs/docs/widgets/form.md @@ -75,94 +75,81 @@ To provide the form schema in JSON format, we'll pass a JavaScript object with * This **[list](/docs/widgets/form#custom-schema-examples)** provides examples of Custom Schema for all components that can be used in a Form component. -```js -{{ - { - title: '', // Provide title for Form - properties: { +```json +{{{ + "title": "", // Provide title for Form + "properties": { - }, // Provide schema of the components that will be inside the form - submitButton: { + }, // Provide schema of the components that will be inside the form + "submitButton": { - } // Provide schema of the submit button - } -}} + } // Provide schema of the submit button +}}} ``` Here's an example using the custom schema of **Text Input**, **Number Input** and **Dropdown** components: -```js +```json {{{ - "title":"Event Registration", - "properties":{ - "textinput1":{ - "type":"textinput", - "value":"", - "placeholder":"Enter Full Name", - "label":"Full Name", - "validation":{ - "maxLength":30, - "minLength":5 - }, - "styles":{ - "backgroundColor":"#00000000", - "borderRadius":5, - "borderColor":"#4299e1", - "errorTextColor":"#4299e1", - "disabled":false, - "visibility":"true", - "textColor":"#4299e1" - } + "title": "Event Registration", + "properties": { + "textinput1": { + "type": "textinput", + "value": "John", + "placeholder": "Enter First Name Here", + "label": "First Name", + "validation": { + "maxLength": 6 }, - "numberInput1":{ - "type":"number", - "styles":{ - "backgroundColor":"#f6f5ff", - "borderRadius":5, - "textColor":"#4299e1", - "borderColor":"#4299e1", - "disabled":false, - "visibility":"true" - }, - "value":22, - "maxValue":100, - "minValue":14, - "placeholder":"Enter your age", - "label":"Age" + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "borderColor": "black", + "errorTextColor": "#025aa3", + "disabled": false, + "visibility": true, + "textColor": "#025aa3" + } + }, + "numberInput1": { + "type": "number", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "textColor": "#025aa3", + "borderColor": "black", + "disabled": false, + "visibility": "true" }, - "dropdown1":{ - "type":"dropdown", - "values":[ - 1, - 2, - 3 - ], - "displayValues":[ - "Male", - "Female", - "Perfer not to Answer" - ], - "loading":false, - "value":3, - "label":"Gender", - "styles":{ - "disabled":false, - "visibility":"true", - "borderRadius":5, - "borderColor":"#4299e1", - "justifyContent":"center" - } + "value": 22, + "maxValue": 100, + "minValue": 14, + "placeholder": "Enter Your Age", + "label": "Age" + }, + "dropdown1": { + "type": "dropdown", + "displayValues": ["Male", "Female", "Prefer not to Answer"], + "values": [1, 2, 3], + "loading": false, + "value": "1", + "label": "Gender", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5, + "justifyContent": "start" } - }, - "submitButton":{ - "value":"Submit", - "styles":{ - "backgroundColor":"#3A433B", - "borderColor":"#595959" - } - } -} -}} + } + }, + "submitButton": { + "value": "Submit", + "styles": { + "backgroundColor": "#3A433B", + "borderColor": "#595959" + } + } +}}} ``` @@ -248,20 +235,20 @@ A Tooltip is often used to specify the extra information when the user hovers th Properties that can be used in Datepicker schema are: -```js -datepicker1: { - type: 'datepicker', - styles: { - borderRadius: 5, - disabled: false, - visibility: 'true' +```json + "datepicker1": { + "type": "datepicker", + "styles": { + "borderRadius": 5, + "disabled": false, + "visibility": "true" }, - value: '09/09/2023', - disabledDates: ['08/09/2023'], - enableTime: true, - format: 'DD/MM/YYYY', - label: 'Select a date' -} + "value": "09/09/2023", + "disabledDates": ["08/09/2023"], + "enableTime": true, + "format": "DD/MM/YYYY", + "label": "Select a Date" + } ``` |
    Key
    |
    Description
    |
    Expected Value
    | @@ -285,22 +272,22 @@ datepicker1: { **Properties** -```js -numberInput1: { - type: 'number', - styles: { - backgroundColor: '#f6f5ff', - borderRadius: 20, - textColor: 'red', - borderColor: 'blue', - disabled: false, - visibility: 'true' - }, - value: 10, - maxValue: 12, - minValue: 6, - placeholder: 'test', - label: 'Number Input' +```json +"numberInput1": { + "type": "number", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 3, + "textColor": "#025aa3", + "borderColor": "blue", + "disabled": false, + "visibility": "true" + }, + "value": 10, + "maxValue": 12, + "minValue": 6, + "placeholder": "Enter a Number", + "label": "Number Input" } ``` @@ -328,22 +315,22 @@ numberInput1: { **Properties** -```js -passwordInput1: { - type: 'password', - styles: { - backgroundColor: '#f6f5ff', - borderRadius: 10, - disabled: false, - visibility: 'true' - }, - validation: { - maxLength: 9, - minLength: 5, - regex: `'^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$'` - }, - placeholder: 'Enter a password', - label: '' +```json +"passwordInput1": { + "type": "password", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "disabled": false, + "visibility": "true" + }, + "validation": { + "maxLength": 9, + "minLength": 5, + "regex": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$" + }, + "placeholder": "Enter Password", + "label": "Password" } ``` @@ -370,17 +357,17 @@ passwordInput1: { **Properties** -```js -checkbox1: { - type: 'checkbox', - styles: { - checkboxColor: 'red', - disabled: false, - textColor: 'red', - visibility: 'true' - }, - value: false, - label: 'Checkbox' +```json +"checkbox1": { + "type": "checkbox", + "styles": { + "checkboxColor": "#025aa3", + "disabled": false, + "textColor": "#025aa3", + "visibility": "true" + }, + "value": false, + "label": "Checkbox" } ``` @@ -403,17 +390,17 @@ checkbox1: { **Properties** -```js -toggleswitch1: { - type: 'toggle', - styles: { - textColor: 'blue', - disabled: false, - visibility: 'true', - toggleSwitchColor: 'red' - }, - value: true, - label: 'Toggle switch' +```json +"toggleswitch1": { + "type": "toggle", + "styles": { + "textColor": "#025aa3", + "disabled": false, + "visibility": "true", + "toggleSwitchColor": "#025aa3" + }, + "value": true, + "label": "Toggle switch" } ``` @@ -436,17 +423,17 @@ toggleswitch1: { **Properties** -```js -textArea1: { - type: 'textarea', - styles: { - disabled: false, - visibility: 'true', - borderRadius: 20 - }, - value: 'This is a text area', - placeholder: 'Enter text here', - label: 'Text Area' +```json +"textArea1": { + "type": "textarea", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5 + }, + "value": "This is a text area", + "placeholder": "Enter Text Here", + "label": "Text Area" } ``` @@ -469,18 +456,18 @@ textArea1: { **Properties** -```js -daterangepicker1: { - type: 'daterangepicker', - styles: { - disabled: true, - visibility: 'true', - borderRadius: 5 - }, - defaultEndDate: '12/04/2022', - defaultStartDate: '1/04/2022', - format: 'DD/MM/YYYY', - label: 'Select a date range' +```json +"daterangepicker1": { + "type": "daterangepicker", + "styles": { + "disabled": true, + "visibility": "true", + "borderRadius": 5 + }, + "defaultEndDate": "12/04/2022", + "defaultStartDate": "1/04/2022", + "format": "DD/MM/YYYY", + "label": "Select a Date Range" } ``` @@ -504,19 +491,19 @@ daterangepicker1: { **Properties** -```js -multiselect1: { - type: 'multiselect', - styles: { - disabled: false, - visibility: 'true', - borderRadius: 5 - }, - displayValues: ["one", "two", "three"], - label: 'Select options of your choice', - value: [2, 3], - values: [1, 2, 3], - showAllOption: true +```json +"multiselect1": { + "type": "multiselect", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5 + }, + "displayValues": ["one", "two", "three"], + "label": "Select Options of Your Choice", + "value": [2, 3], + "values": [1, 2, 3], + "showAllOption": true } ``` @@ -541,20 +528,20 @@ multiselect1: { **Properties** -```js -starRating1: { - type: 'starrating', - styles: { - disabled: false, - visibility: 'true', - textColor: 'yellow', - labelColor: 'red' - }, - allowHalfStar: true, - defaultSelected: 4.5, - maxRating: 10, - tooltips: ['one', 'two', 'three', 'four'], - label: 'Select a rating' +```json +"starRating1": { + "type": "starrating", + "styles": { + "disabled": false, + "visibility": "true", + "textColor": "gold", + "labelColor": "#025aa3" + }, + "allowHalfStar": true, + "defaultSelected": 3.5, + "maxRating": 5, + "tooltips": ["one", "two", "three", "four"], + "label": "Select a Rating" } ``` @@ -580,22 +567,22 @@ starRating1: { **Properties** -```js -filepicker1: { - type: 'filepicker', - styles: { - visibility: 'true', - borderRadius: 10 - }, - enableMultiple: true, - fileType: '*/*', - instructionText: 'Click here to select files', - maxFileCount: 5, - maxSize: 6000000, - minSize: 25, - parseContent: true, - parseFileType: 'csv', - label: 'Select a file' +```json +"filepicker1": { + "type": "filepicker", + "styles": { + "visibility": "true", + "borderRadius": 10 + }, + "enableMultiple": true, + "fileType": "*/*", + "instructionText": "Click here to select files", + "maxFileCount": 5, + "maxSize": 6000000, + "minSize": 25, + "parseContent": true, + "parseFileType": "csv", + "label": "Select a File" } ``` @@ -623,23 +610,23 @@ filepicker1: { **Properties** -```js -textinput1: { - type: 'textinput', - value: 'Random text', - placeholder: 'enter first name here', - label: 'First name', - validation: { - maxLength: 6 - }, - styles: { - backgroundColor: 'red', - borderRadius: 20, - errorTextColor: 'green', - disabled: false, - visibility: false, - textColor: 'yellow' - } +```json +"textinput1": { + "type": "textinput", + "value": "John", + "placeholder": "Enter the Name Here", + "label": "First Name", + "validation": { + "maxLength": 6 + }, + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "errorTextColor": "#025aa3", + "disabled": false, + "visibility": false, + "textColor": "#025aa3" + } } ``` @@ -667,20 +654,20 @@ textinput1: { **Properties** -```js -dropdown1: { - type: 'dropdown', - displayValues: [1, 2, 3], - values: ['one', 'two', 'three'], - loading: false, - value: 'two', - label: 'Select a number', - styles: { - disabled: false, - visibility: 'true', - borderRadius: 5, - justifyContent: 'end' - } +```json +"dropdown1": { + "type": "dropdown", + "displayValues": ["One", "Two", "Three"], + "values": [1, 2, 3], + "loading": false, + "value": 2, + "label": "Select a Number", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5, + "justifyContent": "start" + } } ``` @@ -706,20 +693,20 @@ dropdown1: { **Properties** -```js -button1: { - type: 'button', - value: 'Submit', - label: '', - styles: { - backgroundColor: 'blue', - textColor: 'white', - borderRadius: 5, - borderColor: 'black', - loaderColor: 'gray', - visibility: 'true', - disabled: true - } +```json +"button1": { + "type": "button", + "value": "Submit", + "label": "", + "styles": { + "backgroundColor": "#3A433B", + "textColor": "white", + "borderRadius": 5, + "borderColor": "#595959", + "loaderColor": "gray", + "visibility": "true", + "disabled": true + } } ``` @@ -745,17 +732,17 @@ button1: { **Properties** -```js -text1: { - type: 'text', - value: 'This is a text component', - label: '', - styles: { - backgroundColor: '#f6f5ff', - textColor: 'red', - fontSize: 24, - fontWeight: 30 - } +```json +"text1": { + "type": "text", + "value": "This is a text component", + "label": "", + "styles": { + "backgroundColor": "#f6f5ff", + "textColor": "#025aa3", + "fontSize": 12, + "fontWeight": 500 + } } ``` @@ -778,18 +765,18 @@ text1: { **Properties** -```js -radioButton1: { - type: 'radio', - styles: { - textColor: 'black', - disabled: false, - visibility: 'true' - }, - displayValues: ['option 1', 'option 2', 'option 3'], - label: 'Radio Buttons', - value: 2, - values: [1, 2, 3] +```json +"radioButton1": { + "type": "radio", + "styles": { + "textColor": "black", + "disabled": false, + "visibility": "true" + }, + "displayValues": ["Yes", "No"], + "label": "Radio Buttons", + "value": 1, + "values": [1, 2] } ``` @@ -805,4 +792,4 @@ radioButton1: { | value | Specifies the default selected value of the radio button. | Any value from the `values` array, like 2 | | values | Specifies the values in an array. | Array of values like `[1, 2, 3]` | -
    \ No newline at end of file +
    diff --git a/docs/docs/widgets/icon.md b/docs/docs/widgets/icon.md index 1699f9cfd5..fff35ba105 100644 --- a/docs/docs/widgets/icon.md +++ b/docs/docs/widgets/icon.md @@ -38,10 +38,10 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai Following actions of the component can be controlled using the component specific actions(CSA): -|
    Actions
    |
    Description
    |
    How To Access
    | -| :-------------------------------------------- | :------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------- | -| setVisibility | You can toggle the visibility of the Icon component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.icon1.setVisibility(false)`. | -| click | You can trigger the click action on Icon component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.icon1.click()`. | +|
    Actions
    |
    Description
    |
    How To Access
    | +| :-------------------------------------------- | :------------------------------------------------- | :--------------------------------------------------- | +| setVisibility() | Sets the visibility of the component. | Employ a RunJS query (for e.g., `await components.icon1.setVisibility(false)`) or trigger it using an event. | +| click() | Regulate the click on the icon. | Employ a RunJS query (for e.g., `await components.icon1.click()`) or trigger it using an event. |
    @@ -63,12 +63,12 @@ There are currently no exposed variables for the component.
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | | :------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| 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. |
    diff --git a/docs/docs/widgets/listview.md b/docs/docs/widgets/listview.md index 7ef6afa4c9..8e58eb1fff 100644 --- a/docs/docs/widgets/listview.md +++ b/docs/docs/widgets/listview.md @@ -11,7 +11,7 @@ The **List View** component allows to create a list of repeatable rows of data. Certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the List View component using drag-and-drop functionality. ::: -
    +
    ## Setting List Data @@ -41,7 +41,7 @@ Similarly, for an Image component inside List View, you can use the below code t
    -
    +
    ## Properties @@ -57,7 +57,7 @@ Similarly, for an Image component inside List View, you can use the below code t
    -
    +
    ## Events @@ -92,7 +92,7 @@ To get detailed information about all the **Actions**, please consult the [Actio
    -
    +
    ## Component Specific Actions (CSA) @@ -100,7 +100,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
    -
    +
    ## Exposed Variables @@ -115,7 +115,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
    -
    +
    ## General ### Tooltip @@ -126,18 +126,20 @@ Under the General accordion, you can set the value in the string format.
    -
    +
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| 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 @@ -150,12 +152,12 @@ Under the General accordion, you can set the value in the string format. | Border radius | Use this property to modify the border radius of the list view. The field expects only numerical value from `1` to `100`, default is `0`. | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. :::
    -
    +
    ## Example: Displaying Data in the List View @@ -202,13 +204,13 @@ Use `{{listItem.key}}` to display data on the nested components. Example: For di
    -
    +
    ## Controlling Child Components All the child components of the List View component are exposed through the `children` variable. This variable is an array of objects, where each object represents a record in the listview and contains the data of the child components. -The components inside the list view can be controlled using the javascipt queries. For example, if you want to disable the `button1` component in the first record, you can use the following expression: +The components inside the list view can be controlled using the javascript queries. For example, if you want to disable the `button1` component in the first record, you can use the following expression: ```js components.listview1.children[0].button1.disable(true) // disables the button1 component in the first record @@ -220,4 +222,4 @@ components.listview1.children[0].button1.disable(true) // disables the button1 c Currently, only those child components can be controlled using the javascript queries that have component specific actions implemented. To check if a component has component specific actions implemented, refer to the document of that **[specific component](/docs/widgets/overview)**. ::: -
    \ No newline at end of file +
    diff --git a/docs/docs/widgets/multiselect.md b/docs/docs/widgets/multiselect.md index 2c8bb81da0..b2d576555e 100644 --- a/docs/docs/widgets/multiselect.md +++ b/docs/docs/widgets/multiselect.md @@ -4,110 +4,159 @@ title: Multiselect --- # Multiselect -The **Multiselect** widget can be used to collect multiple user inputs from a list of options. +The Multiselect component enables users to select multiple options from a predefined list, making it ideal for gathering multiple inputs. -
    +## Data -## Properties +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the component. | String (e.g., `Select an option`). | +| Placeholder | Text to display when none of the options are selected. | String (e.g., `Select the loan type`). | -|
    Property
    |
    Description
    | -|:----------- |:----------- | -| Label | The text is to be used as the label for the Multiselect widget. | -| Default value | The value of the default option. This should always be an array. | -| Option values | Values for different items/options in the list of the multiselect. | -| Option labels | Labels for different items/options in the list of the multiselect. | -
    +## Options +Allows you to add options to the multiselect component field. You can click on `Add new option` and add options manually or enable `Dynamic options` and enter the options using code. -
    +### Example Code for Dynamic Columns + +1. Passing an array of objects and specifying each value: + +```js +{{ + [{label: 'option1', value: 1, disable: false, visible: true, default: true}, + {label: 'option2', value: 2, disable: false, visible: true}, + {label: 'option3', value: 3, disable: false, visible: true}] +}} +``` + +2. Passing an array of objects with a default value from a **Table** component's selected row: + +```js +{{ + queries.getEmployees.data.map(option => ({ + label: option.firstname, + value: option.firstname, + disable: false, + visible: true, + default: option.firstname === components.table1.selectedRow.firstname + })) +}} +``` + +### Options loading state +Allows you to add a loading state to the dynamically generated options. You can enable or disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. + +## Component specific actions (CSA) + +Following actions of the component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| clear() | Clears the selected option. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.setDisable(true)`) or trigger it using an event. | +| selectOptions() | Selects an option. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.selectOptions(['2','3'])`) or trigger it using an event. | +| deselectOptions() | Deselects all options. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.deselectOptions()`) or trigger it using an event. | + +**Note:** The data type passed to CSAs like `selectOptions()` depends on how you configure the component. When adding options manually using the **Add new option** button, values must be strings (for example, `components.multiselect1.selectOptions(['2', '3'])`). When using dynamic options, supply values with the correct data types as they appear in your code logic. + +For example, if the code is: +```javascript +{{ + [ + { label: 'option1', value: 1, disable: false, visible: true, default: true }, + { label: 'option2', value: 2, disable: false, visible: true }, + { label: 'option3', value: 3, disable: false, visible: true } + ] +}} +``` + +You should pass numeric values in the `selectOptions` component-specific action since the value type is **Number**: + +```javascript +components.multiselect1.selectOptions([2, 3]) +``` + +## Exposed Variables + +|
    Variable
    |
    Description
    |
    How To Access
    | +|:----------|:----------|:------------| +| label | Holds the label name of the multiselect component. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.label}}`). | +| value | Holds the value selected by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.value}}`). | +| options | Holds all the option values of the multiselect component in array form. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.options}}` or
    `{{components.multiselect1.options[0].label}}` for a specific option). | +| isValid | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isValid}}`). | +| isMandatory | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isMandatory}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isLoading}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isVisible}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isDisabled}}`). | ## Events |
    Event
    |
    Description
    | |:----------------- | :--------------------------------------------- | | On select | The **On select** event is triggered when a particular option is chosen. | -| On search text changed | This event is triggered when a user modifies the search text on the Multiselect component. This event also updates the value of the `searchText` **[exposed variable](#exposed-variables)**. | :::info For comprehensive information on all available **Actions**, refer to the [Action Reference](/docs/category/actions-reference) documentation. ::: -
    +## Validation -
    +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no option is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{!components.multiselect1.value && "Please select an option"}}`). | -## Component Specific Actions (CSA) -`await components.multiselect1.clearSelections()`
    -`await components.multiselect1.deselectOption(2)` +## Additional Actions -Following actions of Multiselect component can be controlled using the component specific actions(CSA): +|
    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 (e.g., `Select an option.` ). | -|
    Actions
    |
    Description
    |
    How To Access
    | -|:----------- |:----------- |:-------- | -| selectOption | Select an option on the Multiselect component via a component-specific action within any event handler.| Employ a RunJS query to execute component-specific actions such as `await components.multiselect1.selectOption(3)` | -| deselectOption | Deselect a selected option on the Multiselect component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.multiselect1.deselectOption(3)` | -| clearOptions | Clear all the selected options from the Multiselect component via a component-specific action within any event handler. |Employ a RunJS query to execute component-specific actions such as `await components.multiselect1.clearSelections(2,3)` | +
    + +## 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. |
    -
    +--- -## Exposed Variables +## Label -|
    Variables
    |
    Description
    |
    How To Access
    | -|:----------- |:----------- |:----------| -| values | This variable holds the values of the Multiselect component in an array of objects where the objects are the options in the multiselect.| Access the value dynamically using JS: `{{components.multiselect1.values[1]}}` | -| searchText | This variable stores the user-entered search text in the Multiselect component. | The value of this variable is updated with each character entered in the search field | +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | -
    +## Field -
    +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Accent | Sets the color of the border when the dropdown is opened. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Error text | Sets the text color of validation message that displays. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color | +| 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. | + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. -## General -### Tooltip -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. - -Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. - -
    - -
    - -## Layout - -|
    Layout
    |
    Description
    |
    Expected Value
    | -|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | - -
    - -
    - -## Styles - -|
    Style
    |
    Description
    | -|:----------- |:----------- | -| Border radius | Add a border radius to the multiselect using this property. It accepts any numerical value from `0` to `100`. | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | -| Disable | This is `off` by default, toggle `on` the switch to lock the widget and make it non-functional. You can also programmatically set the value by clicking on the `Fx` button next to it. If set to `{{true}}`, the widget will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | - -
    - -
    - -## Actions - -|
    Action
    |
    Description
    |
    Properties
    | -|:----------- |:----------- |:------------------ | -| `selectOption` | Select options. | pass options as parameter. ex: `components.multiselect1.selectOption(1)` | -| `deselectOption` | Deselect options.| pass options as parameter. ex: `components.multiselect1.deselectOption(1)` | -| `clearSelections` | Clear all selection. | ex: `components.multiselect1.clearSelections()` | -:::info -Any property having `Fx` button next to its field can be **programmatically configured**. -::: -
    \ No newline at end of file diff --git a/docs/docs/widgets/overview.md b/docs/docs/widgets/overview.md index e87f15bf06..83e8375321 100644 --- a/docs/docs/widgets/overview.md +++ b/docs/docs/widgets/overview.md @@ -132,7 +132,7 @@ Any arbitrary JavaScript code can be written inside **`{{}}`**: ``` :::tip -Check out the How-to guides like **[changing color of text in table column](/docs/how-to/access-cellvalue-rowdata)**, **[Enable/Disable a component using JavaScript](/docs/how-to/access-currentuser)**, and **[more](/docs/category/how-to)**. +Check out the How-to guides like **[changing color of text in table column](/docs/how-to/access-cellvalue-rowdata)**, **[Enable/Disable a component using JavaScript](/docs/how-to/access-currentuser)**, and more. :::
    \ No newline at end of file diff --git a/docs/docs/widgets/pdf.md b/docs/docs/widgets/pdf.md index 0acaf9be61..05dfb0aac4 100644 --- a/docs/docs/widgets/pdf.md +++ b/docs/docs/widgets/pdf.md @@ -78,9 +78,9 @@ To display instructional text when a user hovers over the PDF component, add som ## Styles -|
    Style
    |
    Description
    |
    Default Value
    | -| :------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------- | -| Visibility | Toggle the `Visibility` condition on or off to control the visibility of the component. You can also programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | +|
    Property
    |
    Description
    |
    Configuration Options
    | +| :------------------------------------------ | :--------------------------------------------------- | :-------------------------------------------------- | +| 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. | :::info Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how to display images/PDFs using base64 string. diff --git a/docs/docs/widgets/radio-button.md b/docs/docs/widgets/radio-button.md index 32a29b93b0..85aff41d6b 100644 --- a/docs/docs/widgets/radio-button.md +++ b/docs/docs/widgets/radio-button.md @@ -3,71 +3,130 @@ id: radio-button title: Radio Button --- -# Radio Button +The **Radio button** component can be used to collect user input from a list of options. -The **Radio Button** component can be used to select one option from a group of options. +## Data -:::tip -Radio Buttons are preferred when the list of options is less than six, and all the options can be displayed at once. -::: +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the component. | String (e.g., `Select an option`). | -:::info -For more than six options, consider using **[Dropdown](/docs/widgets/dropdown)** component. -::: +## Options +Allows you to add options to the radio button field. You can click on `Add new option` and add options manually or enable `Dynamic options` and enter the options using code. -## Properties +### Example Code for Dynamic Columns -|
    Property
    |
    Description
    | -| :--------------------------------------------- | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Label | The text is to be used as the label for the radio button. This field expects a `String` value. | -| Default value | The value of the default option. | -| Option values | List of values for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.value)}}` or populate it with sample values `{{[true, false]}}`. | -| Option labels | List of labels for different items/options. Refer your query data with dynamic variables `{{queries.datasource.data.map(item => item.label)}}` or populate it with sample values `{{["yes", "no"]}}`. | +1. Passing an array of objects and specifying each value: -## Event +```js +{{ + [{label: 'option1', value: 1, disable: false, visible: true, default: true}, + {label: 'option2', value: 2, disable: false, visible: true}, + {label: 'option3', value: 3, disable: false, visible: true}] +}} +``` -|
    Event
    |
    Description
    | -| :------------------------------------------ | :------------------------------------------------ | -| On select | Triggers whenever the user clicks an option. | +2. Passing an array of objects with a default value from a **Table** component's selected row: -:::info -Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. -::: +```js +{{ + queries.getEmployees.data.map(option => ({ + label: option.firstname, + value: option.firstname, + disable: false, + visible: true, + default: option.firstname === components.table1.selectedRow.firstname + })) +}} +``` -## Component Specific Actions (CSA) +### Options loading state +Allows you to add a loading state to the dynamically generated options. You can enable or disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. -The following actions of the component can be controlled using component specific actions(CSA): +## Component specific actions (CSA) -|
    Actions
    |
    Description
    |
    How To Access
    | -| :-------------------------------------------- | :------------------------------------------------------------------------------------------------ | :---------------------------------------------------------------------------------------------------------------------- | -| selectOption | Select an option from the radio buttons via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `await components.radiobutton1.selectOption('one')` | +Following actions of the component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| clear() | Clears the selected option. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.setDisable(true)`) or trigger it using an event. | +| selectOption() | Selects an option. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.selectOption(2)`) or trigger it using an event. | +| deselectOption() | Deselects the selected option. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.deselectOption()`) or trigger it using an event. | ## Exposed Variables -There are currently no exposed variables for the component. +|
    Variable
    |
    Description
    |
    How To Access
    | +|:----------|:----------|:------------| +| label | Holds the label name of the radio button. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.label}}`). | +| value | Holds the value selected by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.value}}`). | +| options | Holds all the option values of the radio button in array form. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.options}}` or
    `{{components.radiobutton1.options[0].label}}` for a specific option). | +| isValid | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isValid}}`). | +| isMandatory | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isMandatory}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isLoading}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isVisible}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isDisabled}}`). | -## General +## Events -### Tooltip +|
    Event
    |
    Description
    | +|:----------------- | :--------------------------------------------- | +| On select | The **On select** event is triggered when a particular option is chosen. | -A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. +:::info +For comprehensive information on all available **Actions**, refer to the [Action Reference](/docs/category/actions-reference) documentation. +::: -Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. +## Validation -## Layout +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no option is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{!components.radiobutton1.value && "Please select an option"}}`). | -|
    Layout
    |
    Description
    |
    Expected Value
    | -| :------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +## 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 (e.g., `Select an option.` ). | + +
    + +## 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. | + +
    --- -## Styles +## Label -|
    Style
    |
    Description
    |
    Default Value
    | -| :------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------- | -| Text color | Change the color of the text in the component by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | -| Active color | Change the color of active radio button by providing the `Hex color code` or by choosing the color of your choice from the color picker. | | -| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}` | -| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | + +## Switch + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Border | Sets the border color of the checkboxes. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Checked background | Sets the color of the selected checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Unchecked background | Sets the color of the unselected checkboxes. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Handle color | Sets the fill color of the selected checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the colors of the option labels. | Enable the icon visibility, select icon and icon color | + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. diff --git a/docs/docs/widgets/rich-text-editor.md b/docs/docs/widgets/rich-text-editor.md index 9ec312159b..923eb67d1e 100644 --- a/docs/docs/widgets/rich-text-editor.md +++ b/docs/docs/widgets/rich-text-editor.md @@ -13,8 +13,12 @@ The **Text Editor** component is used to enter and edit text in HTML format. It | **Property** | **Description** | **Expected Value** | |:-----------|:-----------|:-----------| -| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `John Doe`). | -| Default Value | The default value that the component will hold when the app is loaded. | String (e.g., `Default Text`). | +| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `John Doe`)
    HTML(e.g., `

    John Doe

    `) | +| Default Value | The default value that the component will hold when the app is loaded. | String (e.g., `Default Text`)
    HTML (e,g., `

    Hello, ToolJet!

    `).| + +### HTML Support +The Placeholder and Default Value property also supports HTML content allowing the use of headings, paragraphs, bold text, and other HTML elements within the text editor. +
    @@ -22,7 +26,14 @@ The **Text Editor** component is used to enter and edit text in HTML format. It ## Component Specific Actions (CSA) -There are currently no Component-Specific Actions (CSA) implemented to regulate or control the component. +Following actions of Button component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------| +| setValue() | Sets the value of the text editor. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setValue(

    Hello ToolJet!

    )`) or trigger it using an event.| +| setVisibility() | Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setDisable(true)`) or trigger it using an event. |
    @@ -33,6 +44,19 @@ There are currently no Component-Specific Actions (CSA) implemented to regulate | **Variable** | **Description** | **How To Access** | |:-----------|:-----------|:-----------| | value | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g.,`{{components.richtexteditor1.value}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (e.g., `{{components.richtexteditor1.isLoading}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (e.g., `{{components.richtexteditor1.isVisible}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (e.g., `{{components.richtexteditor1.isDisabled}}`). | + +
    + +
    + +## 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. |
    diff --git a/docs/docs/widgets/table.md b/docs/docs/widgets/table.md deleted file mode 100644 index e17e584d16..0000000000 --- a/docs/docs/widgets/table.md +++ /dev/null @@ -1,596 +0,0 @@ ---- -id: table -title: Table ---- -# Table - -Tables can be used for both displaying and editing data. You can use the table component to display data from a database or API. You can also use the table component to edit data and save it back to the database or API. - -## Table UI - -### Filter Data - -The table data can be filtered using the Filter data option on its top-left. You have the option to choose from various filters, such as: - -- **contains** -- **does not contain** -- **matches** -- **does not match** -- **equals** -- **does not equal** -- **is empty** -- **is not empty** -- **greater than** -- **greater than or equal to** -- **less than** -- **less than or equal to** - -You also have the option to **[hide the filter button](/docs/widgets/table#show-filter-button)** in the table properties. - -### Search - -At the top-right corner of the table component, there is a search box that allows users to input keywords and search for rows within the table data. You can also **[show/hide the search box](/docs/widgets/table#show-search-box)** from the table from the table properties. - -:::tip -You can use the `Tab` key to navigate through cells on the table. -::: - -### Pagination - -The table component supports both **[client-side pagination](/docs/widgets/table#client-side-pagination)** and **[server-side pagination](/docs/widgets/table#server-side-pagination)**. The `<<` and `>>` button skips to the first and last page respectively. The `<` and `>` button takes the user to the previous and next page respectively. You can also **[hide the pagination buttons](/docs/widgets/table#show-pagination-buttons)** in the table properties. - -### Add New Rows - -Upon clicking this button, a popup modal will show, providing users with the ability to insert new rows. Initially, the modal will contain a single row, with columns mirroring those found in the table. If users input data into this row, it will be stored within the **[`newRows` variable](/docs/widgets/table#exposed-variables)** associated with the table. Clicking on the **Discard** button will clear the data within this variable. However, if the users close the popup without any action (neither saving nor discarding), the data will persist, accompanied by a green indicator on the **Add new row** button. The table incorporates an **[Add new rows event handler](/docs//widgets/table#add-new-rows)**, which can be employed to execute queries that store the data into the data source upon clicking the **Save** button. - -:::info -At present, it is not possible to include columns of type Image when adding a new row to the table. -::: - - -### Download - -The table data can be downloaded in various file formats, including: - -- **CSV** -- **Excel** -- **PDF** - -The name of the downloaded file will be in the following format:
    -`Tablename_DD-MM-YYYY_HH-mm.filetype`

    -Example: Customers_25-03-2022_16-10.csv - -You have the option to **[hide the download button](/docs/widgets/table#show-download-button)** in the table properties. - -:::tip -You can utilize **[Component Specific Actions](#component-specific-actions-csa)** to retrieve the table data in the mentioned formats from the event handlers across the application. -::: - -### Hide Columns - -You can choose which columns to show or hide in the table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table#show-column-selector-button)** in the table properties. - -### Sorting - -You can sort the table data in ascending or descending order by clicking on the column header. You can also **[disable the sorting](/docs/widgets/table#disable-sorting)** from the table properties. - -## Table Data - -To populate the table with the data, it is required to provide the data in the form of an array of objects. You can utilize data from queries, using `{{queries.restapi1.data}}`, to populate table. - -Example: -```js -{{[{ id: 1, name: 'Sarah', email: 'sarah@example.com'}]}} -``` - -The table also supports the loading of one level of **nested data**. Here is an example of the data structure: - -```js -[ - { - "id":1, - "student":{ - "name":"Anakin Skywalker", - "saber":"blue" - }, - "teacher":{ - "name":"Obi wan Kenobi", - "saber":"blue" - } - }, - { - "id":2, - "student":{ - "name":"Kevin", - "saber":"blue" - }, - "teacher":{ - "name":"Joe", - "saber":"blue" - } - }, - { - "id":3, - "student":{ - "name":"Alex", - "saber":"blue" - }, - "teacher":{ - "name":"Noah", - "saber":"blue" - } - } -] -``` -
    - -The table component will **automatically generate all the required columns** when the data is provided in the form of an array of objects. - -## Columns - -Whenever data is loaded into a table, the columns are automatically generated. You can add, remove, or modify columns by accessing the table properties under the column section. You can also rearrange the columns by dragging and dropping them. - -### Use Dynamic Column - -Enabling the **Use dynamic column** toggle will allow users to set the **Column data** using which the user can link the column data dynamically from a query. - -The **column data** field expects a JSON value: -```json -{ - "name":"Name", - "columnType":"string", - "key":"first_name", - "cellBackgroundColor":"#000", - "textColor":"#fff", - "isEditable":true, - "regex":"", - "maxLength":10, - "minLength":5, - "customRule":"" -} -``` - -### Types of Columns - -The table component supports the following column types: - -- [String | Default](#string--default) -- [Number](#number) -- [Badge](#badge) -- [Multiple Badges](#multiple-badges) -- [Tags](#tags) -- [Dropdown](#dropdown) -- [Radio](#radio) -- [Multiselect](#multiselect) -- [Toggle switch](#toggle-switch) -- [Date Picker](#date-picker) -- [Image](#image) -- [Link](#link) - -#### String | Default - -This column type is automatically selected by default when a column is added or when data is populated in the table. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Overflow | Manage the handling of content that exceeds the cell dimensions. `Wrap` wraps the content onto the next line within the cell, `Scroll` enables scrolling for content that exceeds the cell, and `Hide` conceals content that goes beyond the cell boundary. | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Text color | Modify the color of the text in the column. You can use a hex color code or color name. The value can be dynamically assigned using JS. Refer to the [how-to guide](/docs/how-to/access-cellvalue-rowdata). | -| Cell background color | Adjust the background color of the cell in the column. You can utilize a hex color code or color name. The value can be dynamically assigned using JS. | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Number - -Selecting the column type as **Number** will only load numerical data in the column cells. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. | -| Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Badge - -The **Badge** column type is utilized to exhibit labels on the columns using the column data. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Values | Provide the values for the badge as an array | -| Labels | Provide the labels for the values in the badge as an array | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Multiple Badges - -Similar to the **Badge** column type, the **Multiple Badges** type is used to display multiple badges within a column cell. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Values | Provide the values for the multiple badges as an array | -| Labels | Provide the labels for the values in the multiple badges as an array | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Tags - -The **Tags** column type is utilized to display tags within the column cells using the column data. The provided **key** should have values in an array format. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Dropdown - -The **Dropdown** column type is used to display a dropdown in the column cells using the column data. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Values | Provide the values for the dropdown as an array | -| Labels | Provide the labels for the values in the dropdown as an array | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Radio - -The **Radio** column type is used to show radio buttons in the column cells using the column data. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Values | Provide the values for the radio as an array | -| Labels | Provide the labels for the values in the radio as an array | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Multiselect - -The **Multiselect** column type is used to show a multiselect dropdown in the column cells using the column data. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Values | Provide the values for the multiselect as an array | -| Labels | Provide the labels for the values in the multiselect as an array | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Toggle Switch - -The **Toggle Switch** column type is used to display a toggle switch in the column cells using the column data. The provided **key** should be a boolean value, either true or false. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. If no key is provided, the `Column name` is used as the key for that column. | -| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. You can use JavaScript code to dynamically generate a value. For instance, to round off a value, you can use
    `{{cellValue > 4.5 ? 5 : 4}}`. || Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Active color | Set the color of the toggle switch when it is active using this property. | -| + Add Event Handler | Add an event handler to perform actions whenever the toggle switch is turned on or off. | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Date Picker - -The **Date Picker** column type is used to display a date picker in the column cells using the column data. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. The provided **key** should hold a date value. | -| Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Date Display Format | Determines how the date should be displayed in the table | -| Date Parse Format | Specifies the format in which the date is stored in the database. | -| Parse in timezone | The timezone of the time stored in the database. Only required if the **Show time** option is enabled. | -| Display in timezone | The timezone in which the date should be displayed. Only required if the **Show time** option is enabled. | -| Show time | Displays the time along with the date. | -| Make editable | This option is disabled by default. Enabling it allows the column to be edited by app users. Its value can also be dynamically set to `{{true}}` or `{{false}}` to toggle it on or off. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Image - -The **Image** column type is used to display images in the column cells using the column data. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specify the name to be displayed on the table column header | -| Key | Specify the key name associated with the loaded data in the table. The provided **key** should hold a URL for the image to be loaded in the column cells. | -| Horizontal alignment | Positions content left, center, or right within table column cells for improved readability and visual presentation. | -| Border radius | Set a border radius for the image loaded in the column cell. The field accepts a numerical value from `0` to `100`. | -| Width | Set a width for the image loaded in the column cell. The field accepts a numerical value from `0` to `100`. | -| Height | Set a height for the image loaded in the column cell. The field accepts a numerical value from `0` to `100`. | -| Object fit | This option allows you to choose how the image should be fitted within its container. The available options are: **Cover**, **Contain**, and **Fill**. **Cover** maintains the aspect ratio of the image but may crop or clip parts of it to cover the container's width, **Contain** maintains the aspect ratio and resizes the image to fit within the given dimensions while displaying the entire image, and **Fill** stretches the image to cover 100% of the width. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -#### Link - -The **Link** column type enables cells to become clickable links that can be loaded on either the same page or a new page. - -|
    Column Property
    |
    Description
    | -|:----------- |:----------- | -| Column name | Specifies the name displayed on the table column header. | -| Key | Specify the key that holds the URL. By default. The provided key should hold either a `string` or a `URL`. | -| Link Target | Specifies whether the link should be loaded on the same window or a new window. The values can also be set dynamically to `_set` for same window and `_blank` for new window. | -| Column Visibility | This option is enabled by default. Disabling it hides the column from the table. Its value can also be dynamically set to `{{true}}` or `{{false}}` to show or hide the column. | - -:::info -For more information on using cellValue and rowData, refer to the **[how-to guide](/docs/how-to/access-cellvalue-rowdata)**. -::: - -### Add Column - -You can add a new column to the table by clicking on the **+ Add Column** button. On clicking this button a new column will be added to the table and you can edit it's properties from the column section. Check [Displaying Data](#displaying-data) section to learn more. - -### Delete Column - -Hover on the column under the columns section and click on the three dots icon, a dropdown will appear with the option to delete the column. Click on the **delete** option to remove the column from the table. - -### Displaying Data - -The data object should be an array of objects. Table columns can be added, removed, rearranged from the inspector. `key` property is the accessor key used to get data from a single element of a table data object. For example: - -If the table data is: - -```js -[ - { - "review": { - "title": "An app review" - }, - "user": { - "name": "sam", - "email": "sam@example.com" - }, - } -] -``` - -To display email column, the key for the column should be `user.email`. - - -### Saving Data -Enable `editable` property of a column to make the cells editable. If a data type is not selected, `string` is selected as the data type. - -:::tip -You can programatically **enable**/**disable** the make **editable** field in the columns property by clicking on the **Fx** button. -::: - -If the data in a cell is changed, `changeSet` property of the table object will have the index of the row and the field that changed. -For example, if the name field of second row of example in the 'Displaying Data' section is changed, `changeSet` will look like this: - -```js -{ - 2: { - "name": "new name" - } -} -``` - -Along with `changeSet`, `dataUpdates` property will also be changed when the value of a cell changes. `dataUpdates` will have the whole data of the changed index from the table data. `dataUpdates` will look like this for our example: - -```js -[{ - "review": { - "title": "An app review" - }, - "user": { - "name": "new name", - "email": "sam@example.com" - }, -}] -``` - -If the data of a cell is changed, "save changes" button will be shown at the bottom of the table. This button when clicked will trigger the `Bulk update query` event. This event can be used to run a query to update the data on your data source. - -## Events - -- **[Row hovered](#row-hovered)** -- **[Row clicked](#row-clicked)** -- **[Save changes](#save-changes)** -- **[Cancel changes](#cancel-changes)** -- **[Page changed](#page-changed)** -- **[Search](#search)** -- **[Sort applied](#sort-applied)** -- **[Cell value changed](#cell-value-changed)** -- **[Filter changed](#filter-changed)** -- **[Add new rows](#add-new-rows)** - -### Allow Selection - -This option is active by default. **Enabling** this functionality allows users to choose a row in the table by utilizing `checkboxes` placed next to each row. If this option is disabled, the ability to highlight selected rows and perform bulk selection will not be accessible. - -If the option for allowing selection is enabled, a new option called **[Default selected row](#default-selected-row)** will become visible. However, if the option for allowing selection is disabled, the **[Default selected row](#default-selected-row)** option will not be displayed. - -### Highlight Selected Row - -Activate this option to visually emphasize the last clicked row. **Enabling** this feature will alter the row selection appearance of the table from a `checkbox`-based theme to a `highlighting`-based theme. - -### Bulk Selection - -To enable the selection of one or more rows from the current page of a table, you can activate the 'Bulk selection' setting in the inspector. The values of the selected rows will be exposed as '**selectedRows**'. - -### Default Selected Row - -By enabling this option, you can designate a default row to be pre-selected when the app loads. This means that whenever the app is opened for the first time, a specific row will already be highlighted in the table by default. Additionally, there is an accessible variable that stores the value for this setting. You can find a list of all accessible variables **[here](#exposed-variables)**. - -To set a default selected row, you need to provide an object with a single key-value pair. For instance, you can use the `id` key and dynamically obtain the value from a variable, let's say `x`, to specify the default selected row in the table. We assume that the variable `x` holds a valid numerical id. - -Example: -```js -{{{"id": variables.x}}} //assuming variables.x is already set -``` - -Please ensure that the value provided in the object corresponds to a valid id in the table to ensure proper functionality. - -### Select Row on Cell Edit -Enabling the `Make editable` property for a column allows the app users to edit the column. While editing, the related row will be selected by default. To stop the row from getting selected by default, turn off `Select row on cell edit`. - -## Component Specific Actions (CSA) - -Following actions of the component can be controlled using the component specific actions(CSA): - - - -|
    Action
    |
    Description
    |
    How To Access
    | -| :------------ | :---------- | :------------ | -| setPage() | Sets the page on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.setPage(2)`)
    or trigger it using an event. | -| selectRow() | Selects a row on the table | Employ a RunJS query (for e.g.,
    `await components.table1.selectRow('id','11')`)
    or trigger it using an event. | -| deselectRow() | Deselects a row on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.deselectRow()`)
    or trigger it using an event. | -| selectAllRows()| Selects all rows on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.selectAllRows()`)
    or trigger it using an event. | -| deselectAllRows() | Deselects all rows on the table| Employ a RunJS query (for e.g.,
    `await components.table1.deselectAllRows()`)
    or trigger it using an event. | -| discardChanges() | Discards the changes from the table when a cell is edited. | Employ a RunJS query (for e.g.,
    `await components.table1.discardChanges()`)
    or trigger it using an event. | -| discardNewlyAddedRows() | Discards the newly added rows from the add new row popup on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.discardNewlyAddedRows()`)
    or trigger it using an event. | -| downloadTableData() | Retrieves the data from the table in the PDF, CSV, or Excel sheet. | Employ a RunJS query (for e.g.,
    `await components.table1.downloadTableData('pdf')`)
    or trigger it using an event. | -| setFilters() | Applies filters to the table data. | Employ a RunJS query (for e.g.,
    `await components.table1.setFilters ([{column:'name',condition:'contains',value: 'Sarah'}])`)
    or trigger it using an event. | -| clearFilters() | Removes all applied filters from the table. | Employ a RunJS query (for e.g.,
    `await components.table1.clearFilters()`)
    or trigger it using an event. | - -## Exposed Variables - -|
    Variable
    |
    Description
    | -| :---------- | :---------- | -| currentData | Data that is currently being displayed by the table (including edits if any ) | -| currentPageData | Data that is displayed on the current page if pagination is enabled (including edits if any) | -| pageIndex | Index of the current page, starting from 1 -| changeSet | Object with row number as the key and object of edited fields and their values as the value | -| dataUpdates | Just like changeSet but includes the data of the entire row | -| selectedRow | Contains the data of the row that was most recently clicked. When an action button is clicked, `selectedRow` is also updated. Its initial value is set to the data of the first row when the app is loaded. | -| selectedRowId | Stores the ID of the row that was last clicked. Similar to `selectedRow`, it gets updated when an action button is clicked. You can access its value using `{{components.table1.selectedRowId}}`. By default, it is set to `0`, representing the ID of the first row when the app is loaded. | -| selectedCell | The data of the cell that was last clicked on the table. | -| searchText | The value of the search field if server-side pagination is enabled. | -| newRows| The newRows variable stores an array of objects, each containing data for a row that was added to the table using the "Add new row" button. When the user clicks either the "Save" or "Discard" button in the modal, this data is cleared.| - -## Validation - -Under column properties, expand the detailed view of a column type to access a toggle button called `make editable`. You can toggle it `ON` to apply the validations. Validations will be different for different column types. For instance, the a column with `string` type will have the following validations. - -|
    Method
    |
    Description
    | -|:----------- |:----------- | -| Regex | Use this field to enter a Regular Expression that will validate the content. | -| Min length | Enter the number for a minimum length of characters allowed. | -| Max length | Enter the number for the maximum length of characters allowed. | -| Custom rule | If the condition is true, the validation passes, otherwise return a string that should be displayed as the error message. For example: `{{components.table1.selectedRow.id==1&&"This row can't be deleted"}}` | - -## Action Buttons - -Action buttons will be displayed as the last column of the table. The styles of these buttons can be customized and `on click` actions can be configured. when clicked, `selectedRow` property of the table will have the table data of the row. - -|
    Property
    |
    Description
    | -|:-------- |:------------ | -| Button text | Set the text that you want to be displayed on the action button. | -| Button position | Set the button position to the left or right | -| Background color (Action Button) | Background color of the action button. | -| Text color (Action Button) | Color of button-text of the action button. | -| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | - -## Search Sort and Filter - -### Show Search - -It can be used to show or hide Table Search box. Client-side search is enabled by default and server-side search can be enabled from the events section of the inspector. Whenever the search text is changed, the `searchText` property of the table component is updated. If server-side search is enabled, `on search` event is fired after the content of `searchText` property is changed. `searchText` can be used to run a specific query to search for the records in your data source. - -If you don't wish to use the search feature altogether, you can disable it from the inspector. - -#### Server-side Search - -If server-side search is enabled, `on search` event is fired after the content of `searchText` property is changed. `searchText` can be used to run a specific query to search for the records in your data source. - -### Enable Column Sorting - -Disable this option to lock the sorting of columns when clicked on column header. - -#### Server-side Sort -When Server-side sort is enabled, clicking on the column headers will not automatically sort the table, instead, the `Sort applied` event will be fired and the applied sorting will be exposed as `sortApplied`. You can use this data to run any query that feeds data to the table in a manner that reflects the sorting applied. - -### Enable Filtering - -The filter button in the table header is visible by default. You can choose to hide it by disabling this option. You can dynamically set the value to `{{true}}` or `{{false}}` to show or hide the filter button by clicking on the **Fx** button. - -#### Server-side Filter -When Server-side filter is enabled, applying filters will not automatically filter the table, instead, the `Filter changed` event will be fired and the applied filters will be exposed as `filters`. You can use this data to run any query that feeds data to the table in a manner that reflects the filters applied. - - -## Pagination - -### Client-side Pagination - -Client-side pagination is enabled by default. When the client-side pagination is enabled(`{{true}}`), another property **Number of rows per page** will be shown that can be used to set the number of records per page. By default, the value is set to 10 and if it is disabled(`{{false}}`) then it will show all the records in the single page. - -### Server-side Pagination - -Server-side pagination can be used to run a query whenever the page is changed. Go to events section of the inspector and change the action for `on page changed` event. Number of records per page needs to be handled in your query. If server-side pagination is enabled, `pageIndex` property will be exposed on the table object, this property will have the current page index. `pageIndex` can be used to query the next set of results when page is changed. - -When Server-side pagination is enabled, you'll be able to set three other table properties: -- **Enable previous page button**: When server-side pagination is enabled, this button is enabled by default. Toggle this off to disable the previous page button from the table. -- **Enable next page button**: When server-side pagination is enabled, this button is enabled by default. Toggle this off to disable the next page button from the table. -- **Total records server side**: Set a numerical value to display particular number of records. - -:::tip -Check this how-to guide to learn more about [server-side pagination](/docs/how-to/use-server-side-pagination). -::: - -## Additional Actions - -### Show Add New Row Button - -The Add new row button in the table header is visible by default. You can choose to hide it by disabling this option. You can dynamically set the value to `{{true}}` or `{{false}}` to show or hide the Add new row button by clicking on the **Fx** button. - -### Show Download Button - -The download button in the table header is visible by default. You can choose to hide it by disabling this option. You can dynamically set the value to `{{true}}` or `{{false}}` to show or hide the download button by clicking on the **Fx** button. - -### Hide Column Selector Button - -The column selector button on the table header is visible by default. You can choose to hide it by disabling this option. You can dynamically set the value to `{{true}}` or `{{false}}` to show or hide the column selector button by clicking on the **Fx** button. - -### Loading State (Boolean) - -Loading state shows a loading skeleton for the table. This property can be used to show a loading status on the table while data is being loaded. `isLoading` property of a query can be used to get the status of a query. - -### Show Update Buttons - -It's enabled by default. Table footer will show two update buttons **Save changes** & **Discard changes** whenever a cell is edited. Toggle `off` to hide update buttons. - -## Devices - -|
    Option
    |
    Description
    |
    Expected Value
    | -|:----------- |:----------- |:----------- | -| Show on desktop | Toggle on or off to show or hide the component on desktop devices. | `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to show or hide the component on mobile devices. | `{{true}}` or `{{false}}` | - -## Styles - -|
    Style
    |
    Description
    | -| :---------- | :---------- | -| Text color | Change the color of the text in table by providing `hex color code` or choosing one from the picker | -| Action button radius | This field can be used to give a radius to all action buttons. The default value is `0` | -| Table type | Select a type of table from the dropdown: Bordered, Regular, or Striped. | -| Cell size | This decides the size of table cells. You can choose between a `Condensed` size for table cells or a `Regular` size | -| Visibility | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. | -| Disable | Toggle on to lock the widget. You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | -| Border radius | Use this property to modify the border radius of the button. | - -:::info -Any property having `Fx` button next to its field can be **programmatically configured**. -::: - diff --git a/docs/docs/widgets/table/columns.md b/docs/docs/widgets/table/columns.md index 347208e5f7..e92f60704f 100644 --- a/docs/docs/widgets/table/columns.md +++ b/docs/docs/widgets/table/columns.md @@ -1,6 +1,6 @@ --- id: table-columns -title: Columns +title: Table Columns --- Whenever data is loaded into a Table, the columns are automatically generated. You can add, remove, or modify columns by accessing the table properties under the column section. You can also rearrange the columns by dragging and dropping them. @@ -464,7 +464,7 @@ On hovering on a column, you can see a delete icon on the right which can be use ### Hide columns -You can choose which columns to show or hide in the Table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table#show-column-selector-button)** in the Table properties. +You can choose which columns to show or hide in the Table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table/table/#hide-column-selector-button)** in the Table properties. ## Make all columns editable diff --git a/docs/docs/widgets/table/dynamic-column.md b/docs/docs/widgets/table/dynamic-column.md new file mode 100644 index 0000000000..541629cc0a --- /dev/null +++ b/docs/docs/widgets/table/dynamic-column.md @@ -0,0 +1,112 @@ +--- +id: dynamic-column +title: Dynamic Columns +--- + +ToolJet allows users to dynamically set the columns of a **Table** component using a JSON value. This guide explains how to configure dynamic columns in ToolJet. + +
    + +## Using Dynamic Column + +1. Drag a **Table** component from the right-side component library onto the canvas. +2. Populate the **Table** component with data by connecting it to a query. +3. Toggle the Use dynamic column option. +4. Enter JSON to define the **Table's** columns dynamically. For example: + +```json +{ + "name": "Name", + "columnType": "string", + "key": "first_name", + "cellBackgroundColor": "#000", + "textColor": "#fff", + "isEditable": true, + "regex": "", + "maxLength": 20, + "minLength": 5, + "customRule": "" +} +``` + +This configuration displays a column labeled Name with editable string data restricted to lengths between 5 and 20 characters, with white text on a black background. + +
    + +
    + +## Displaying Different Table Schema Based on the Current User + +You can use dynamic columns to display different table schemas depending on the current user. Let's look at an example with the below schema: + +| ID | Name | Email | Department | Salary | Performance | Login | +|----|------|-------|------------|--------|-------------|-------| + +Here, two different schemas are to be displayed based on the current user. + +**For Admin:** + +| ID | Name | Email | Department | Salary | Performance | Login | +|----|------|-------|------------|--------|-------------|-------| + +**For Employees:** + +| ID | Name | Email | Department | Login | +|----|------|-------|------------|-------| + +1. To configure the schema as per the user, enable Use dynamic column property. + +2. Use the following JSON logic to dynamically adjust the schema based on the current user's role: + +```json +{{globals.currentUser.groups.includes("admin") ? [ + { name: 'id', key: 'id', id: '1' }, + { name: 'Name', key: 'name', id: '2' }, + { name: 'Email', key: 'email', id: '3' }, + { name: 'Department', key: 'department', id: '4' }, + { name: 'Salary', key: 'salary', id: '5' }, + { name: 'Performance Rating', key: 'performance', id: '6' }, + { name: 'Last Login', columnType:"datePicker", key: 'login', id: '7' } +] : [ + { name: 'id', key: 'id', id: '1' }, + { name: 'Name', key: 'name', id: '2' }, + { name: 'Email', key: 'email', id: '3' }, + { name: 'Department', key: 'department', id: '4' }, + { name: 'Last Login', columnType:"datePicker", key: 'login', id: '5' } +]}} +``` + +
    + +
    + +## Specifiying the Column Type + +Dynamic columns in ToolJet support various types, such as strings, numbers, dates, and links. + +In this example, you can see how you can specify a column type using dynamic columns. + +1. Add a **Table** component with the following columns and column types: + - Profile Photo - Image + - Name - String + - Contact Number - Number + - Date of Birth - Datepicker + - Website URL - Link + +2. Toggle the Use dynamic column option. + +3. Add the following JSON to define the columns: + +```json +{{[ + {name: 'Profile', key: 'photo',columnType: 'image', id: '1'}, + {name: 'Name', key: 'name', columnType:'string', id: '2'}, + {name: 'Contact', key: 'mobile_number', columnType:'number', id: '3'}, + {name: 'DOB', key: 'date', columnType:'datepicker', id: '4'}, + {name: 'Website', key: 'website', columnType:'link', id: '5'} +]}} +``` + +This configuration will create a table with the specified column types. + +
    diff --git a/docs/docs/widgets/table/properties.md b/docs/docs/widgets/table/properties.md index bf5c542f88..524983df29 100644 --- a/docs/docs/widgets/table/properties.md +++ b/docs/docs/widgets/table/properties.md @@ -1,6 +1,7 @@ --- id: table-properties -title: Properties +title: Table Properties +slug: /widgets/table/ --- The Table component displays and manages data, connecting seamlessly with databases and APIs. It allows users to view and edit data directly within the table. This document goes through all the properties related to the Table component. @@ -34,7 +35,7 @@ Example - Passing a query data: Go to the **[columns](/docs/widgets/table/table-columns)** section to read more about columns. :::info -Any property having `fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: ## Action Buttons @@ -53,7 +54,7 @@ Below are the button text properties that you can set. | Button position | Sets the button position to left or right. | | Background color | Sets the background color of the action button. | | Text color | Sets the color of button-text of the action button. | -| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the `fx` button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | +| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the **fx** button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | | New event handler | The **New event handler** button lets you create an event handler to define behavior for action buttons based on the `On click` action. | @@ -150,7 +151,7 @@ Enabling the `Make editable` property for a column allows the app users to edit ### Show search - The Show search property controls the search box on the Table. Client-side search is enabled by default and server-side search can be enabled from the events section of the inspector. Whenever the search text is changed, the `searchText` exposed variable of the Table component is updated. +The Show search property controls the search box on the Table. Client-side search is enabled by default and server-side search can be enabled from the events section of the inspector. Whenever the search text is changed, the `searchText` exposed variable of the Table component is updated. #### Server-side search @@ -204,7 +205,7 @@ When Server-side pagination is enabled, you'll be able to set three other Table Check this how-to guide to learn more about **[server-side pagination](/docs/how-to/use-server-side-pagination)**. ::: -## Addional actions +## Additional actions ### Show add new row button @@ -240,29 +241,31 @@ Disable condition allows you to control whether the Table is enabled or disabled ## Devices -| Option | Description | Expected value | +| Property | Description | Expected value | |:----------- |:----------- |:----------- | -| **Show on desktop** | Shows or hides the component on desktop devices. | Use the toggle switch or configure it dynamically using `fx`.| -| **Show on mobile** | Shows or hides the component on mobile devices. | Use the toggle switch or configure it dynamically using `fx`.| +| 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 ### Data | Style Property | Description | Configuration Options | |-----------------|------------------|--------------------| -| **Text color** | Change the text color of the component. | Provide a `hex color code`, choose from the picker, or set programmatically using `fx`. | -| **Row style** | Selects the style of the table rows. | Choose from dropdown: Bordered, Regular, or Striped. You can also set it programmatically using `fx`. | -| **Cell height** | Determines the size of the table cells. | Choose between `Condensed` or `Regular` size. You can also set it programmatically using `fx`. | -| **Max row height** | Controls the maximum height of rows when `Content wrap` is enabled. | Select `Auto` or define a `Custom` size. You can also set it programmatically using `fx`. | +| **Text color** | Change the text color of the component. | Provide a **hex color code**, choose from the picker, or set programmatically using **fx**. | +| **Column header** | Defines how the column header text is displayed. | Choose between **Fixed** or **Wrap**. You can also set it programmatically using **fx**. | +| **Header casing** | Specifies the casing style for column headers. | Choose between **AA** or **As Typed**. You can also set it programmatically using **fx**. | +| **Row style** | Selects the style of the table rows. | Choose from dropdown: **Bordered**, **Regular**, or **Striped**. You can also set it programmatically using **fx**. | +| **Cell height** | Determines the size of the table cells. | Choose between **Condensed** or **Regular** size. You can also set it programmatically using **fx**. | +| **Max row height** | Controls the maximum height of rows when **Content wrap** is enabled. | Select **Auto** or define a **Custom** size. You can also set it programmatically using **fx**. | ## Action Button | Action | Description | Configuration Options | |:-------------------|:----------------|:-----------------------| -| **Button radius** | Sets the radius for all action buttons. | Enter a value (default is `0`) or dynamically configure using `fx`. | +| **Button radius** | Sets the radius for all action buttons. | Enter a value (default is **0**) or dynamically configure using **fx**. | ## Container | Style Property | Description | Configuration Options | |:---------------|:-----------|:----------------------| -| **Border radius** | Adds a radius to the borders of the Table. | Enter a value (default is `8`) or dynamically configure using `fx`. | -| **Border** | Defines the border color of the Table. | Change the color by providing a `hex color code`, choosing from the picker, or setting programmatically using `fx`. | -| **Box shadow** | Sets the box shadow properties of the component. | Select the box shadow color, adjust related properties, or set programmatically using `fx`. | +| **Border radius** | Adds a radius to the borders of the Table. | Enter a value (default is **8**) or dynamically configure using **fx**. | +| **Border** | Defines the border color of the Table. | Change the color by providing a **hex color code**, choosing from the picker, or setting programmatically using **fx**. | +| **Box shadow** | Sets the box shadow properties of the component. | Select the box shadow color, adjust related properties, or set programmatically using **fx**. | diff --git a/docs/docs/widgets/table/serverside-operations/filter.md b/docs/docs/widgets/table/serverside-operations/filter.md index 53e6682348..3fbce3cf8d 100644 --- a/docs/docs/widgets/table/serverside-operations/filter.md +++ b/docs/docs/widgets/table/serverside-operations/filter.md @@ -3,120 +3,114 @@ id: filter title: Filter Operation --- -This guide explains how to perform serverside filter operation on a **Table** component in ToolJet. +This guide explains how to implement a server side filter operation on the **Table** component in ToolJet.
    ## Add Table Component -Before performing the filter operation, let's setup the table component and populate it with the data: +Before implementing the filter operation, add the **Table** component and populate it with data: 1. Drag a **Table** component from the right component library to the canvas. -2. Select the data source and create a new query from the query panel at the bottom. (Refer to [data source](/docs/data-sources/overview) docs for more details)
    - This guide will use ToolJet’s Sample data source (Postgres).
    - Add the following query to fetch the data from the database: +2. Select a data source and create a new query using the query panel at the bottom. We are going to use ToolJet’s sample data source (Postgres) in this guide. Add the following query to fetch the data from the database: - ```sql - SELECT * FROM public.sample_data_orders - LIMIT 100 - ``` +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` - Fetch data from the data source +Fetch data from the data source -3. Set the value of the **Data** property of the **Table** to `{{queries..data}}` to populate the table with relevant data. +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query.
    -
    +
    -## Serverside Filter +## Server Side Filter -Follow the following steps to perform server-side filter operation on the **Table**: +Follow the mentioned steps to perform server side filter operation on the **Table** component: -1. Enable Server Side Filter under the **Table** properties. +1. Enable Server Side Filter under the **Table** component properties. - Fetch data from the data source +Fetch data from the data source 2. Create a new **RunJS** Query to dynamically create SQL queries for filters. - ```js - const filterData = components.table1.filters; +```js +const filterData = components.table1.filters; - const createSQLQueries = (filters) => { +const createSQLQueries = (filters) => { - let conditions = ''; + let conditions = ''; - filters.forEach(({ condition, value, column }, index) => { + filters.forEach(({ condition, value, column }, index) => { - const prefix = index === 0 ? 'WHERE' : 'AND'; - - switch (condition) { - case "contains": - conditions += ` ${prefix} ${column} ILIKE '%${value}%'`; - break; - case "doesNotContains": - conditions += ` ${prefix} ${column} NOT ILIKE '%${value}%'`; - break; - case "matches": - case "equals": - conditions += ` ${prefix} ${column} = '${value}'`; - break; - case "ne": - conditions += ` ${prefix} ${column} != '${value}'`; - break; - case "nl": - conditions += ` ${prefix} ${column} IS NULL`; - break; - case "isEmpty": - conditions += ` ${prefix} ${column} = ''`; - break; - default: - throw new Error(`Unsupported condition: ${condition}`); - } - - }); - - const mainQuery = `SELECT * FROM public.sample_data_orders ${conditions}`; - - return { mainQuery }; + const prefix = index === 0 ? 'WHERE' : 'AND'; + switch (condition) { + case "contains": + conditions += ` ${prefix} ${column} ILIKE '%${value}%'`; + break; + case "doesNotContains": + conditions += ` ${prefix} ${column} NOT ILIKE '%${value}%'`; + break; + case "matches": + case "equals": + conditions += ` ${prefix} ${column} = '${value}'`; + break; + case "ne": + conditions += ` ${prefix} ${column} != '${value}'`; + break; + case "nl": + conditions += ` ${prefix} ${column} IS NULL`; + break; + case "isEmpty": + conditions += ` ${prefix} ${column} = ''`; + break; + default: + throw new Error(`Unsupported condition: ${condition}`); } + }); - return createSQLQueries(filterData); - ``` +const mainQuery = `SELECT * FROM public.sample_data_orders ${conditions}`; + +return { mainQuery }; + +} + +return createSQLQueries(filterData); +``` - Fetch data from the data source +Fetch data from the data source -3. Add Event Handler to **RunJS** Query
    +3. Add an Event Handler to the **RunJS** Query
    Event: **Query Success**
    Action: **Run Query**
    Query: **Select Your Query** - Fetch data from the data source +Fetch data from the data source -4. Edit Query as follows: +4. Enter the following query: +```sql + {{queries.runjs1.data.mainQuery}} +``` - ```sql - {{queries.runjs1.data.mainQuery}} - ``` +Fetch data from the data source - Fetch data from the data source - -5. Add Event Handler in the **Table**:
    +5. Add an Event Handler to the **Table** component:
    Event: **Filter Changed**
    Action: **Run Query**
    Query: **Select Your RunJS Query** - Fetch data from the data source +Fetch data from the data source - This will run the query and fetch the data every time a filter changes. +This will run the query and fetch the data every time a filter changes. -6. Add Loading State, navigate to the **Table** properties under Additional Actions. Click on the **fx** icon next to Loading State and enter `{{queries.getOrders.isLoading}}` in the field. +6. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* - Note: Make sure to replace *getOrders* with your query name. +Fetch data from the data source - Fetch data from the data source - -This is how serverside filtering is implemented in ToolJet's **Table** component. When one or more filters are applied to the **Table**, the query is executed on the server, ensuring that the filtering affects all records in the dataset, not just the data currently loaded into the **Table**. +This is how server side filtering is implemented in ToolJet's **Table** component. When one or more filters are applied to the **Table** component, the query is executed on the server, ensuring that the filtering affects all records in the dataset, not just the data currently loaded into the **Table** component.
    \ No newline at end of file diff --git a/docs/docs/widgets/table/serverside-operations/overview.md b/docs/docs/widgets/table/serverside-operations/overview.md index c06b042593..70416b0e5a 100644 --- a/docs/docs/widgets/table/serverside-operations/overview.md +++ b/docs/docs/widgets/table/serverside-operations/overview.md @@ -3,25 +3,25 @@ id: overview title: Overview --- -This guide explains how to perform server-side operations on a table component in ToolJet. While most databases offer support for server-side operations, the specific implementation can vary depending on the database. For the purposes of this guide, PostgreSQL will be used as the data source to demonstrate the process. +This guide explains how to perform server side operations on a table component in ToolJet. Most databases support server side operations, but the specific implementation may vary by database. This guide uses PostgreSQL as the data source to demonstrate the process.
    ## Server Side v/s Client Side -Server-side operations refer to tasks executed on the server, such as data fetching, filtering, sorting, and pagination. These operations leverage the server's resources, making them more efficient when handling large datasets and ensuring faster load times for users. In contrast, client-side operations are performed in the user's browser or application, which may lead to performance issues with large datasets as all data is first fetched and then processed locally. Server-side operations offer better scalability and performance, especially for resource-intensive tasks. +Server side operations refer to tasks executed on the server, such as data fetching, filtering, sorting, and pagination. Server side operations use server resources, efficiently handling large datasets and ensuring faster load times for users. In contrast, client side operations are performed in the user's browser or application, which may lead to performance issues with large datasets as all data is first fetched and then processed locally. Server side operations offer better scalability and performance, especially for resource-intensive tasks. ### When to Use Sever Side Operations? -1. **Handling Large Datasets** -2. **Security and Data Integrity** -3. **Complex Business Logic** +1. Handling Large Datasets +2. Security and Data Integrity +3. Complex Business Logic ### When to Use Client Side Operations? -1. **Real-time Interactivity** -2. **Reduced Server Load** -3. **Offline Capabilities** +1. Real-time Interactivity +2. Reduced Server Load +3. Offline Capabilities
    @@ -29,12 +29,12 @@ Server-side operations refer to tasks executed on the server, such as data fetch ## Supported Operations -Following server side operations can be performed on a Table in ToolJet: +The following server side operations can be performed on a Table in ToolJet: -- [Search](./search.md) -- [Sort](./sort.md) -- [Filter](./filter.md) -- [Pagination](./pagination.md) +- [Search](/docs/widgets/table/serverside-operations/search/) +- [Sort](/docs/widgets/table/serverside-operations/sort/) +- [Filter](/docs/widgets/table/serverside-operations/filter/) +- [Pagination](/docs/widgets/table/serverside-operations/pagination/) Serverside Operations Present for Table Component in ToolJet diff --git a/docs/docs/widgets/table/serverside-operations/pagination.md b/docs/docs/widgets/table/serverside-operations/pagination.md index 6e980450db..3df6a2c97e 100644 --- a/docs/docs/widgets/table/serverside-operations/pagination.md +++ b/docs/docs/widgets/table/serverside-operations/pagination.md @@ -3,84 +3,78 @@ id: pagination title: Pagination --- -This guide explains how to perform serverside pagination on a **Table** component in ToolJet. +This guide explains how to perform server side pagination on a **Table** component in ToolJet.
    -## Add Table Component +## Add a Table Component -Before performing the serverside pagination, lets setup the **Table** component and populate it with the data: +Before performing the server side pagination, add the **Table** component and populate it with data: -1. Drag a **Table** component from right component library to the canvas. -2. Select the data source and create a new query from the query panel at the bottom. (Refer to [data source](/docs/data-sources/overview) docs for more details)
    - We are going to use ToolJet’s Sample data source (Postgres) in this guide.
    - Add the following query to fetch the data from database: +1. Drag a **Table** component from the right component library to the canvas. +2. Select a data source and create a new query using the query panel at the bottom. This guide uses ToolJet’s sample data source (Postgres). Add the following query to fetch the data from the database: - ```sql - SELECT * FROM public.sample_data_orders - LIMIT 100 - ``` +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` - Fetch data from the data source +Fetch data from the data source -3. Set the value of the **Data** property of the **Table** to `{{queries..data}}` to populate the **Table** with relevant data. +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query.
    -## Serverside Pagination +## Server Side Pagination -Follow the following steps to perform server side pagination on **Table**: +Follow the mentioned steps to perform server side pagination on the **Table** component: -1. Enable Server Side Pagination under the **Table** properties. +1. Enable Server Side Pagination under the **Table** component properties. - Fetch data from the data source +Fetch data from the data source -2. Create a new query to find total number of records on server side +2. Create a new query to find the total number of records on the server side. - ```sql - SELECT COUNT(*) FROM public.sample_data_orders - ``` +```sql +SELECT COUNT(*) FROM public.sample_data_orders +``` - Fetch data from the data source +Fetch data from the data source -3. Navigate to the table's properties under Pagination section, in Total record server side enter `{{queries.countOrders.data[0].count}}` +3. Navigate to the Pagination section under the table component properties, in the Total record server side enter `{{queries.countOrders.data[0].count}}`. *Note: Make sure to change countOrders with your query name created in the last step.* - Fetch data from the data source +Fetch data from the data source - Make sure to change *countOrders* with your query name create in the last step. +4. Enter the following query: -4. Edit the query, as follow: +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 OFFSET {{(components.table1.pageIndex-1)*100}} +``` - ```sql - SELECT * FROM public.sample_data_orders - LIMIT 100 OFFSET {{(components.table1.pageIndex-1)*100}} - ``` +Fetch data from the data source - Fetch data from the data source +*Note: Make sure to replace table1 with your **Table** name.* - **Note**: Make sure to replace *table1* with your **Table** name. - -5. Add Event Handler in **Table**:
    +5. Add an Event Handler to the **Table** component:
    Event: **Page changed**
    Action: **Run Query**
    Query: **Select Your Query** - Fetch data from the data source +Fetch data from the data source - This will run the query and fetch the data every time the page is changed. +This will run the query and fetch the data every time the page is changed. -6. Disable the next page button on the last page, navigate to the **Table** properties under Pagination section. Click on the **fx** icon next to Ebable next page button and enter `{{components.table1.pageIndex +Fetch data from the data source -7. Add Loading State, navigate to the table's properties under Additional Actions. Click on the **fx** icon next to Loading State and enter `{{queries.getOrders.isLoading}}` in the field. +7. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* - **Note**: Make sure to replace *getOrders* with your query name. +Fetch data from the data source - Fetch data from the data source +This is how server side pagination is implemented in ToolJet's **Table** component. When pagination is used, the query is executed on the server, retrieving only the relevant set of records for the current page. This ensures that data is fetched efficiently from the server, rather than loading the entire dataset at once, improving performance and scalability. -This is how serverside pagination is implemented in ToolJet's **Table** component. When pagination is used, the query is executed on the server, retrieving only the relevant set of records for the current page. This ensures that data is fetched efficiently from the server, rather than loading the entire dataset at once, improving performance and scalability. - -
    +
    \ No newline at end of file diff --git a/docs/docs/widgets/table/serverside-operations/search.md b/docs/docs/widgets/table/serverside-operations/search.md index 0b29e8c647..1624a53311 100644 --- a/docs/docs/widgets/table/serverside-operations/search.md +++ b/docs/docs/widgets/table/serverside-operations/search.md @@ -3,69 +3,65 @@ id: search title: Search Operation --- -This guide explains how to perform serverside search operation on a **Table** component in ToolJet. +This guide explains how to perform a server side search operation on the **Table** component in ToolJet.
    ## Add Table Component -Before performing the search operation, lets setup the **Table** component and populate it with the data: +Before performing the search operation, add the **Table** component and populate it with data: -1. Drag a **Table** component from right component library to the canvas. -2. Select the data source and create a new query from the query panel at the bottom. (Refer to [data source](/docs/data-sources/overview) docs for more details)
    - We are going to use ToolJet’s Sample data source (Postgres) in this guide.
    - Add the following query to fetch the data from database: +1. Drag a **Table** component from the right component library to the canvas. +2. Select a data source and create a new query using the query panel at the bottom. We are going to use ToolJet’s sample data source (Postgres) in this guide. Add the following query to fetch the data from the database: - ```sql - SELECT * FROM public.sample_data_orders - LIMIT 100 - ``` +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` - Fetch data from the data source +Fetch data from the data source -3. Set the value of the **Data** property of the **Table** to `{{queries..data}}` to populate the **Table** with relevant data. +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query.
    -## Serverside Search +## Server Side Search -Follow the following steps to perform server side search operation on **Table**: +Follow the mentioned steps to perform server side search operation on the **Table** component: -1. Enable Server Side Search under the **Table** properties. +1. Enable Server side Search under the **Table** component properties. - Enable server side search operation +Enable server side search operation -2. Edit the query, as follow: +2. Enter the following query - ```sql - SELECT * FROM public.sample_data_orders - WHERE city ILIKE '%{{components.table1.searchText}}%' OR - country ILIKE '%{{components.table1.searchText}}%' OR - state ILIKE '%{{components.table1.searchText}}%' - LIMIT 100 - ``` +```sql +SELECT * FROM public.sample_data_orders +WHERE city ILIKE '%{{components.table1.searchText}}%' OR + country ILIKE '%{{components.table1.searchText}}%' OR + state ILIKE '%{{components.table1.searchText}}%' +LIMIT 100 +``` - Enter the query +Enter the query - The above query searches for the searched text in city, state and country column on server side and return the data.
    - **Note**: Make sure to replace *table1* with your **Table** name. +The above query searches for the searched text in the city, state and country columns on the server side and returns the data. *Note: Make sure to replace table1 with your **Table** component name.* -3. Add Event Handler in **Table**:
    +3. Add an Event Handler to the **Table** component:
    Event: **Search**
    Action: **Run Query** Query: **Select Your Query**
    - Add event handler +Add event handler - This will run the query and fetch the data every time something is searched. +This will run the query and fetch the data every time something is searched. -4. Add Loading State, navigate to the **Table** properties under Additional Actions. Click on the **fx** icon next to Loading State and enter `{{queries.getOrders.isLoading}}` in the field.
    - **Note**: Make sure to replace *getOrders* with your query name. +4. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* - Add loading state +Add loading state -This is how serverside search operation is implemented in ToolJet's **Table** component. Now when a search is performed in the **Table**, the query is executed on the server, allowing the search to be applied across the entire dataset. +This is how server side search operation is implemented in ToolJet's **Table** component. Now when a search is performed in the **Table** component, the query is executed on the server, allowing the search to be applied across the entire dataset.
    diff --git a/docs/docs/widgets/table/serverside-operations/sort.md b/docs/docs/widgets/table/serverside-operations/sort.md index 1d5526f893..39f883f212 100644 --- a/docs/docs/widgets/table/serverside-operations/sort.md +++ b/docs/docs/widgets/table/serverside-operations/sort.md @@ -3,72 +3,68 @@ id: sort title: Sort Operation --- -This guide explains how to perform serverside sort operation on a **Table** component in ToolJet. +This guide explains how to implement a server side sort operation on the **Table** component in ToolJet.
    ## Add Table Component -Before performing the sort operation, lets setup the **Table** component and populate it with the data: +Before implementing the sort operation, add the **Table** component and populate it with data: -1. Drag a **Table** component from right component library to the canvas. -2. Select the data source and create a new query from the query panel at the bottom. (Refer to [data source](/docs/data-sources/overview) docs for more details)
    - We are going to use ToolJet’s Sample data source (Postgres) in this guide.
    - Add the following query to fetch the data from database: +1. Drag a **Table** component from the right component library to the canvas. +2. Select a data source and create a new query using the query panel at the bottom. We are going to use ToolJet’s sample data source (Postgres) in this guide. Add the following query to fetch the data from the database: - ```sql - SELECT * FROM public.sample_data_orders - LIMIT 100 - ``` +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` - Fetch data from the data source +Fetch data from the data source -3. Set the value of the **Data** property of the **Table** to `{{queries..data}}` to populate the **Table** with relevant data. +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query.
    -## Serverside Sort +## Server Side Sort -Follow the following steps to perform server side sort operation on **Table**: +Follow the mentioned steps to perform server side sort operation on the **Table** component: -1. Enable Server Side Sort under the **Table** properties. +1. Enable Server Side Sort under the **Table** component properties. - Fetch data from the data source +Fetch data from the data source -2. Edit the query, as follow: +2. Enter the following query: - ```sql - SELECT * - FROM public.sample_data_orders - {{components.table1.sortApplied ? ` - ORDER BY ${components.table1.sortApplied[0].column} - ${components.table1.sortApplied[0].direction} - ` : ""}} - LIMIT 100 - ``` +```sql +SELECT * +FROM public.sample_data_orders +{{components.table1.sortApplied ? ` + ORDER BY ${components.table1.sortApplied[0].column} + ${components.table1.sortApplied[0].direction} +` : ""}} +LIMIT 100 +``` - Fetch data from the data source +Fetch data from the data source - **Note**: Make sure to replace *table1* with your **Table** name. +*Note: Make sure to replace table1 with your **Table** name.* -3. Add Event Handler in **Table**:
    +3. Add an Event Handler to the **Table** component:
    Event: **Sort applied**
    Action: **Run Query**
    Query: **Select Your Query** - Fetch data from the data source +Fetch data from the data source - This will run the query and fetch the data every time a sort is applied. +This will run the query and fetch the data every time a sort is applied. -4. Add Loading State, navigate to the **Table** properties under Additional Actions. Click on the **fx** icon next to Loading State and enter `{{queries.getOrders.isLoading}}` in the field. +4. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* - Note: Make sure to replace *getOrders* with your query name. - - Fetch data from the data source +Fetch data from the data source -This is how serverside sort operation is implemented in ToolJet's **Table** component. When sorting is applied to a column in the **Table**, the query is executed on the server, enabling sorting across the entire dataset. This ensures that the sorting is not limited to the data loaded into the **Table** but covers all records in the database. +This is how server side sort operation is implemented in ToolJet's **Table** component. When sorting is applied to a column in the **Table** component, the query is executed on the server, enabling sorting across the entire dataset. This ensures that the sorting is not limited to the data loaded into the **Table** but covers all records in the database.
    \ No newline at end of file diff --git a/docs/docs/widgets/text-input.md b/docs/docs/widgets/text-input.md index 68d65bb6ad..2b8f9ea544 100644 --- a/docs/docs/widgets/text-input.md +++ b/docs/docs/widgets/text-input.md @@ -93,9 +93,9 @@ To add regex inside `Custom Validation`, you can use the below format: |
    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. | +| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Visibility | Controls component visibility. | 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. | 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 (e.g., `Enter your name here.` ). |
    diff --git a/docs/docs/widgets/text.md b/docs/docs/widgets/text.md index fa98ea42f9..383c3745dc 100644 --- a/docs/docs/widgets/text.md +++ b/docs/docs/widgets/text.md @@ -32,10 +32,10 @@ Following actions of the **Text** component can be controlled using Component-Sp |
    Action
    |
    Description
    |
    How To Access
    | | :------------ | :---------- | :------------ | | setText() | Sets the value of the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.setText('this is input text')`) or trigger it using an event.| -| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.clear()`) or trigger it using an event | -| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setVisibility(false)`) or trigger it using an event | -| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setLoading(true)`) or trigger it using an event | -| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setDisable(true)`) or trigger it using an event | +| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setDisable(true)`) or trigger it using an event. | :::info Check the **component specific actions** available for this component **[here](/docs/actions/control-component)**. @@ -45,29 +45,26 @@ Check the **component specific actions** available for this component **[here](/ | Variable | Description | How To Access | |:--------:|:-----------:|:------------:| -|
    text
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.text1.text}}`) | -|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.text1.isLoading}}`) | -|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.text1.isVisible}}`) | -|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.text1.isDisabled}}`) | +|
    text
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.text1.text}}`). | +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.text1.isLoading}}`). | +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.text1.isVisible}}`). | +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.text1.isDisabled}}`). | ## 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 (e.g., `Enter your name here.` ) | +| 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 (e.g., `Enter your name here.` ). | ## Devices -**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 @@ -76,19 +73,19 @@ Makes the component visible in mobile view. You can set it with the toggle butto | Text Property | Description | Configuration Options | |:--------------------|:--------------------------------------|:---------------| -| Size | Dimensions of the characters in a font. | Enter any number between `1-100` or dynamically configure it using `fx` | -| Weight | Determines how bold or light your text will appear. | Select from `light`, `regular`, `semi-bold` or `bold` or dynamically configure it using `fx` | -| Style | Allows you to apply styles like italic or normal, altering the overall look of the text content. | Select from `normal`, `italic` or `oblique` or dynamically configure it using `fx` | -| Color | Sets the color of the text. | Choose a color using the color picker or dynamically configure it using `fx` | -| Scroll | Creates a scroll bar if the text exceeds the component's dimensions. | Choose between `enable` or `disable` or dynamically configure it using `fx` | -| Line Height | Determines the vertical space between lines of text within an element. | Enter a number as the value (example: `1.5`) or dynamically configure it using `fx`| -| Text Indent | Commonly used to create an indentation effect. | Enter a number as the value (example: `10`) or dynamically configure it using `fx`| -| Alignment | Sets the alignment of the text. | Select the available options to align the text vertically or horizontally or dynamically configure it using `fx`| -| Text Decoration | Adds an underline, overline, line-through, or a combination of lines to selected text. | Select one of the available options - `none(default)`, `underline`, `overline`, and `strike-through` or dynamically configure it using `fx` | -| Transformation | Dictates the capitalization of text. | Select one of the available options - `none (default)`, `uppercase`, `lowercase`, `capitalize` or dynamically configure it using `fx`| -| Letter spacing | Determines the space between each letter. | Enter a number as the value (example: `15`) or dynamically configure it using `fx`| -| Word spacing | Determines the space between each word. | Enter a number as the value (example: `15`) or dynamically configure it using `fx`| -| Font variant | Adjusts the text appearance by applying font variations. | Select one of the available options - `normal`, `inherit`, `small-caps`, `initial` or dynamically configure it using `fx`| +| Size | Dimensions of the characters in a font. | Enter any number between `1-100` or dynamically configure it using **fx**. | +| Weight | Determines how bold or light your text will appear. | Select from `light`, `regular`, `semi-bold` or `bold` or dynamically configure it using **fx**. | +| Style | Allows you to apply styles like italic or normal, altering the overall look of the text content. | Select from `normal`, `italic` or `oblique` or dynamically configure it using **fx**. | +| Color | Sets the color of the text. | Choose a color using the color picker or dynamically configure it using **fx**. | +| Scroll | Creates a scroll bar if the text exceeds the component's dimensions. | Choose between `enable` or `disable` or dynamically configure it using **fx**. | +| Line Height | Determines the vertical space between lines of text within an element. | Enter a number as the value (example: `1.5`) or dynamically configure it using **fx**.| +| Text Indent | Commonly used to create an indentation effect. | Enter a number as the value (example: `10`) or dynamically configure it using **fx**.| +| Alignment | Sets the alignment of the text. | Select the available options to align the text vertically or horizontally or dynamically configure it using **fx**.| +| Text Decoration | Adds an underline, overline, line-through, or a combination of lines to selected text. | Select one of the available options - `none(default)`, `underline`, `overline`, and `strike-through` or dynamically configure it using **fx**. | +| Transformation | Dictates the capitalization of text. | Select one of the available options - `none (default)`, `uppercase`, `lowercase`, `capitalize` or dynamically configure it using **fx**.| +| Letter spacing | Determines the space between each letter. | Enter a number as the value (example: `15`) or dynamically configure it using **fx**.| +| Word spacing | Determines the space between each word. | Enter a number as the value (example: `15`) or dynamically configure it using **fx**.| +| Font variant | Adjusts the text appearance by applying font variations. | Select one of the available options - `normal`, `inherit`, `small-caps`, `initial` or dynamically configure it using **fx**.| @@ -96,9 +93,9 @@ Makes the component visible in mobile view. You can set it with the toggle butto |
    Field Property
    |
    Description
    |
    Configuration Options
    | |:----------------|:------------|:--------------| -| Background | Sets the background color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code | -| Border | Sets the border color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code | -| 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 | Adds padding to the component | Select `None` for no padding and `Default` for standard padding +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| 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 | Adds padding to the component. | Select `None` for no padding and `Default` for standard padding. | diff --git a/docs/docs/widgets/toggle-switch-v2.md b/docs/docs/widgets/toggle-switch-v2.md index dd9efbe156..80928a871a 100644 --- a/docs/docs/widgets/toggle-switch-v2.md +++ b/docs/docs/widgets/toggle-switch-v2.md @@ -8,7 +8,7 @@ The **Toggle Switch** component can be used for binary choices, such as turning
    :::info -To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/2.43.0/widgets/toggle-switch)** document. +To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/widgets/toggle-switch)** document. ::: ## Properties diff --git a/docs/docs/widgets/toggle-switch.md b/docs/docs/widgets/toggle-switch.md index dc4aeb5dd4..67b7bd9674 100644 --- a/docs/docs/widgets/toggle-switch.md +++ b/docs/docs/widgets/toggle-switch.md @@ -8,7 +8,7 @@ The **Toggle Switch** component can be used for binary choices, such as turning
    :::info -To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/2.43.0/widgets/toggle-switch)** document. +To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/widgets/toggle-switch)** document. ::: ## Properties diff --git a/docs/docs/workflows/how-to/trigger-from-app.md b/docs/docs/workflows/how-to/trigger-from-app.md new file mode 100644 index 0000000000..b05e16d65f --- /dev/null +++ b/docs/docs/workflows/how-to/trigger-from-app.md @@ -0,0 +1,41 @@ +--- +id: trigger-workflow-from-app +title: Trigger Workflows Within ToolJet +--- + +This guide will show you how to set up a workflow and trigger it from a ToolJet application. +
    + +## Create Workflow + +To create a workflow follow the following steps: + +1. Navigate to the Workflows Section from the navigation bar on the dashboard. + +Navigate to Workflow Section + +2. Click on **Create new workflow**, enter a unique name for your workflow, and click on **+Create workflow** to create the workflow. + +Create a new workflow + +3. Configure your workflow. You can refer to the **[workflow overview documentation](/docs/workflows/overview)** to learn how you can configure a workflow. + +Configure workflow + +
    + +
    + +## Configure Workflow Query + +1. Within your ToolJet application, create a new query and select **Run Workflow**. +Create a workflow query + +2. Select your workflow from the dropdown and configure the parameters (if required). +Configure the Query + +3. Now, you can trigger this workflow by clicking on the **Run** button or using events. +Add event handler + +
    + diff --git a/docs/docs/workflows/how-to/trigger-using-scheduler.md b/docs/docs/workflows/how-to/trigger-using-scheduler.md new file mode 100644 index 0000000000..ba25859a6b --- /dev/null +++ b/docs/docs/workflows/how-to/trigger-using-scheduler.md @@ -0,0 +1,77 @@ +--- +id: trigger-workflow-using-scheduler +title: Trigger Workflows Using Scheduler +--- + +ToolJet allows workflows to be triggered automatically at regular intervals or at specific scheduled times. Users can also specify the timezone to ensure that schedules align with local time. + +## Running Workflow at Schedule Intervals + +1. Create a workflow. Refer to the [Workflow Overview](/docs/workflows/overview) guide to create a new workflow. + +Create a Workflow + +2. Navigate to the Triggers section on the left panel. + +Trigger Panel on the Left + +3. Click on **Schedules**. And then click on **+ New schedule**. + +Adding a new schedule + +4. Select **Interval** as the Label. + +Navigate to Workflow Section + +5. Fill the required fields. + - **Timezone**: Select the local timezone on which you want to trigger the workflow. + - **Run every**: Select the interval when you want to run the workflow. + - **Environment**: Select the environement on which you want to run the workflow. + +Navigate to Workflow Section + +6. Click on **+ Create schedule** to create and save the schedule. + +Navigate to Workflow Section + +7. By default the schedule is inactive, toggle the switch to activate the schedule. + +Navigate to Workflow Section + + +## Running Workflow on a Cron Schedule + +You can use Cron Syntax to configure a schedule. ToolJet offers an graphical user interface to configure corn schedule. + +1. Create a workflow. You can refer to the [Workflow Overview](/docs/workflows/overview) guide to create the workflow. + +Create a Workflow + +2. Navigate to the Triggers section on the left panel. + +Trigger Panel on the Left + +3. Click on **Schedules**. And then click on **+ New schedule**. + +Adding a new schedule + +4. Select **Cron** as the Label. + +Navigate to Workflow Section + +5. Fill the required fields. + - **Timezone**: Select the local timezone on which you want to trigger the workflow. + - Schedule when you want to trigger the workflow. + - **Environment**: Select the environement on which you want to run the workflow. + +Navigate to Workflow Section + +In the above image the workflow is schduled to trigger at the 15th minute of every hour, you can check that below the environment field as well. You can refer to **[this](https://crontab.guru/)** website to generate a cron schedule. + +6. Click on **+ Create schedule** to create and save the schedule. + +Navigate to Workflow Section + +7. By default the schedule is inactive, toggle the switch to activate the schedule. + +Navigate to Workflow Section diff --git a/docs/docs/workflows/how-to/trigger-using-webhook.md b/docs/docs/workflows/how-to/trigger-using-webhook.md new file mode 100644 index 0000000000..c815d01b93 --- /dev/null +++ b/docs/docs/workflows/how-to/trigger-using-webhook.md @@ -0,0 +1,74 @@ +--- +id: trigger-using-webhook +title: Trigger Workflows Using Webhooks +--- + +This guide demonstrates how to trigger workflows using webhooks. + +
    + +## Creating a Workflow + +To create a workflow follow the following steps: + +1. Navigate to the **Workflows** Section on the dashboard. + +Navigate to Workflow Section + +2. Click on **Create new workflow**, enter a unique name for your workflow and click on **+ Create workflow** to create the workflow. + +Create a new workflow + +3. Configure your workflow. You can refer to the **[workflow overview documentation](/docs/workflows/overview)** to learn how you can configure a workflow. + +Configure workflow + +4. Navigate to the Triggers section. + +Webhook option on the left panel + +5. Click on **Webhooks**. By default, the webhook trigger is disabled. Toggle the switch to **enable** the webhook trigger. Refer to the [trigger documentation](/docs/workflows/workflow-triggers#webhooks) for more information. + +Enable Webhook + +6. Add **Parameters** to the workflow by clicking the **+ Add parameter** button. + +Add parameters to your webhook + +7. Copy the **Endpoint URL** and **API token**. + +Copy URL and API Token + +
    + +
    + +## Triggering a Webhook + +Let's take a look at an example of triggering a webhook using **Postman**. + +1. Visit [Postman](https://www.postman.com/), and click **New Request**. + +Postman preview + +2. Select the **POST** Method and paste the **Endpoint URL** that was copied earlier. + +Paste URL in Postman + +3. Navigate to the **Authorization** tab, select **Bearer Token** as the **Auth Type**, and enter the **API token**. + +Enter the API Token + +4. Go to the **Body** tab, select **Raw**, and enter the required parameters in JSON format. + +Enter the parameters in postman + +5. Click on **Send** to trigger the webhook. It will fetch the response from the created workflow. + +Final Response + +
    + +This was a basic example of how you can trigger workflows using webhooks. You can use webhooks to connect ToolJet to external applications and services for advanced use-cases and event-driven automation. + +If you want to learn how to trigger workflows withing ToolJet, refer to **[this guide](/docs/workflows/trigger-workflow-from-app)**. \ No newline at end of file diff --git a/docs/docs/workflows/overview.md b/docs/docs/workflows/overview.md index 3c893c5f6b..9711bacd11 100644 --- a/docs/docs/workflows/overview.md +++ b/docs/docs/workflows/overview.md @@ -3,12 +3,18 @@ id: overview title: Overview --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +

    -## Introduction - ToolJet Workflows enable users to create complex, data-centric automations using a visual, node-based interface. It extends ToolJet's capabilities beyond building user interfaces, allowing developers and business users to automate processes, integrate data from various sources, and execute custom logic without writing extensive code.
    diff --git a/docs/docs/workflows/results.md b/docs/docs/workflows/results.md index 9505bbef49..11e9ccfc9e 100644 --- a/docs/docs/workflows/results.md +++ b/docs/docs/workflows/results.md @@ -23,61 +23,6 @@ return ({generateCSVData})
    -## Returning Data From Multiple Nodes -You can also return data from other nodes. Either return the complete data set or specify only the required portions, as demonstrated below: - -```js -return - ({sales: getSalesData.data, - inventory: getInventory.data, - csv: generateCSVData.data}) -``` - -
    - Multi Node Response -
    - -## Fine Tuning Your Response Using JavaScript -Refine your response by manipulating the data using JavaScript functions. For example, the slice function can be used to select a subset of data: - -```js -return - ({sales: getSalesData.data.slice(0,5), - inventory: getInventory.data.slice(0,5), - csv: generateCSVData.data}) -``` - -
    - Transformed Response -
    - -## Workflow Execution - -When executing workflows with triggers, the configured data in the **Response** node will be included in the API response. --- -id: results -title: Configuring Response ---- - -Users have the flexibility to customize the response returned by workflows. The **Response** node enables configuration of your output through JavaScript code. Each workflow can have multiple response nodes. - -## Return Data from a Single Node -Consider a workflow that combines sales data (from the *getSalesData* node) with inventory data (from the *getInventory* node) via a JavaScript operation (in the *generateCSVData* node). - -
    - Response Node Preview -
    - -Within the **Response** node, specify the output by using a return statement that encapsulates an object within parentheses: - -```js -return ({generateCSVData}) -``` - -
    - Single Node Response -
    - - ## Returning Data From Multiple Nodes You can also return data from other nodes. Either return the complete data set or specify only the required portions, as demonstrated below: diff --git a/docs/docs/workflows/triggers.md b/docs/docs/workflows/triggers.md index 6548eb6b33..ecd7746a42 100644 --- a/docs/docs/workflows/triggers.md +++ b/docs/docs/workflows/triggers.md @@ -3,7 +3,7 @@ id: workflow-triggers title: Triggers --- -Triggers can be used to execute a workflow. Currently, ToolJet supports two types of triggers: [Webhooks](#webhooks) and [Manual](#manual). +Triggers can be used to execute a workflow. Currently, ToolJet supports three types of triggers: webhooks, scheduled triggers, and manual triggers.
    Triggers @@ -19,7 +19,7 @@ A webhook trigger allows you to run the workflow when a webhook is received. You
    -### Creating a Webhook Trigger +#### Creating a Webhook Trigger - Click on the **Triggers** option in the left panel to open the Triggers tab.
    @@ -122,6 +122,26 @@ For Virtual Private Clouds (VPCs), restrict access only to the `{TOOLJET_HOST}/a
    +## Scheduler + +You can automate workflow execution by adding scheduled triggers that run at regular intervals. Use **Interval mode** to set the frequency with predefined options or **Cron mode** for more granular control with cron syntax. Additionally, you can specify a timezone to ensure the schedule aligns with local time. + +#### Interval Mode + +Interval mode is ideal for simple schedules. For example, you can trigger tasks every 10 minutes, run hourly updates, or initiate weekly routines. Just specify the interval in minutes, hours, days, weeks, or months to suit your needs. + +
    + Scheduler - Interval Mode +
    + +#### Cron Mode + +Cron mode offers precise scheduling using cron syntax. It’s perfect for tasks like running workflows daily at 3:15 AM, triggering actions every 15th of the month, or scheduling processes for weekdays only. With cron expressions like 0 9 * * 1 (every Monday at 9 AM), you can fine-tune your triggers with ease. + +
    + Scheduler - Cron Mode +
    + ## Manual Manual triggers can be used to run a workflow manually from the ToolJet apps. Manual triggers work similar to the queries of a data source. You can add a trigger to an application from the query panel. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index 29636123b7..46df661581 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -16,21 +16,21 @@ 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.com', + url: 'https://docs.tooljet.ai', baseUrl: '/', onBrokenLinks: 'ignore', onBrokenMarkdownLinks: 'warn', - favicon: 'img/tooljet-favicon.svg', + favicon: 'img/tooljet-ai-favicon.svg', organizationName: 'ToolJet', // Usually your GitHub org/user name. projectName: 'ToolJet', // Usually your repo name. themeConfig: { - image: 'img/tooljet-og-image.png', + image: 'img/tooljet-ai-og-image.png', announcementBar: { id: 'support_us', content: - '⭐️ If you like ToolJet, give it a star on GitHub and follow us on Twitter', - backgroundColor: '#4D72DA', - textColor: '#ffffff', + 'Star our repository on GitHub to stay updated with new features and contribute to our platform!', + backgroundColor: '#ECF0FE', + textColor: '#4368E3', isCloseable: true, }, docs: { @@ -46,9 +46,9 @@ module.exports = { logo: { href: '/docs/', alt: 'ToolJet Logo', - src: 'img/Logomark.svg', - srcDark: `img/Logomark_white.svg`, - width: 90 + src: 'img/docs_logo.svg', + srcDark: `img/docs_logo_dark.svg`, + width: 120 }, items: [ { @@ -66,7 +66,7 @@ module.exports = { 'aria-label': 'GitHub repository', }, { - href: 'https://tooljet.com/slack', + href: 'https://tooljet.ai/slack', position: 'right', className: 'navbar-social-link navbar-slack-logo', 'aria-label': 'Slack workspace', @@ -77,6 +77,20 @@ module.exports = { className: 'navbar-social-link navbar-twitter-logo', 'aria-label': 'Twitter account', }, + { + href: 'https://app.tooljet.ai', + position: 'right', + label: 'Sign in', + className: 'navbar-signin', + 'aria-label': 'Signin to ToolJet', + }, + { + href: 'https://tooljet.ai', + position: 'right', + label: 'Website', + className: 'navbar-website', + 'aria-label': 'ToolJet website', + }, ], }, footer: { @@ -90,7 +104,7 @@ module.exports = { items: [ { label: 'Slack', - href: 'https://tooljet.com/slack', + href: 'https://tooljet.ai/slack', }, ], }, @@ -113,7 +127,11 @@ module.exports = { }, ], copyright: `Copyright © ${new Date().getFullYear()} ToolJet Solutions, Inc. - `, + + + + + `, }, algolia: { appId: 'O8HQRLI0WA', @@ -132,12 +150,22 @@ module.exports = { // Please change this to your repo. editUrl: 'https://github.com/ToolJet/Tooljet/blob/develop/docs/', includeCurrentVersion: true, - lastVersion: '2.50.0-LTS', + lastVersion: '3.0.0-LTS', versions: { - current : { - label: '3.0.0-Beta 🚧', + current: { + label: '3.1.0-Beta 🚧', path: 'beta', + banner: 'none', + badge: false }, + "2.50.0-LTS": { + banner: 'none', + badge: false + }, + "3.0.0-LTS": { + banner: 'none', + badge: false + } } }, theme: { @@ -168,6 +196,30 @@ module.exports = { to: '/docs/', from: '/', }, + { + to: '/docs/security/constants/', + from: '/docs/org-management/workspaces/workspace_constants/', + }, + { + to: '/docs/development-lifecycle/gitsync/overview', + from: '/docs/gitsync', + }, + { + to: '/docs/user-management/role-based-access/access-control', + from: '/docs/tutorial/manage-users-groups', + }, + { + to: '/docs/security/constants/variables/', + from: '/docs/org-management/workspaces/workspace-variables-migration', + }, + { + to: '/docs/tj-setup/smtp-setup/configuration', + from: '/docs/org-management/smtp-configuration/', + }, + { + to: '/docs/user-management/authentication/self-hosted/instance-login/', + from: '/docs/enterprise/superadmin', + } ], }, ], diff --git a/docs/package-lock.json b/docs/package-lock.json index 64b5a83f81..f23d4145b6 100644 --- a/docs/package-lock.json +++ b/docs/package-lock.json @@ -8,21 +8,25 @@ "name": "docs", "version": "0.0.0", "dependencies": { - "@docusaurus/core": "^3.5.2", - "@docusaurus/plugin-client-redirects": "^3.5.2", - "@docusaurus/plugin-google-gtag": "^3.5.2", - "@docusaurus/plugin-sitemap": "^3.5.2", - "@docusaurus/preset-classic": "^3.5.2", + "@docusaurus/core": "^3.6.3", + "@docusaurus/plugin-client-redirects": "^3.6.3", + "@docusaurus/plugin-google-gtag": "^3.6.3", + "@docusaurus/plugin-sitemap": "^3.6.3", + "@docusaurus/preset-classic": "^3.6.3", "@mdx-js/react": "^3.0.1", + "autoprefixer": "^10.4.20", "clsx": "^2.0.0", + "lucide-react": "^0.436.0", "plugin-image-zoom": "github:flexanalytics/plugin-image-zoom", + "postcss": "^8.4.41", "prism-react-renderer": "^2.1.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "tailwindcss": "^3.4.12" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.5.2", - "@docusaurus/types": "^3.5.2" + "@docusaurus/module-type-aliases": "^3.6.3", + "@docusaurus/types": "^3.6.3" }, "engines": { "node": "18.18.2", @@ -30,31 +34,31 @@ } }, "node_modules/@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", "dependencies": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", "dependencies": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.7" }, "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", @@ -62,9 +66,9 @@ } }, "node_modules/@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" @@ -91,6 +95,20 @@ "@algolia/cache-common": "4.24.0" } }, + "node_modules/@algolia/client-abtesting": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.16.0.tgz", + "integrity": "sha512-fqQ2Szc6zxqXyQF8Vr64QMVoqFHHDsR5gEr/Eki+q+lgERvGr3YXruiB7Xs8rDTXP6+NC3tM2sZjdaEXW/P+6Q==", + "dependencies": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/client-account": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", @@ -151,10 +169,23 @@ } }, "node_modules/@algolia/client-common": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.2.5.tgz", - "integrity": "sha512-ITE85veJWwClnoNyv7Zydh9U0eKA82cDy8pLw+2hzL+zlzFIvV68ihGOEQ/kXt8N4v+R4MFzvsxnIpMruQzEug==", - "peer": true, + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.16.0.tgz", + "integrity": "sha512-4Bzvs5cdZ2MTMQvDlsmruZfyEk/NhSdsc+tA3vH9iMGIRzOj7Y9mwITpJM+hLFhbSE9Q0p0ojTF03RoDVclsZA==", + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-insights": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.16.0.tgz", + "integrity": "sha512-vIiOK8+exA0AOlR9mRDUr148Rx3WNU73whaJtciYoqeHoy/utib+m3Lw1+6s0o7OuPb/wGRoJ1l5vQuVezVHgA==", + "dependencies": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, "engines": { "node": ">= 14.0.0" } @@ -178,15 +209,29 @@ "@algolia/transporter": "4.24.0" } }, - "node_modules/@algolia/client-search": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.2.5.tgz", - "integrity": "sha512-OVDLzm5BEUbJmjfMm7b0Xx8vkK+NyEh7whPHuap2qy0x7RxQDLMXjiKsBbt1WNq+9nfX6+M/f2t0CJ8ENVuyYQ==", - "peer": true, + "node_modules/@algolia/client-query-suggestions": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.16.0.tgz", + "integrity": "sha512-ygek1jdrAbw/tUIyHkK4YrH3uQoRmBbSUvZl8NBbz0S0GxjR6bhPbDZT8ny1INIMCA3KlYHPZAlCS+02RtvDyg==", "dependencies": { - "@algolia/client-common": "5.2.5", - "@algolia/requester-browser-xhr": "5.2.5", - "@algolia/requester-node-http": "5.2.5" + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.16.0.tgz", + "integrity": "sha512-mVnkDZjpbiqdXRz0NrQlx6+QsnKYENuruYyjTJNcG3qAe015tvGAHcvvzRT78ZxETS7WjruWSlXBcL5llycNsQ==", + "dependencies": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" }, "engines": { "node": ">= 14.0.0" @@ -197,6 +242,20 @@ "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, + "node_modules/@algolia/ingestion": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.16.0.tgz", + "integrity": "sha512-nmLcQYeG1YYRDAv2U+ebBD23mBSfkmhSwdDx2DBzqupStNrYWqYHsNgATLTMtMUTfgD0nSgBl5c+03yXg5WpiQ==", + "dependencies": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/logger-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", @@ -210,6 +269,20 @@ "@algolia/logger-common": "4.24.0" } }, + "node_modules/@algolia/monitoring": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.16.0.tgz", + "integrity": "sha512-tiDkoQOO/d4o8W6dEnpCIMCWp6mwdjqZ+Q51QiCKvz1vcYU/YEx4lleY9oadjAMoOVWZHL6ItEF1LbQHvVNogQ==", + "dependencies": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/@algolia/recommend": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", @@ -264,12 +337,11 @@ } }, "node_modules/@algolia/requester-browser-xhr": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.2.5.tgz", - "integrity": "sha512-Ri73PphNy1ceig94xJW9bPdN7uIYFAjpsABpp2Fsun4DmeZD5a4rMCNwwOXXsbC8h+lUzW34zpUf+h4Nk+eaqA==", - "peer": true, + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.16.0.tgz", + "integrity": "sha512-s/ty3lN0Bk9EC6VId/JO+AMOy6s0Hb3IpXUIa4iKKrH7p3n+lTEtwltVjFVW0fq9JfvQdECoaM951K23G/nRtQ==", "dependencies": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.16.0" }, "engines": { "node": ">= 14.0.0" @@ -280,13 +352,23 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" }, - "node_modules/@algolia/requester-node-http": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.2.5.tgz", - "integrity": "sha512-/tTdEuWcWHSe/mGMomWkuaFDoRcpfl/jvGISVTPRq3pJvM1FPAzxlh2MXge6C30aUS9bxh3V0aWwgKFCilzyMQ==", - "peer": true, + "node_modules/@algolia/requester-fetch": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.16.0.tgz", + "integrity": "sha512-E8euSKDkljYpv5QHOZQrBCMZ4W98PKHRp5Cx8JxMYyyPWQ0xkD9b1c5yvOtJJ1lufqDvcuxvrF4eRBwW+BP3QA==", "dependencies": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@algolia/requester-node-http": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.16.0.tgz", + "integrity": "sha512-gzLIQlgvvXzGExBC8xFVtsiDbenGgANQ+p/lcPO5ERs1ZNGXIqLnyqwP8amZl6YwXJEt4PPXL/p4IytBWs0jUw==", + "dependencies": { + "@algolia/client-common": "5.16.0" }, "engines": { "node": ">= 14.0.0" @@ -302,6 +384,17 @@ "@algolia/requester-common": "4.24.0" } }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -315,11 +408,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dependencies": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -327,28 +421,28 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -364,60 +458,39 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dependencies": { - "@babel/types": "^7.24.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -439,18 +512,16 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" }, "engines": { @@ -461,12 +532,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" }, "engines": { @@ -477,9 +548,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "dependencies": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -491,69 +562,38 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dependencies": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -563,32 +603,32 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -598,13 +638,13 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -613,171 +653,74 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "dependencies": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dependencies": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "dependencies": { + "@babel/types": "^7.26.3" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -786,12 +729,26 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -801,11 +758,11 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -815,13 +772,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -831,12 +788,12 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -856,42 +813,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -903,23 +824,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -929,11 +839,11 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -942,128 +852,12 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1073,11 +867,11 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1102,11 +896,11 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1116,14 +910,13 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1133,13 +926,13 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "dependencies": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1149,11 +942,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1163,11 +956,11 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1177,12 +970,12 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1192,13 +985,12 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1208,17 +1000,15 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" }, "engines": { @@ -1229,12 +1019,12 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1244,11 +1034,11 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1258,12 +1048,12 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1273,11 +1063,11 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1286,13 +1076,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1302,12 +1106,11 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1317,12 +1120,11 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1332,12 +1134,12 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1347,13 +1149,13 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1363,12 +1165,11 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1378,11 +1179,11 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1392,12 +1193,11 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1407,11 +1207,11 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1421,12 +1221,12 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1436,13 +1236,12 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1452,14 +1251,14 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "dependencies": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1469,12 +1268,12 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "dependencies": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1484,12 +1283,12 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1499,11 +1298,11 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1513,12 +1312,11 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1528,12 +1326,11 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1543,14 +1340,13 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "dependencies": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1560,12 +1356,12 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1575,12 +1371,11 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1590,13 +1385,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1606,11 +1400,11 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1620,12 +1414,12 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1635,14 +1429,13 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1652,11 +1445,11 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1666,11 +1459,11 @@ } }, "node_modules/@babel/plugin-transform-react-constant-elements": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", - "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", + "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1680,11 +1473,11 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1694,15 +1487,15 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1712,11 +1505,11 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1726,12 +1519,12 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1741,11 +1534,11 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" }, "engines": { @@ -1755,12 +1548,27 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1770,14 +1578,14 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "dependencies": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" }, @@ -1789,11 +1597,11 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1803,12 +1611,12 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1818,11 +1626,11 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1832,11 +1640,11 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1846,11 +1654,11 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1860,14 +1668,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", - "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", + "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1877,11 +1686,11 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1891,12 +1700,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1906,12 +1715,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1921,12 +1730,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -1936,90 +1745,78 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "dependencies": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" }, "engines": { @@ -2043,16 +1840,16 @@ } }, "node_modules/@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2062,15 +1859,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2079,26 +1876,21 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, "node_modules/@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", - "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", + "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", "dependencies": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" @@ -2107,37 +1899,29 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/runtime-corejs3/node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "dependencies": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2146,13 +1930,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2167,6 +1950,1062 @@ "node": ">=0.1.90" } }, + "node_modules/@csstools/cascade-layer-name-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-calc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.0.tgz", + "integrity": "sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz", + "integrity": "sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-cascade-layers/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz", + "integrity": "sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-color-mix-function": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz", + "integrity": "sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-content-alt-text": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", + "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-exponential-functions": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz", + "integrity": "sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gamut-mapping": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz", + "integrity": "sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz", + "integrity": "sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz", + "integrity": "sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", + "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-initial": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz", + "integrity": "sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-light-dark-function": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", + "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-logical-viewport-units": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-minmax": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz", + "integrity": "sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz", + "integrity": "sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", + "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-random-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz", + "integrity": "sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-relative-color-syntax": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz", + "integrity": "sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-scope-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@csstools/postcss-sign-functions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz", + "integrity": "sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz", + "integrity": "sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", + "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/color-helpers": "^5.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz", + "integrity": "sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", @@ -2176,19 +3015,19 @@ } }, "node_modules/@docsearch/css": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", - "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==" + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz", + "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==" }, "node_modules/@docsearch/react": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", - "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz", + "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==", "dependencies": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.1", - "algoliasearch": "^4.19.1" + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.0", + "algoliasearch": "^5.12.0" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 19.0.0", @@ -2211,58 +3050,169 @@ } } }, - "node_modules/@docusaurus/core": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", - "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", + "node_modules/@docsearch/react/node_modules/@algolia/client-analytics": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.16.0.tgz", + "integrity": "sha512-8HqIoGUwjc/XqjA+AjpRvtB40QzQ067qHuJujkR0k6WBLEM3OiB30FOfLZLabxnPIZgU55zmQ8exe+0WpgyKqA==", "dependencies": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/client-personalization": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.16.0.tgz", + "integrity": "sha512-psAzXJgzqPMCID31wrWVRg19K+h5TsLKSv6YfzQhB5munnj4IAE2lxEet2hDkji7vPA0WWpXGAW5Tx0scyMvkA==", + "dependencies": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@docsearch/react/node_modules/@algolia/recommend": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.16.0.tgz", + "integrity": "sha512-hehiMLsDnXnnZGXXKdeXUsvP3PwqAKL/rT4XutkYXsqQ1Jnv4EFrMOY8morUT8nlPv7d1bHPF+bTiNaKvkbBbA==", + "dependencies": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@docsearch/react/node_modules/algoliasearch": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.16.0.tgz", + "integrity": "sha512-0zWz0LGfB0MLrhcnyGDpvVWPSsZnECNU6V/GPtNkHHSgaUj/7i+j36bZm6HClCvo8GvuxbN+ccbFREWUouHlfg==", + "dependencies": { + "@algolia/client-abtesting": "5.16.0", + "@algolia/client-analytics": "5.16.0", + "@algolia/client-common": "5.16.0", + "@algolia/client-insights": "5.16.0", + "@algolia/client-personalization": "5.16.0", + "@algolia/client-query-suggestions": "5.16.0", + "@algolia/client-search": "5.16.0", + "@algolia/ingestion": "1.16.0", + "@algolia/monitoring": "1.16.0", + "@algolia/recommend": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@docusaurus/babel": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.6.3.tgz", + "integrity": "sha512-7dW9Hat9EHYCVicFXYA4hjxBY38+hPuCURL8oRF9fySRm7vzNWuEOghA1TXcykuXZp0HLG2td4RhDxCvGG7tNw==", + "dependencies": { + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/bundler": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.6.3.tgz", + "integrity": "sha512-47JLuc8D4wA+6VOvmMd5fUC9rFppBQpQOnxDYiVXffm/DeV/wmm3sbpNd5Y+O+G2+nevLTRnvCm/qyancv0Y3A==", + "dependencies": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.6.3", + "@docusaurus/cssnano-preset": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "babel-loader": "^9.2.1", "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", "css-loader": "^6.8.1", "css-minimizer-webpack-plugin": "^5.0.1", "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.1", + "null-loader": "^4.0.1", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "postcss-preset-env": "^10.1.0", + "react-dev-utils": "^12.0.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/faster": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/faster": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.6.3.tgz", + "integrity": "sha512-xL7FRY9Jr5DWqB6pEnqgKqcMPJOX5V0pgWXi5lCiih11sUBmcFKM7c3+GyxcVeeWFxyYSDP3grLTWqJoP4P9Vw==", + "dependencies": { + "@docusaurus/babel": "3.6.3", + "@docusaurus/bundler": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", "del": "^6.1.1", "detect-port": "^1.5.1", "escape-html": "^1.0.3", "eta": "^2.2.0", "eval": "^0.1.8", - "file-loader": "^6.2.0", "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", + "html-webpack-plugin": "^5.6.0", "leven": "^3.1.0", "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", "prompts": "^2.4.2", "react-dev-utils": "^12.0.1", "react-helmet-async": "^1.3.0", @@ -2273,17 +3223,14 @@ "react-router-dom": "^5.3.4", "rtl-detect": "^1.0.4", "semver": "^7.5.4", - "serve-handler": "^6.1.5", + "serve-handler": "^6.1.6", "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", "tslib": "^2.6.0", "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" }, "bin": { "docusaurus": "bin/docusaurus.mjs" @@ -2312,9 +3259,9 @@ } }, "node_modules/@docusaurus/cssnano-preset": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", - "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.3.tgz", + "integrity": "sha512-qP7SXrwZ+23GFJdPN4aIHQrZW+oH/7tzwEuc/RNL0+BdZdmIjYQqUxdXsjE4lFxLNZjj0eUrSNYIS6xwfij+5Q==", "dependencies": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.4.38", @@ -2326,9 +3273,9 @@ } }, "node_modules/@docusaurus/logger": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", - "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.6.3.tgz", + "integrity": "sha512-xSubJixcNyMV9wMV4q0s47CBz3Rlc5jbcCCuij8pfQP8qn/DIpt0ks8W6hQWzHAedg/J/EwxxUOUrnEoKzJo8g==", "dependencies": { "chalk": "^4.1.2", "tslib": "^2.6.0" @@ -2338,13 +3285,13 @@ } }, "node_modules/@docusaurus/mdx-loader": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", - "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.6.3.tgz", + "integrity": "sha512-3iJdiDz9540ppBseeI93tWTDtUGVkxzh59nMq4ignylxMuXBLK8dFqVeaEor23v1vx6TrGKZ2FuLaTB+U7C0QQ==", "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -2376,11 +3323,11 @@ } }, "node_modules/@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.3.tgz", + "integrity": "sha512-MjaXX9PN/k5ugNvfRZdWyKWq4FsrhN4LEXaj0pEmMebJuBNlFeGyKQUa9DRhJHpadNaiMLrbo9m3U7Ig5YlsZg==", "dependencies": { - "@docusaurus/types": "3.5.2", + "@docusaurus/types": "3.6.3", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2394,15 +3341,15 @@ } }, "node_modules/@docusaurus/plugin-client-redirects": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.5.2.tgz", - "integrity": "sha512-GMU0ZNoVG1DEsZlBbwLPdh0iwibrVZiRfmdppvX17SnByCVP74mb/Nne7Ss7ALgxQLtM4IHbXi8ij90VVjAJ+Q==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.6.3.tgz", + "integrity": "sha512-fQDCxoJCO1jXNQGQmhgYoX3Yx+Z2xSbrLf3PBET6pHnsRk6gGW/VuCHcfQuZlJzbTxN0giQ5u3XcQQ/LzXftJA==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -2417,18 +3364,18 @@ } }, "node_modules/@docusaurus/plugin-content-blog": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", - "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.3.tgz", + "integrity": "sha512-k0ogWwwJU3pFRFfvW1kRVHxzf2DutLGaaLjAnHVEU6ju+aRP0Z5ap/13DHyPOfHeE4WKpn/M0TqjdwZAcY3kAw==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -2450,19 +3397,19 @@ } }, "node_modules/@docusaurus/plugin-content-docs": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", - "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.3.tgz", + "integrity": "sha512-r2wS8y/fsaDcxkm20W5bbYJFPzdWdEaTWVYjNxlHlcmX086eqQR1Fomlg9BHTJ0dLXPzAlbC8EN4XqMr3QzNCQ==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -2481,15 +3428,15 @@ } }, "node_modules/@docusaurus/plugin-content-pages": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", - "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.3.tgz", + "integrity": "sha512-eHrmTgjgLZsuqfsYr5X2xEwyIcck0wseSofWrjTwT9FLOWp+KDmMAuVK+wRo7sFImWXZk3oV/xX/g9aZrhD7OA==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" @@ -2503,13 +3450,13 @@ } }, "node_modules/@docusaurus/plugin-debug": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", - "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.6.3.tgz", + "integrity": "sha512-zB9GXfIZNPRfzKnNjU6xGVrqn9bPXuGhpjgsuc/YtcTDjnjhasg38NdYd5LEqXex5G/zIorQgWB3n6x/Ut62vQ==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" @@ -2523,13 +3470,13 @@ } }, "node_modules/@docusaurus/plugin-google-analytics": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", - "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.3.tgz", + "integrity": "sha512-rCDNy1QW8Dag7nZq67pcum0bpFLrwvxJhYuVprhFh8BMBDxV0bY+bAkGHbSf68P3Bk9C3hNOAXX1srGLIDvcTA==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "tslib": "^2.6.0" }, "engines": { @@ -2541,13 +3488,13 @@ } }, "node_modules/@docusaurus/plugin-google-gtag": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", - "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.3.tgz", + "integrity": "sha512-+OyDvhM6rqVkQOmLVkQWVJAizEEfkPzVWtIHXlWPOCFGK9X4/AWeBSrU0WG4iMg9Z4zD4YDRrU+lvI4s6DSC+w==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" }, @@ -2560,13 +3507,13 @@ } }, "node_modules/@docusaurus/plugin-google-tag-manager": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", - "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.3.tgz", + "integrity": "sha512-1M6UPB13gWUtN2UHX083/beTn85PlRI9ABItTl/JL1FJ5dJTWWFXXsHf9WW/6hrVwthwTeV/AGbGKvLKV+IlCA==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "tslib": "^2.6.0" }, "engines": { @@ -2578,16 +3525,16 @@ } }, "node_modules/@docusaurus/plugin-sitemap": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", - "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.3.tgz", + "integrity": "sha512-94qOO4M9Fwv9KfVQJsgbe91k+fPJ4byf1L3Ez8TUa6TAFPo/BrLwQ80zclHkENlL1824TuxkcMKv33u6eydQCg==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" @@ -2601,23 +3548,23 @@ } }, "node_modules/@docusaurus/preset-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", - "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.6.3.tgz", + "integrity": "sha512-VHSYWROT3flvNNI1SrnMOtW1EsjeHNK9dhU6s9eY5hryZe79lUqnZJyze/ymDe2LXAqzyj6y5oYvyBoZZk6ErA==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/plugin-debug": "3.5.2", - "@docusaurus/plugin-google-analytics": "3.5.2", - "@docusaurus/plugin-google-gtag": "3.5.2", - "@docusaurus/plugin-google-tag-manager": "3.5.2", - "@docusaurus/plugin-sitemap": "3.5.2", - "@docusaurus/theme-classic": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-search-algolia": "3.5.2", - "@docusaurus/types": "3.5.2" + "@docusaurus/core": "3.6.3", + "@docusaurus/plugin-content-blog": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/plugin-content-pages": "3.6.3", + "@docusaurus/plugin-debug": "3.6.3", + "@docusaurus/plugin-google-analytics": "3.6.3", + "@docusaurus/plugin-google-gtag": "3.6.3", + "@docusaurus/plugin-google-tag-manager": "3.6.3", + "@docusaurus/plugin-sitemap": "3.6.3", + "@docusaurus/theme-classic": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-search-algolia": "3.6.3", + "@docusaurus/types": "3.6.3" }, "engines": { "node": ">=18.0" @@ -2628,26 +3575,27 @@ } }, "node_modules/@docusaurus/theme-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", - "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.6.3.tgz", + "integrity": "sha512-1RRLK1tSArI2c00qugWYO3jRocjOZwGF1mBzPPylDVRwWCS/rnWWR91ChdbbaxIupRJ+hX8ZBYrwr5bbU0oztQ==", "dependencies": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/plugin-content-blog": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/plugin-content-pages": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-translations": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.44", + "infima": "0.2.0-alpha.45", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.26", @@ -2667,14 +3615,14 @@ } }, "node_modules/@docusaurus/theme-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", - "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.6.3.tgz", + "integrity": "sha512-b8ZkhczXHDxWWyvz+YJy4t/PlPbEogTTbgnHoflYnH7rmRtyoodTsu8WVM12la5LmlMJBclBXFl29OH8kPE7gg==", "dependencies": { - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -2694,18 +3642,18 @@ } }, "node_modules/@docusaurus/theme-search-algolia": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", - "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.3.tgz", + "integrity": "sha512-rt+MGCCpYgPyWCGXtbxlwFbTSobu15jWBTPI2LHsHNa5B0zSmOISX6FWYAPt5X1rNDOqMGM0FATnh7TBHRohVA==", "dependencies": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-translations": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", "clsx": "^2.0.0", @@ -2724,9 +3672,9 @@ } }, "node_modules/@docusaurus/theme-translations": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", - "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.6.3.tgz", + "integrity": "sha512-Gb0regclToVlngSIIwUCtBMQBq48qVUaN1XQNKW4XwlsgUyk0vP01LULdqbem7czSwIeBAFXFoORJ0RPX7ht/w==", "dependencies": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" @@ -2736,9 +3684,9 @@ } }, "node_modules/@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.6.3.tgz", + "integrity": "sha512-xD9oTGDrouWzefkhe9ogB2fDV96/82cRpNGx2HIvI5L87JHNhQVIWimQ/3JIiiX/TEd5S9s+VO6FFguwKNRVow==", "dependencies": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", @@ -2747,7 +3695,7 @@ "joi": "^17.9.2", "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.88.1", + "webpack": "^5.95.0", "webpack-merge": "^5.9.0" }, "peerDependencies": { @@ -2755,13 +3703,27 @@ "react-dom": "^18.0.0" } }, - "node_modules/@docusaurus/utils": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", - "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", + "node_modules/@docusaurus/types/node_modules/webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils-common": "3.5.2", + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.6.3.tgz", + "integrity": "sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==", + "dependencies": { + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-common": "3.6.3", "@svgr/webpack": "^8.1.0", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -2783,43 +3745,28 @@ }, "engines": { "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } } }, "node_modules/@docusaurus/utils-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", - "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.6.3.tgz", + "integrity": "sha512-v4nKDaANLgT3pMBewHYEMAl/ufY0LkXao1QkFWzI5huWFOmNQ2UFzv2BiKeHX5Ownis0/w6cAyoxPhVdDonlSQ==", "dependencies": { + "@docusaurus/types": "3.6.3", "tslib": "^2.6.0" }, "engines": { "node": ">=18.0" - }, - "peerDependencies": { - "@docusaurus/types": "*" - }, - "peerDependenciesMeta": { - "@docusaurus/types": { - "optional": true - } } }, "node_modules/@docusaurus/utils-validation": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", - "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.6.3.tgz", + "integrity": "sha512-bhEGGiN5BE38h21vjqD70Gxg++j+PfYVddDUE5UFvLDup68QOcpD33CLr+2knPorlxRbEaNfz6HQDUMQ3HuqKw==", "dependencies": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -2843,6 +3790,68 @@ "@hapi/hoek": "^9.0.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/@isaacs/cliui/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -2928,9 +3937,9 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "node_modules/@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -2938,14 +3947,15 @@ "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", + "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", @@ -3017,6 +4027,15 @@ "node": ">= 8" } }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -3411,27 +4430,27 @@ } }, "node_modules/@types/eslint": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", - "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", @@ -3531,9 +4550,9 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dependencies": { "@types/unist": "*" } @@ -3567,9 +4586,9 @@ } }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "node_modules/@types/prismjs": { "version": "1.26.3", @@ -3684,9 +4703,9 @@ } }, "node_modules/@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, "node_modules/@types/ws": { "version": "8.5.10", @@ -3697,9 +4716,9 @@ } }, "node_modules/@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "dependencies": { "@types/yargs-parser": "*" } @@ -3710,138 +4729,138 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==" }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -3868,9 +4887,9 @@ } }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "bin": { "acorn": "bin/acorn" }, @@ -3878,14 +4897,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4004,9 +5015,9 @@ } }, "node_modules/algoliasearch-helper": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.4.tgz", - "integrity": "sha512-fvBCywguW9f+939S6awvRMstqMF1XXcd2qs1r1aGqL/PJ1go/DqN06tWmDVmhCDqBJanm++imletrQWf0G2S1g==", + "version": "3.22.6", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.6.tgz", + "integrity": "sha512-F2gSb43QHyvZmvH/2hxIjbk/uFdO2MguQYTFP7J+RowMW1csjIODMobEnpLI8nbLQuzZnGZdIxl5Bpy1k9+CFQ==", "dependencies": { "@algolia/events": "^4.0.1" }, @@ -4057,6 +5068,31 @@ "string-width": "^4.1.0" } }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -4090,6 +5126,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -4103,9 +5144,9 @@ } }, "node_modules/arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "node_modules/argparse": { "version": "2.0.1", @@ -4126,9 +5167,9 @@ } }, "node_modules/astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "bin": { "astring": "bin/astring" } @@ -4178,9 +5219,9 @@ } }, "node_modules/babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dependencies": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -4202,12 +5243,12 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "dependencies": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" }, "peerDependencies": { @@ -4215,23 +5256,23 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.3" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4429,9 +5470,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "funding": [ { "type": "opencollective", @@ -4447,10 +5488,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -4554,6 +5595,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, "node_modules/caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -4566,9 +5615,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "funding": [ { "type": "opencollective", @@ -4948,14 +5997,17 @@ } }, "node_modules/consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } }, "node_modules/content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==", "engines": { "node": ">= 0.6" } @@ -5032,13 +6084,13 @@ } }, "node_modules/copy-webpack-plugin/node_modules/globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dependencies": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, @@ -5071,11 +6123,11 @@ } }, "node_modules/core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", "dependencies": { - "browserslist": "^4.23.0" + "browserslist": "^4.24.2" }, "funding": { "type": "opencollective", @@ -5083,9 +6135,9 @@ } }, "node_modules/core-js-pure": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", - "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", + "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==", "hasInstallScript": true, "funding": { "type": "opencollective", @@ -5149,6 +6201,42 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-blank-pseudo/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "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", @@ -5160,6 +6248,65 @@ "postcss": "^8.0.9" } }, + "node_modules/css-has-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz", + "integrity": "sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/css-has-pseudo/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/css-loader": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", @@ -5195,12 +6342,9 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -5279,6 +6423,27 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -5317,6 +6482,21 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cssdb": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.3.tgz", + "integrity": "sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -5574,14 +6754,19 @@ } }, "node_modules/define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/del": { @@ -5675,7 +6860,7 @@ "node_modules/detect-port-alt/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/devlop": { "version": "1.1.0", @@ -5689,6 +6874,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -5700,6 +6890,11 @@ "node": ">=8" } }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "node_modules/dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -5817,9 +7012,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" + "version": "1.5.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz", + "integrity": "sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5840,9 +7035,9 @@ } }, "node_modules/emoticon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -5857,9 +7052,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -5911,6 +7106,36 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" }, + "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", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -6033,6 +7258,19 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/estree-util-to-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", @@ -6056,12 +7294,11 @@ } }, "node_modules/estree-util-value-to-estree": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", - "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.2.1.tgz", + "integrity": "sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==", "dependencies": { - "@types/estree": "^1.0.0", - "is-plain-obj": "^4.0.0" + "@types/estree": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/remcohaszing" @@ -6273,9 +7510,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6292,19 +7529,6 @@ "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-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", - "dependencies": { - "punycode": "^1.3.2" - } - }, - "node_modules/fast-url-parser/node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, "node_modules/fastq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", @@ -6347,6 +7571,28 @@ "node": ">=0.4.0" } }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -6367,11 +7613,11 @@ } }, "node_modules/file-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -6462,14 +7708,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up/node_modules/path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -6497,10 +7735,36 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "dependencies": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -6517,7 +7781,8 @@ "tapable": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">=10", + "yarn": ">=1.0.0" }, "peerDependencies": { "eslint": ">= 6", @@ -6581,12 +7846,9 @@ } }, "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -6960,17 +8222,6 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -7035,14 +8286,14 @@ } }, "node_modules/hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", + "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "hastscript": "^8.0.0", + "hastscript": "^9.0.0", "property-information": "^6.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", @@ -7066,9 +8317,9 @@ } }, "node_modules/hast-util-raw": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", - "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "dependencies": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -7116,10 +8367,23 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/hast-util-to-estree/node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/hast-util-to-estree/node_modules/style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, "node_modules/hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -7142,19 +8406,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "dependencies": { - "inline-style-parser": "0.2.3" - } - }, "node_modules/hast-util-to-parse5": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-8.0.0.tgz", @@ -7186,9 +8437,9 @@ } }, "node_modules/hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", "dependencies": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -7533,9 +8784,9 @@ } }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "engines": { "node": ">= 4" } @@ -7555,9 +8806,9 @@ } }, "node_modules/immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==", + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -7603,9 +8854,9 @@ } }, "node_modules/infima": { - "version": "0.2.0-alpha.44", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.44.tgz", - "integrity": "sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==", + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==", "engines": { "node": ">=12" } @@ -7630,9 +8881,9 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "node_modules/inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, "node_modules/interpret": { "version": "1.4.0", @@ -7683,7 +8934,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-binary-path": { "version": "2.1.0", @@ -7708,11 +8959,14 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7865,14 +9119,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "dependencies": { - "@types/estree": "*" - } - }, "node_modules/is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -7942,6 +9188,20 @@ "node": ">=0.10.0" } }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -7986,17 +9246,17 @@ } }, "node_modules/jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", "bin": { "jiti": "bin/jiti.js" } }, "node_modules/joi": { - "version": "17.12.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz", - "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dependencies": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -8022,11 +9282,14 @@ } }, "node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", "bin": { "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" } }, "node_modules/json-buffer": { @@ -8242,6 +9505,14 @@ "node": ">=10" } }, + "node_modules/lucide-react": { + "version": "0.436.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.436.0.tgz", + "integrity": "sha512-N292bIxoqm1aObAg0MzFtvhYwgQE6qnIOWx/GLj5ONgcTPH6N0fD9bVq/GfdeC9ZORBXozt/XeEKDpiB3x3vlQ==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", @@ -8254,9 +9525,9 @@ } }, "node_modules/markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -8308,9 +9579,9 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -8331,9 +9602,9 @@ } }, "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8392,9 +9663,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "dependencies": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -8408,9 +9679,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8427,9 +9698,9 @@ } }, "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8519,9 +9790,9 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -8536,9 +9807,9 @@ } }, "node_modules/mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -8550,7 +9821,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, @@ -8590,9 +9860,9 @@ } }, "node_modules/mdast-util-to-hast": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -8610,15 +9880,16 @@ } }, "node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" @@ -8696,9 +9967,9 @@ } }, "node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", "funding": [ { "type": "GitHub Sponsors", @@ -8730,9 +10001,9 @@ } }, "node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", "funding": [ { "type": "GitHub Sponsors", @@ -8763,9 +10034,9 @@ } }, "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -8782,9 +10053,9 @@ } }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8801,9 +10072,9 @@ } }, "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8816,9 +10087,9 @@ ] }, "node_modules/micromark-extension-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", - "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -8834,9 +10105,9 @@ } }, "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -8853,9 +10124,9 @@ } }, "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8872,9 +10143,9 @@ } }, "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8902,9 +10173,9 @@ } }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8921,9 +10192,9 @@ } }, "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8955,9 +10226,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -8970,9 +10241,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -8989,9 +10260,9 @@ } }, "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9004,9 +10275,9 @@ ] }, "node_modules/micromark-extension-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "dependencies": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -9023,9 +10294,9 @@ } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9042,9 +10313,9 @@ } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9061,9 +10332,9 @@ } }, "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9076,9 +10347,9 @@ ] }, "node_modules/micromark-extension-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -9093,9 +10364,9 @@ } }, "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9108,9 +10379,9 @@ ] }, "node_modules/micromark-extension-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -9124,9 +10395,9 @@ } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9143,9 +10414,9 @@ } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9162,9 +10433,9 @@ } }, "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9189,9 +10460,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "dependencies": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -9205,9 +10476,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9224,9 +10495,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9243,9 +10514,9 @@ } }, "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9283,9 +10554,9 @@ } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9302,9 +10573,9 @@ } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9321,9 +10592,9 @@ } }, "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9336,9 +10607,9 @@ ] }, "node_modules/micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", "dependencies": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -9347,6 +10618,7 @@ "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" @@ -9357,9 +10629,9 @@ } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9376,9 +10648,9 @@ } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9395,9 +10667,9 @@ } }, "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9461,9 +10733,9 @@ } }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9480,9 +10752,9 @@ } }, "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9495,9 +10767,9 @@ ] }, "node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "funding": [ { "type": "GitHub Sponsors", @@ -9515,9 +10787,9 @@ } }, "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9534,9 +10806,9 @@ } }, "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9549,9 +10821,9 @@ ] }, "node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "funding": [ { "type": "GitHub Sponsors", @@ -9570,9 +10842,9 @@ } }, "node_modules/micromark-factory-label/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9589,9 +10861,9 @@ } }, "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9604,9 +10876,9 @@ ] }, "node_modules/micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", "funding": [ { "type": "GitHub Sponsors", @@ -9620,6 +10892,7 @@ "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -9628,10 +10901,29 @@ "vfile-message": "^4.0.0" } }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9648,9 +10940,9 @@ } }, "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9697,9 +10989,9 @@ ] }, "node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "funding": [ { "type": "GitHub Sponsors", @@ -9718,9 +11010,9 @@ } }, "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9737,9 +11029,9 @@ } }, "node_modules/micromark-factory-title/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9756,9 +11048,9 @@ } }, "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9771,9 +11063,9 @@ ] }, "node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "funding": [ { "type": "GitHub Sponsors", @@ -9792,9 +11084,9 @@ } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -9811,9 +11103,9 @@ } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9830,9 +11122,9 @@ } }, "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9879,9 +11171,9 @@ ] }, "node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "funding": [ { "type": "GitHub Sponsors", @@ -9897,9 +11189,9 @@ } }, "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9912,9 +11204,9 @@ ] }, "node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9932,9 +11224,9 @@ } }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9951,9 +11243,9 @@ } }, "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -9966,9 +11258,9 @@ ] }, "node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "funding": [ { "type": "GitHub Sponsors", @@ -9985,9 +11277,9 @@ } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "funding": [ { "type": "GitHub Sponsors", @@ -10003,9 +11295,9 @@ } }, "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10018,9 +11310,9 @@ ] }, "node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10039,9 +11331,9 @@ } }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10058,9 +11350,9 @@ } }, "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10073,9 +11365,9 @@ ] }, "node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "funding": [ { "type": "GitHub Sponsors", @@ -10113,9 +11405,9 @@ } }, "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10128,9 +11420,9 @@ ] }, "node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "funding": [ { "type": "GitHub Sponsors", @@ -10143,9 +11435,9 @@ ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10161,9 +11453,9 @@ } }, "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10176,9 +11468,9 @@ ] }, "node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "funding": [ { "type": "GitHub Sponsors", @@ -10194,9 +11486,9 @@ } }, "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10214,9 +11506,9 @@ } }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10233,9 +11525,9 @@ } }, "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10248,9 +11540,9 @@ ] }, "node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz", + "integrity": "sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==", "funding": [ { "type": "GitHub Sponsors", @@ -10269,9 +11561,9 @@ } }, "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10299,9 +11591,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==", "funding": [ { "type": "GitHub Sponsors", @@ -10314,9 +11606,9 @@ ] }, "node_modules/micromark/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "funding": [ { "type": "GitHub Sponsors", @@ -10333,9 +11625,9 @@ } }, "node_modules/micromark/node_modules/micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10352,9 +11644,9 @@ } }, "node_modules/micromark/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "funding": [ { "type": "GitHub Sponsors", @@ -10428,9 +11720,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dependencies": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -10470,6 +11762,14 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -10495,6 +11795,16 @@ "multicast-dns": "cli.js" } }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -10535,9 +11845,9 @@ } }, "node_modules/node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "dependencies": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -10604,6 +11914,42 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -10612,6 +11958,14 @@ "node": ">=0.10.0" } }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -10629,13 +11983,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dependencies": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, "engines": { @@ -10724,14 +12078,14 @@ } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" }, "engines": { - "node": ">=6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -10751,31 +12105,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -10827,6 +12156,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "node_modules/package-json/node_modules/semver": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", @@ -10881,9 +12215,9 @@ } }, "node_modules/parse-entities/node_modules/@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" }, "node_modules/parse-json": { "version": "5.2.0", @@ -10908,22 +12242,22 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "dependencies": { - "entities": "^4.4.0" + "entities": "^4.5.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "dependencies": { - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "parse5": "^7.0.0" }, "funding": { @@ -10948,11 +12282,11 @@ } }, "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/path-is-absolute": { @@ -10966,7 +12300,7 @@ "node_modules/path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "node_modules/path-key": { "version": "3.1.1", @@ -10981,10 +12315,30 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + }, "node_modules/path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" }, "node_modules/path-type": { "version": "4.0.0", @@ -10994,20 +12348,10 @@ "node": ">=8" } }, - "node_modules/periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -11020,6 +12364,22 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, "node_modules/pkg-dir": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", @@ -11068,6 +12428,20 @@ "node": ">=6" } }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pkg-up/node_modules/p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -11082,7 +12456,7 @@ "node_modules/pkg-up/node_modules/path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", "engines": { "node": ">=4" } @@ -11096,9 +12470,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -11115,13 +12489,49 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-attribute-case-insensitive/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-calc": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz", @@ -11137,6 +12547,98 @@ "postcss": "^8.2.2" } }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz", + "integrity": "sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-colormin": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", @@ -11169,6 +12671,136 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-custom-media": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-properties": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-dir-pseudo-class/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-discard-comments": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", @@ -11227,6 +12859,265 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-double-position-gradients": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", + "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-lab-function": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz", + "integrity": "sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-loader": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", @@ -11249,12 +13140,9 @@ } }, "node_modules/postcss-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "bin": { "semver": "bin/semver.js" }, @@ -11262,6 +13150,30 @@ "node": ">=10" } }, + "node_modules/postcss-logical": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", + "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-merge-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", @@ -11381,12 +13293,12 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", "dependencies": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" }, "engines": { @@ -11396,12 +13308,24 @@ "postcss": "^8.1.0" } }, - "node_modules/postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dependencies": { - "postcss-selector-parser": "^6.0.4" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", + "dependencies": { + "postcss-selector-parser": "^7.0.0" }, "engines": { "node": "^10 || ^12 || >= 14" @@ -11410,6 +13334,18 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-modules-values": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", @@ -11424,6 +13360,110 @@ "postcss": "^8.1.0" } }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nesting": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-resolve-nested": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/postcss-nesting/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-normalize-charset": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", @@ -11548,6 +13588,27 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, "node_modules/postcss-ordered-values": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", @@ -11563,6 +13624,184 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", + "integrity": "sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.6", + "@csstools/postcss-color-mix-function": "^3.0.6", + "@csstools/postcss-content-alt-text": "^2.0.4", + "@csstools/postcss-exponential-functions": "^2.0.5", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.6", + "@csstools/postcss-gradients-interpolation-method": "^5.0.6", + "@csstools/postcss-hwb-function": "^4.0.6", + "@csstools/postcss-ic-unit": "^4.0.0", + "@csstools/postcss-initial": "^2.0.0", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.5", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.6", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-random-function": "^1.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.6", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.0", + "@csstools/postcss-stepped-value-functions": "^4.0.5", + "@csstools/postcss-text-decoration-shorthand": "^4.0.1", + "@csstools/postcss-trigonometric-functions": "^4.0.5", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.1", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.2.1", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.6", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.0", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.6", + "postcss-logical": "^8.0.0", + "postcss-nesting": "^13.0.1", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-reduce-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", @@ -11606,10 +13845,54 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-selector-not/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -11989,9 +14272,9 @@ } }, "node_modules/react-dev-utils/node_modules/loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==", "engines": { "node": ">= 12.13.0" } @@ -12038,6 +14321,25 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/react-dom": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", @@ -12175,6 +14477,14 @@ "isarray": "0.0.1" } }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -12215,6 +14525,66 @@ "node": ">= 0.10" } }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -12232,9 +14602,9 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "dependencies": { "regenerate": "^1.4.2" }, @@ -12243,9 +14613,9 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "node_modules/regenerator-transform": { "version": "0.15.2", @@ -12256,14 +14626,14 @@ } }, "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "dependencies": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" }, @@ -12296,12 +14666,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "dependencies": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" @@ -12321,6 +14696,20 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -12392,9 +14781,9 @@ } }, "node_modules/remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -12420,9 +14809,9 @@ } }, "node_modules/remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -12542,6 +14931,14 @@ "entities": "^2.0.0" } }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -12564,11 +14961,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -12759,9 +15156,9 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/search-insights": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.1.tgz", - "integrity": "sha512-HHFjYH/0AqXacETlIbe9EYc3UNlQYGNNTY0fZ/sWl6SweX+GDxq9NB5+RVoPLgEFuOtCz7M9dhYxqDnhbbF0eQ==", + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "peer": true }, "node_modules/section-matter": { @@ -12879,17 +15276,16 @@ } }, "node_modules/serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", "dependencies": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" } }, @@ -12915,7 +15311,7 @@ "node_modules/serve-handler/node_modules/range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==", "engines": { "node": ">= 0.6" } @@ -13197,9 +15593,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "engines": { "node": ">=0.10.0" } @@ -13274,6 +15670,11 @@ "node": ">= 0.8" } }, + "node_modules/std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -13314,6 +15715,20 @@ "node": ">=8" } }, + "node_modules/string-width-cjs": { + "name": "string-width", + "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.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -13351,6 +15766,18 @@ "node": ">=8" } }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -13379,11 +15806,11 @@ } }, "node_modules/style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dependencies": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.4" } }, "node_modules/stylehacks": { @@ -13401,6 +15828,76 @@ "postcss": "^8.4.31" } }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sucrase/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -13460,6 +15957,61 @@ "node": ">= 10" } }, + "node_modules/tailwindcss": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.12.tgz", + "integrity": "sha512-Htf/gHj2+soPb9UayUNci/Ja3d8pTmu9ONTfh4QY8r3MATTZOzmv6UYWF7ZwikEIC8okpfqmGqrmDehua8mF8w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -13469,9 +16021,9 @@ } }, "node_modules/terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -13486,15 +16038,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -13543,7 +16095,26 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } }, "node_modules/thunky": { "version": "1.1.0", @@ -13560,14 +16131,6 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -13613,6 +16176,11 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -13650,9 +16218,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "peer": true, "bin": { "tsc": "bin/tsc", @@ -13663,9 +16231,9 @@ } }, "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", "engines": { "node": ">=4" } @@ -13691,9 +16259,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==", "engines": { "node": ">=4" } @@ -13707,9 +16275,9 @@ } }, "node_modules/unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -13774,19 +16342,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -13843,9 +16398,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -13861,8 +16416,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -14047,11 +16602,11 @@ } }, "node_modules/url-loader/node_modules/schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dependencies": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" }, @@ -14111,12 +16666,11 @@ } }, "node_modules/vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dependencies": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { @@ -14125,9 +16679,9 @@ } }, "node_modules/vfile-location": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "dependencies": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -14151,9 +16705,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -14180,33 +16734,32 @@ } }, "node_modules/webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -14359,16 +16912,16 @@ } }, "node_modules/webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "dependencies": { "clone-deep": "^4.0.1", "flat": "^5.0.2", - "wildcard": "^2.0.0" + "wildcard": "^2.0.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=18.0.0" } }, "node_modules/webpack-sources": { @@ -14379,6 +16932,11 @@ "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "node_modules/webpack/node_modules/schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -14397,26 +16955,53 @@ } }, "node_modules/webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", "dependencies": { - "chalk": "^4.1.0", - "consola": "^2.15.3", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", "pretty-time": "^1.1.0", - "std-env": "^3.0.1" + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=12" + "node": ">=14.21.3" }, "peerDependencies": { "webpack": "3 || 4 || 5" } }, - "node_modules/webpackbar/node_modules/std-env": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", - "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" + "node_modules/webpackbar/node_modules/markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "dependencies": { + "repeat-string": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpackbar/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/websocket-driver": { "version": "0.7.4", @@ -14534,6 +17119,23 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs": { + "name": "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/wrap-ansi/node_modules/ansi-regex": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", @@ -14663,11 +17265,11 @@ } }, "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -14685,34 +17287,34 @@ }, "dependencies": { "@algolia/autocomplete-core": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz", - "integrity": "sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.17.7.tgz", + "integrity": "sha512-BjiPOW6ks90UKl7TwMv7oNQMnzU+t/wk9mgIDi6b1tXpUek7MW0lbNOUHpvam9pe3lVCf4xPFT+lK7s+e+fs7Q==", "requires": { - "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-plugin-algolia-insights": "1.17.7", + "@algolia/autocomplete-shared": "1.17.7" } }, "@algolia/autocomplete-plugin-algolia-insights": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz", - "integrity": "sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.17.7.tgz", + "integrity": "sha512-Jca5Ude6yUOuyzjnz57og7Et3aXjbwCSDf/8onLHSQgw1qW3ALl9mrMWaXb5FmPVkV3EtkD2F/+NkT6VHyPu9A==", "requires": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.7" } }, "@algolia/autocomplete-preset-algolia": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz", - "integrity": "sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.17.7.tgz", + "integrity": "sha512-ggOQ950+nwbWROq2MOCIL71RE0DdQZsceqrg32UqnhDz8FlO9rL8ONHNsI2R1MH0tkgVIDKI/D0sMiUchsFdWA==", "requires": { - "@algolia/autocomplete-shared": "1.9.3" + "@algolia/autocomplete-shared": "1.17.7" } }, "@algolia/autocomplete-shared": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz", - "integrity": "sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ==", + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.17.7.tgz", + "integrity": "sha512-o/1Vurr42U/qskRSuhBH+VKxMvkkUVTLU6WZQr+L5lGZZLYWyhdzWjW0iGXY7EkwRTjBqvN2EsR81yCTGV/kmg==", "requires": {} }, "@algolia/cache-browser-local-storage": { @@ -14736,6 +17338,17 @@ "@algolia/cache-common": "4.24.0" } }, + "@algolia/client-abtesting": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.16.0.tgz", + "integrity": "sha512-fqQ2Szc6zxqXyQF8Vr64QMVoqFHHDsR5gEr/Eki+q+lgERvGr3YXruiB7Xs8rDTXP6+NC3tM2sZjdaEXW/P+6Q==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + }, "@algolia/client-account": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.24.0.tgz", @@ -14800,10 +17413,20 @@ } }, "@algolia/client-common": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.2.5.tgz", - "integrity": "sha512-ITE85veJWwClnoNyv7Zydh9U0eKA82cDy8pLw+2hzL+zlzFIvV68ihGOEQ/kXt8N4v+R4MFzvsxnIpMruQzEug==", - "peer": true + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.16.0.tgz", + "integrity": "sha512-4Bzvs5cdZ2MTMQvDlsmruZfyEk/NhSdsc+tA3vH9iMGIRzOj7Y9mwITpJM+hLFhbSE9Q0p0ojTF03RoDVclsZA==" + }, + "@algolia/client-insights": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.16.0.tgz", + "integrity": "sha512-vIiOK8+exA0AOlR9mRDUr148Rx3WNU73whaJtciYoqeHoy/utib+m3Lw1+6s0o7OuPb/wGRoJ1l5vQuVezVHgA==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } }, "@algolia/client-personalization": { "version": "4.24.0", @@ -14826,15 +17449,26 @@ } } }, - "@algolia/client-search": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.2.5.tgz", - "integrity": "sha512-OVDLzm5BEUbJmjfMm7b0Xx8vkK+NyEh7whPHuap2qy0x7RxQDLMXjiKsBbt1WNq+9nfX6+M/f2t0CJ8ENVuyYQ==", - "peer": true, + "@algolia/client-query-suggestions": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.16.0.tgz", + "integrity": "sha512-ygek1jdrAbw/tUIyHkK4YrH3uQoRmBbSUvZl8NBbz0S0GxjR6bhPbDZT8ny1INIMCA3KlYHPZAlCS+02RtvDyg==", "requires": { - "@algolia/client-common": "5.2.5", - "@algolia/requester-browser-xhr": "5.2.5", - "@algolia/requester-node-http": "5.2.5" + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + }, + "@algolia/client-search": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.16.0.tgz", + "integrity": "sha512-mVnkDZjpbiqdXRz0NrQlx6+QsnKYENuruYyjTJNcG3qAe015tvGAHcvvzRT78ZxETS7WjruWSlXBcL5llycNsQ==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" } }, "@algolia/events": { @@ -14842,6 +17476,17 @@ "resolved": "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz", "integrity": "sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==" }, + "@algolia/ingestion": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.16.0.tgz", + "integrity": "sha512-nmLcQYeG1YYRDAv2U+ebBD23mBSfkmhSwdDx2DBzqupStNrYWqYHsNgATLTMtMUTfgD0nSgBl5c+03yXg5WpiQ==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + }, "@algolia/logger-common": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.24.0.tgz", @@ -14855,6 +17500,17 @@ "@algolia/logger-common": "4.24.0" } }, + "@algolia/monitoring": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.16.0.tgz", + "integrity": "sha512-tiDkoQOO/d4o8W6dEnpCIMCWp6mwdjqZ+Q51QiCKvz1vcYU/YEx4lleY9oadjAMoOVWZHL6ItEF1LbQHvVNogQ==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + }, "@algolia/recommend": { "version": "4.24.0", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-4.24.0.tgz", @@ -14911,12 +17567,11 @@ } }, "@algolia/requester-browser-xhr": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.2.5.tgz", - "integrity": "sha512-Ri73PphNy1ceig94xJW9bPdN7uIYFAjpsABpp2Fsun4DmeZD5a4rMCNwwOXXsbC8h+lUzW34zpUf+h4Nk+eaqA==", - "peer": true, + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.16.0.tgz", + "integrity": "sha512-s/ty3lN0Bk9EC6VId/JO+AMOy6s0Hb3IpXUIa4iKKrH7p3n+lTEtwltVjFVW0fq9JfvQdECoaM951K23G/nRtQ==", "requires": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.16.0" } }, "@algolia/requester-common": { @@ -14924,13 +17579,20 @@ "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.24.0.tgz", "integrity": "sha512-k3CXJ2OVnvgE3HMwcojpvY6d9kgKMPRxs/kVohrwF5WMr2fnqojnycZkxPoEg+bXm8fi5BBfFmOqgYztRtHsQA==" }, - "@algolia/requester-node-http": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.2.5.tgz", - "integrity": "sha512-/tTdEuWcWHSe/mGMomWkuaFDoRcpfl/jvGISVTPRq3pJvM1FPAzxlh2MXge6C30aUS9bxh3V0aWwgKFCilzyMQ==", - "peer": true, + "@algolia/requester-fetch": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.16.0.tgz", + "integrity": "sha512-E8euSKDkljYpv5QHOZQrBCMZ4W98PKHRp5Cx8JxMYyyPWQ0xkD9b1c5yvOtJJ1lufqDvcuxvrF4eRBwW+BP3QA==", "requires": { - "@algolia/client-common": "5.2.5" + "@algolia/client-common": "5.16.0" + } + }, + "@algolia/requester-node-http": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.16.0.tgz", + "integrity": "sha512-gzLIQlgvvXzGExBC8xFVtsiDbenGgANQ+p/lcPO5ERs1ZNGXIqLnyqwP8amZl6YwXJEt4PPXL/p4IytBWs0jUw==", + "requires": { + "@algolia/client-common": "5.16.0" } }, "@algolia/transporter": { @@ -14943,6 +17605,11 @@ "@algolia/requester-common": "4.24.0" } }, + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==" + }, "@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -14953,34 +17620,35 @@ } }, "@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "requires": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", - "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==" + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==" }, "@babel/core": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", - "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.4", - "@babel/parser": "^7.24.4", - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -14989,47 +17657,33 @@ } }, "@babel/generator": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", - "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "requires": { - "@babel/types": "^7.24.0", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" - }, - "dependencies": { - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" - } + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", - "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", - "requires": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.25.9" } }, "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -15050,35 +17704,33 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.4.tgz", - "integrity": "sha512-lG75yeuUSVu0pIcbhiYMXBXANHrpUPaOfu7ryAzskCgKUHuAxRQI5ssrtmF0X9UXldPlvT0XM/A4F44OXRt6iQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", "semver": "^6.3.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", - "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.26.3.tgz", + "integrity": "sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "regexpu-core": "^5.3.1", + "@babel/helper-annotate-as-pure": "^7.25.9", + "regexpu-core": "^6.2.0", "semver": "^6.3.1" } }, "@babel/helper-define-polyfill-provider": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.1.tgz", - "integrity": "sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz", + "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==", "requires": { "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-plugin-utils": "^7.22.5", @@ -15087,249 +17739,160 @@ "resolve": "^1.14.2" } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==" - }, - "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "requires": { - "@babel/types": "^7.22.5" - } - }, "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", "requires": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-module-imports": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", - "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "requires": { - "@babel/types": "^7.24.0" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.25.9" } }, "@babel/helper-plugin-utils": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==" + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==" }, "@babel/helper-remap-async-to-generator": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", - "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz", + "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-wrap-function": "^7.22.20" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-wrap-function": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/helper-replace-supers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.1.tgz", - "integrity": "sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", + "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.23.0", - "@babel/helper-optimise-call-expression": "^7.22.5" - } - }, - "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "requires": { - "@babel/types": "^7.22.5" + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", - "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", "requires": { - "@babel/types": "^7.22.5" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", - "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-string-parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", - "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==" + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==" + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" }, "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==" + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==" }, "@babel/helper-wrap-function": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", - "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz", + "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==", "requires": { - "@babel/helper-function-name": "^7.22.5", - "@babel/template": "^7.22.15", - "@babel/types": "^7.22.19" + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helpers": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", - "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "requires": { - "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.1", - "@babel/types": "^7.24.0" - } - }, - "@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" } }, "@babel/parser": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", - "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==" + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "requires": { + "@babel/types": "^7.26.3" + } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.4.tgz", - "integrity": "sha512-qpl6vOOEEzTLLcsuqYYo8yDtrTocmu2xkGvgNebvPjT9DTtfFYGmgDqY+rBYXNlqL4s9qLDn6xkrJv4RxAPiTA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz", + "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==", "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz", + "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.1.tgz", - "integrity": "sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz", + "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.1.tgz", - "integrity": "sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-transform-optional-chaining": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9" } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.1.tgz", - "integrity": "sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz", + "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==", "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/plugin-proposal-private-property-in-object": { @@ -15338,30 +17901,6 @@ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "requires": {} }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, "@babel/plugin-syntax-dynamic-import": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", @@ -15370,124 +17909,36 @@ "@babel/helper-plugin-utils": "^7.8.0" } }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, "@babel/plugin-syntax-import-assertions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.1.tgz", - "integrity": "sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz", + "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.1.tgz", - "integrity": "sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-syntax-jsx": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz", - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-syntax-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.1.tgz", - "integrity": "sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-syntax-unicode-sets-regex": { @@ -15500,594 +17951,585 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.1.tgz", - "integrity": "sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz", + "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.3.tgz", - "integrity": "sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz", + "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==", "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.1.tgz", - "integrity": "sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz", + "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==", "requires": { - "@babel/helper-module-imports": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-remap-async-to-generator": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-remap-async-to-generator": "^7.25.9" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.1.tgz", - "integrity": "sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", + "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-block-scoping": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.4.tgz", - "integrity": "sha512-nIFUZIpGKDf9O9ttyRXpHFpKC+X3Y5mtshZONuEUYBomAKoM4y029Jr+uB1bHGPhNmK8YXHevDtKDOLmtRrp6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz", + "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-class-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.1.tgz", - "integrity": "sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz", + "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-class-static-block": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.4.tgz", - "integrity": "sha512-B8q7Pz870Hz/q9UgP8InNpY01CSLDSCyqX7zcRuv3FcPl87A2G17lASroHWaCtbdIcbYzOZ7kWmXFKbijMSmFg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz", + "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-class-static-block": "^7.14.5" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-classes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.1.tgz", - "integrity": "sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz", + "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1", - "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/traverse": "^7.25.9", "globals": "^11.1.0" } }, "@babel/plugin-transform-computed-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.1.tgz", - "integrity": "sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz", + "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/template": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/template": "^7.25.9" } }, "@babel/plugin-transform-destructuring": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.1.tgz", - "integrity": "sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz", + "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.1.tgz", - "integrity": "sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz", + "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.1.tgz", - "integrity": "sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz", + "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-dynamic-import": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.1.tgz", - "integrity": "sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz", + "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.1.tgz", - "integrity": "sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz", + "integrity": "sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==", "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-export-namespace-from": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.1.tgz", - "integrity": "sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz", + "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-for-of": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.1.tgz", - "integrity": "sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz", + "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" } }, "@babel/plugin-transform-function-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.1.tgz", - "integrity": "sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz", + "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==", "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/plugin-transform-json-strings": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.1.tgz", - "integrity": "sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz", + "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-json-strings": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.1.tgz", - "integrity": "sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz", + "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-logical-assignment-operators": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.1.tgz", - "integrity": "sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz", + "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.1.tgz", - "integrity": "sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz", + "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.1.tgz", - "integrity": "sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz", + "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==", "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.1.tgz", - "integrity": "sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz", + "integrity": "sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==", "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-simple-access": "^7.22.5" + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.1.tgz", - "integrity": "sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz", + "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==", "requires": { - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.1.tgz", - "integrity": "sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz", + "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==", "requires": { - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-module-transforms": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", - "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz", + "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.5", - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-new-target": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.1.tgz", - "integrity": "sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz", + "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.1.tgz", - "integrity": "sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", + "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-numeric-separator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.1.tgz", - "integrity": "sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz", + "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-object-rest-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.1.tgz", - "integrity": "sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz", + "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==", "requires": { - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.24.1" + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9" } }, "@babel/plugin-transform-object-super": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.1.tgz", - "integrity": "sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz", + "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-replace-supers": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9" } }, "@babel/plugin-transform-optional-catch-binding": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.1.tgz", - "integrity": "sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz", + "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.1.tgz", - "integrity": "sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz", + "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" } }, "@babel/plugin-transform-parameters": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.1.tgz", - "integrity": "sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz", + "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-private-methods": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.1.tgz", - "integrity": "sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz", + "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==", "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-private-property-in-object": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.1.tgz", - "integrity": "sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz", + "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.1", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-property-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.1.tgz", - "integrity": "sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz", + "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-react-constant-elements": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.24.7.tgz", - "integrity": "sha512-7LidzZfUXyfZ8/buRW6qIIHBY8wAZ1OrY9c/wTr8YhZ6vMPo+Uc/CVFLYY1spZrEQlD4w5u8wjqk5NQ3OVqQKA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz", + "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==", "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-react-display-name": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.1.tgz", - "integrity": "sha512-mvoQg2f9p2qlpDQRBC7M3c3XTr0k7cp/0+kFKKO/7Gtu0LSw16eKB+Fabe2bDT/UpsyasTBBkAnbdsLrkD5XMw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz", + "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-react-jsx": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.23.4.tgz", - "integrity": "sha512-5xOpoPguCZCRbo/JeHlloSkTA8Bld1J/E1/kLfD1nsuiW1m8tduTA1ERCgIZokDflX/IBzKcqR3l7VlRgiIfHA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-plugin-utils": "^7.22.5", - "@babel/plugin-syntax-jsx": "^7.23.3", - "@babel/types": "^7.23.4" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/plugin-transform-react-jsx-development": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", - "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", "requires": { - "@babel/plugin-transform-react-jsx": "^7.22.5" + "@babel/plugin-transform-react-jsx": "^7.25.9" } }, "@babel/plugin-transform-react-pure-annotations": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.1.tgz", - "integrity": "sha512-+pWEAaDJvSm9aFvJNpLiM2+ktl2Sn2U5DdyiWdZBxmLc6+xGt88dvFqsHiAiDS+8WqUwbDfkKz9jRxK3M0k+kA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz", + "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-regenerator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.1.tgz", - "integrity": "sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz", + "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-plugin-utils": "^7.25.9", "regenerator-transform": "^0.15.2" } }, - "@babel/plugin-transform-reserved-words": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.1.tgz", - "integrity": "sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==", + "@babel/plugin-transform-regexp-modifiers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz", + "integrity": "sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz", + "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==", + "requires": { + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-runtime": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.3.tgz", - "integrity": "sha512-J0BuRPNlNqlMTRJ72eVptpt9VcInbxO6iP3jaxr+1NPhC0UkKL+6oeX6VXMEYdADnuqmMmsBspt4d5w8Y/TCbQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.9.tgz", + "integrity": "sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==", "requires": { - "@babel/helper-module-imports": "^7.24.3", - "@babel/helper-plugin-utils": "^7.24.0", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", "semver": "^6.3.1" } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.1.tgz", - "integrity": "sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz", + "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-spread": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.1.tgz", - "integrity": "sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz", + "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.1.tgz", - "integrity": "sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz", + "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-template-literals": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.1.tgz", - "integrity": "sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz", + "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.1.tgz", - "integrity": "sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz", + "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-typescript": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.4.tgz", - "integrity": "sha512-79t3CQ8+oBGk/80SQ8MN3Bs3obf83zJ0YZjDmDaEZN8MqhMI760apl5z6a20kFeMXBwJX99VpKT8CKxEBp5H1g==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", + "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", "requires": { - "@babel/helper-annotate-as-pure": "^7.22.5", - "@babel/helper-create-class-features-plugin": "^7.24.4", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/plugin-syntax-typescript": "^7.24.1" + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.1.tgz", - "integrity": "sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz", + "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-unicode-property-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.1.tgz", - "integrity": "sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz", + "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.1.tgz", - "integrity": "sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz", + "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.1.tgz", - "integrity": "sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz", + "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==", "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.22.15", - "@babel/helper-plugin-utils": "^7.24.0" + "@babel/helper-create-regexp-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9" } }, "@babel/preset-env": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.4.tgz", - "integrity": "sha512-7Kl6cSmYkak0FK/FXjSEnLJ1N9T/WA2RkMhu17gZ/dsxKJUuTYNIylahPTzqpLyJN4WhDif8X0XK1R8Wsguo/A==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.0.tgz", + "integrity": "sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==", "requires": { - "@babel/compat-data": "^7.24.4", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.4", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.1", + "@babel/compat-data": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.9", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.9", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.9", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.9", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.9", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.24.1", - "@babel/plugin-syntax-import-attributes": "^7.24.1", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/plugin-syntax-import-attributes": "^7.26.0", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.24.1", - "@babel/plugin-transform-async-generator-functions": "^7.24.3", - "@babel/plugin-transform-async-to-generator": "^7.24.1", - "@babel/plugin-transform-block-scoped-functions": "^7.24.1", - "@babel/plugin-transform-block-scoping": "^7.24.4", - "@babel/plugin-transform-class-properties": "^7.24.1", - "@babel/plugin-transform-class-static-block": "^7.24.4", - "@babel/plugin-transform-classes": "^7.24.1", - "@babel/plugin-transform-computed-properties": "^7.24.1", - "@babel/plugin-transform-destructuring": "^7.24.1", - "@babel/plugin-transform-dotall-regex": "^7.24.1", - "@babel/plugin-transform-duplicate-keys": "^7.24.1", - "@babel/plugin-transform-dynamic-import": "^7.24.1", - "@babel/plugin-transform-exponentiation-operator": "^7.24.1", - "@babel/plugin-transform-export-namespace-from": "^7.24.1", - "@babel/plugin-transform-for-of": "^7.24.1", - "@babel/plugin-transform-function-name": "^7.24.1", - "@babel/plugin-transform-json-strings": "^7.24.1", - "@babel/plugin-transform-literals": "^7.24.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.24.1", - "@babel/plugin-transform-member-expression-literals": "^7.24.1", - "@babel/plugin-transform-modules-amd": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-modules-systemjs": "^7.24.1", - "@babel/plugin-transform-modules-umd": "^7.24.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", - "@babel/plugin-transform-new-target": "^7.24.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.1", - "@babel/plugin-transform-numeric-separator": "^7.24.1", - "@babel/plugin-transform-object-rest-spread": "^7.24.1", - "@babel/plugin-transform-object-super": "^7.24.1", - "@babel/plugin-transform-optional-catch-binding": "^7.24.1", - "@babel/plugin-transform-optional-chaining": "^7.24.1", - "@babel/plugin-transform-parameters": "^7.24.1", - "@babel/plugin-transform-private-methods": "^7.24.1", - "@babel/plugin-transform-private-property-in-object": "^7.24.1", - "@babel/plugin-transform-property-literals": "^7.24.1", - "@babel/plugin-transform-regenerator": "^7.24.1", - "@babel/plugin-transform-reserved-words": "^7.24.1", - "@babel/plugin-transform-shorthand-properties": "^7.24.1", - "@babel/plugin-transform-spread": "^7.24.1", - "@babel/plugin-transform-sticky-regex": "^7.24.1", - "@babel/plugin-transform-template-literals": "^7.24.1", - "@babel/plugin-transform-typeof-symbol": "^7.24.1", - "@babel/plugin-transform-unicode-escapes": "^7.24.1", - "@babel/plugin-transform-unicode-property-regex": "^7.24.1", - "@babel/plugin-transform-unicode-regex": "^7.24.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.1", + "@babel/plugin-transform-arrow-functions": "^7.25.9", + "@babel/plugin-transform-async-generator-functions": "^7.25.9", + "@babel/plugin-transform-async-to-generator": "^7.25.9", + "@babel/plugin-transform-block-scoped-functions": "^7.25.9", + "@babel/plugin-transform-block-scoping": "^7.25.9", + "@babel/plugin-transform-class-properties": "^7.25.9", + "@babel/plugin-transform-class-static-block": "^7.26.0", + "@babel/plugin-transform-classes": "^7.25.9", + "@babel/plugin-transform-computed-properties": "^7.25.9", + "@babel/plugin-transform-destructuring": "^7.25.9", + "@babel/plugin-transform-dotall-regex": "^7.25.9", + "@babel/plugin-transform-duplicate-keys": "^7.25.9", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-dynamic-import": "^7.25.9", + "@babel/plugin-transform-exponentiation-operator": "^7.25.9", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-for-of": "^7.25.9", + "@babel/plugin-transform-function-name": "^7.25.9", + "@babel/plugin-transform-json-strings": "^7.25.9", + "@babel/plugin-transform-literals": "^7.25.9", + "@babel/plugin-transform-logical-assignment-operators": "^7.25.9", + "@babel/plugin-transform-member-expression-literals": "^7.25.9", + "@babel/plugin-transform-modules-amd": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-modules-systemjs": "^7.25.9", + "@babel/plugin-transform-modules-umd": "^7.25.9", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.9", + "@babel/plugin-transform-new-target": "^7.25.9", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.9", + "@babel/plugin-transform-numeric-separator": "^7.25.9", + "@babel/plugin-transform-object-rest-spread": "^7.25.9", + "@babel/plugin-transform-object-super": "^7.25.9", + "@babel/plugin-transform-optional-catch-binding": "^7.25.9", + "@babel/plugin-transform-optional-chaining": "^7.25.9", + "@babel/plugin-transform-parameters": "^7.25.9", + "@babel/plugin-transform-private-methods": "^7.25.9", + "@babel/plugin-transform-private-property-in-object": "^7.25.9", + "@babel/plugin-transform-property-literals": "^7.25.9", + "@babel/plugin-transform-regenerator": "^7.25.9", + "@babel/plugin-transform-regexp-modifiers": "^7.26.0", + "@babel/plugin-transform-reserved-words": "^7.25.9", + "@babel/plugin-transform-shorthand-properties": "^7.25.9", + "@babel/plugin-transform-spread": "^7.25.9", + "@babel/plugin-transform-sticky-regex": "^7.25.9", + "@babel/plugin-transform-template-literals": "^7.25.9", + "@babel/plugin-transform-typeof-symbol": "^7.25.9", + "@babel/plugin-transform-unicode-escapes": "^7.25.9", + "@babel/plugin-transform-unicode-property-regex": "^7.25.9", + "@babel/plugin-transform-unicode-regex": "^7.25.9", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.9", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.38.1", "semver": "^6.3.1" } }, @@ -16102,94 +18544,78 @@ } }, "@babel/preset-react": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.24.1.tgz", - "integrity": "sha512-eFa8up2/8cZXLIpkafhaADTXSnl7IsUFCYenRWrARBz0/qZwcT0RBXpys0LJU4+WfPoF2ZG6ew6s2V6izMCwRA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.26.3.tgz", + "integrity": "sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-transform-react-display-name": "^7.24.1", - "@babel/plugin-transform-react-jsx": "^7.23.4", - "@babel/plugin-transform-react-jsx-development": "^7.22.5", - "@babel/plugin-transform-react-pure-annotations": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-transform-react-display-name": "^7.25.9", + "@babel/plugin-transform-react-jsx": "^7.25.9", + "@babel/plugin-transform-react-jsx-development": "^7.25.9", + "@babel/plugin-transform-react-pure-annotations": "^7.25.9" } }, "@babel/preset-typescript": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.24.1.tgz", - "integrity": "sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz", + "integrity": "sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==", "requires": { - "@babel/helper-plugin-utils": "^7.24.0", - "@babel/helper-validator-option": "^7.23.5", - "@babel/plugin-syntax-jsx": "^7.24.1", - "@babel/plugin-transform-modules-commonjs": "^7.24.1", - "@babel/plugin-transform-typescript": "^7.24.1" + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-transform-modules-commonjs": "^7.25.9", + "@babel/plugin-transform-typescript": "^7.25.9" } }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" - }, "@babel/runtime": { - "version": "7.22.6", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", - "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "requires": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" } }, "@babel/runtime-corejs3": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.24.4.tgz", - "integrity": "sha512-VOQOexSilscN24VEY810G/PqtpFvx/z6UqDIjIWbDe2368HhDLkYN5TYwaEz/+eRCUkhJ2WaNLLmQAlxzfWj4w==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.26.0.tgz", + "integrity": "sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==", "requires": { "core-js-pure": "^3.30.2", "regenerator-runtime": "^0.14.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - } } }, "@babel/template": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", - "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.24.0", - "@babel/types": "^7.24.0" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/traverse": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", - "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", "requires": { - "@babel/code-frame": "^7.24.1", - "@babel/generator": "^7.24.1", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.1", - "@babel/types": "^7.24.0", + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", - "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" } }, "@colors/colors": { @@ -16198,79 +18624,561 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "optional": true }, + "@csstools/cascade-layer-name-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", + "requires": {} + }, + "@csstools/color-helpers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.1.tgz", + "integrity": "sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==" + }, + "@csstools/css-calc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-2.1.0.tgz", + "integrity": "sha512-X69PmFOrjTZfN5ijxtI8hZ9kRADFSLrmmQ6hgDJ272Il049WGKpDY64KhrFm/7rbWve0z81QepawzjkKlqkNGw==", + "requires": {} + }, + "@csstools/css-color-parser": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.6.tgz", + "integrity": "sha512-S/IjXqTHdpI4EtzGoNCHfqraXF37x12ZZHA1Lk7zoT5pm2lMjFuqhX/89L7dqX4CcMacKK+6ZCs5TmEGb/+wKw==", + "requires": { + "@csstools/color-helpers": "^5.0.1", + "@csstools/css-calc": "^2.1.0" + } + }, + "@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "requires": {} + }, + "@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==" + }, + "@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "requires": {} + }, + "@csstools/postcss-cascade-layers": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-5.0.1.tgz", + "integrity": "sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==", + "requires": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "requires": {} + }, + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "@csstools/postcss-color-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-4.0.6.tgz", + "integrity": "sha512-EcvXfC60cTIumzpsxWuvVjb7rsJEHPvqn3jeMEBUaE3JSc4FRuP7mEQ+1eicxWmIrs3FtzMH9gR3sgA5TH+ebQ==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-color-mix-function": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-mix-function/-/postcss-color-mix-function-3.0.6.tgz", + "integrity": "sha512-jVKdJn4+JkASYGhyPO+Wa5WXSx1+oUgaXb3JsjJn/BlrtFh5zjocCY7pwWi0nuP24V1fY7glQsxEYcYNy0dMFg==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-content-alt-text": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-content-alt-text/-/postcss-content-alt-text-2.0.4.tgz", + "integrity": "sha512-YItlZUOuZJCBlRaCf8Aucc1lgN41qYGALMly0qQllrxYJhiyzlI6RxOTMUvtWk+KhS8GphMDsDhKQ7KTPfEMSw==", + "requires": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-exponential-functions": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-exponential-functions/-/postcss-exponential-functions-2.0.5.tgz", + "integrity": "sha512-mi8R6dVfA2nDoKM3wcEi64I8vOYEgQVtVKCfmLHXupeLpACfGAided5ddMt5f+CnEodNu4DifuVwb0I6fQDGGQ==", + "requires": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "@csstools/postcss-font-format-keywords": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-4.0.0.tgz", + "integrity": "sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==", + "requires": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-gamut-mapping": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gamut-mapping/-/postcss-gamut-mapping-2.0.6.tgz", + "integrity": "sha512-0ke7fmXfc8H+kysZz246yjirAH6JFhyX9GTlyRnM0exHO80XcA9zeJpy5pOp5zo/AZiC/q5Pf+Hw7Pd6/uAoYA==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "@csstools/postcss-gradients-interpolation-method": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-gradients-interpolation-method/-/postcss-gradients-interpolation-method-5.0.6.tgz", + "integrity": "sha512-Itrbx6SLUzsZ6Mz3VuOlxhbfuyLTogG5DwEF1V8dAi24iMuvQPIHd7Ti+pNDp7j6WixndJGZaoNR0f9VSzwuTg==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-hwb-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-4.0.6.tgz", + "integrity": "sha512-927Pqy3a1uBP7U8sTfaNdZVB0mNXzIrJO/GZ8us9219q9n06gOqCdfZ0E6d1P66Fm0fYHvxfDbfcUuwAn5UwhQ==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-ic-unit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-4.0.0.tgz", + "integrity": "sha512-9QT5TDGgx7wD3EEMN3BSUG6ckb6Eh5gSPT5kZoVtUuAonfPmLDJyPhqR4ntPpMYhUKAMVKAg3I/AgzqHMSeLhA==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-initial": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-initial/-/postcss-initial-2.0.0.tgz", + "integrity": "sha512-dv2lNUKR+JV+OOhZm9paWzYBXOCi+rJPqJ2cJuhh9xd8USVrd0cBEPczla81HNOyThMQWeCcdln3gZkQV2kYxA==", + "requires": {} + }, + "@csstools/postcss-is-pseudo-class": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-5.0.1.tgz", + "integrity": "sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==", + "requires": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "requires": {} + }, + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "@csstools/postcss-light-dark-function": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-light-dark-function/-/postcss-light-dark-function-2.0.7.tgz", + "integrity": "sha512-ZZ0rwlanYKOHekyIPaU+sVm3BEHCe+Ha0/px+bmHe62n0Uc1lL34vbwrLYn6ote8PHlsqzKeTQdIejQCJ05tfw==", + "requires": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-logical-float-and-clear": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-float-and-clear/-/postcss-logical-float-and-clear-3.0.0.tgz", + "integrity": "sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==", + "requires": {} + }, + "@csstools/postcss-logical-overflow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overflow/-/postcss-logical-overflow-2.0.0.tgz", + "integrity": "sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==", + "requires": {} + }, + "@csstools/postcss-logical-overscroll-behavior": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-overscroll-behavior/-/postcss-logical-overscroll-behavior-2.0.0.tgz", + "integrity": "sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==", + "requires": {} + }, + "@csstools/postcss-logical-resize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-resize/-/postcss-logical-resize-3.0.0.tgz", + "integrity": "sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-logical-viewport-units": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/postcss-logical-viewport-units/-/postcss-logical-viewport-units-3.0.3.tgz", + "integrity": "sha512-OC1IlG/yoGJdi0Y+7duz/kU/beCwO+Gua01sD6GtOtLi7ByQUpcIqs7UE/xuRPay4cHgOMatWdnDdsIDjnWpPw==", + "requires": { + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-media-minmax": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-minmax/-/postcss-media-minmax-2.0.5.tgz", + "integrity": "sha512-sdh5i5GToZOIAiwhdntRWv77QDtsxP2r2gXW/WbLSCoLr00KTq/yiF1qlQ5XX2+lmiFa8rATKMcbwl3oXDMNew==", + "requires": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + } + }, + "@csstools/postcss-media-queries-aspect-ratio-number-values": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/postcss-media-queries-aspect-ratio-number-values/-/postcss-media-queries-aspect-ratio-number-values-3.0.4.tgz", + "integrity": "sha512-AnGjVslHMm5xw9keusQYvjVWvuS7KWK+OJagaG0+m9QnIjZsrysD2kJP/tr/UJIyYtMCtu8OkUd+Rajb4DqtIQ==", + "requires": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + } + }, + "@csstools/postcss-nested-calc": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-4.0.0.tgz", + "integrity": "sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==", + "requires": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-normalize-display-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.0.tgz", + "integrity": "sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-oklab-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.6.tgz", + "integrity": "sha512-Hptoa0uX+XsNacFBCIQKTUBrFKDiplHan42X73EklG6XmQLG7/aIvxoNhvZ7PvOWMt67Pw3bIlUY2nD6p5vL8A==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.0.0.tgz", + "integrity": "sha512-XQPtROaQjomnvLUSy/bALTR5VCtTVUFwYs1SblvYgLSeTo2a/bMNwUwo2piXw5rTv/FEYiy5yPSXBqg9OKUx7Q==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-random-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-random-function/-/postcss-random-function-1.0.1.tgz", + "integrity": "sha512-Ab/tF8/RXktQlFwVhiC70UNfpFQRhtE5fQQoP2pO+KCPGLsLdWFiOuHgSRtBOqEshCVAzR4H6o38nhvRZq8deA==", + "requires": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "@csstools/postcss-relative-color-syntax": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@csstools/postcss-relative-color-syntax/-/postcss-relative-color-syntax-3.0.6.tgz", + "integrity": "sha512-yxP618Xb+ji1I624jILaYM62uEmZcmbdmFoZHoaThw896sq0vU39kqTTF+ZNic9XyPtPMvq0vyvbgmHaszq8xg==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "@csstools/postcss-scope-pseudo-class": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-scope-pseudo-class/-/postcss-scope-pseudo-class-4.0.1.tgz", + "integrity": "sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "@csstools/postcss-sign-functions": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-sign-functions/-/postcss-sign-functions-1.1.0.tgz", + "integrity": "sha512-SLcc20Nujx/kqbSwDmj6oaXgpy3UjFhBy1sfcqPgDkHfOIfUtUVH7OXO+j7BU4v/At5s61N5ZX6shvgPwluhsA==", + "requires": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "@csstools/postcss-stepped-value-functions": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-4.0.5.tgz", + "integrity": "sha512-G6SJ6hZJkhxo6UZojVlLo14MohH4J5J7z8CRBrxxUYy9JuZiIqUo5TBYyDGcE0PLdzpg63a7mHSJz3VD+gMwqw==", + "requires": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "@csstools/postcss-text-decoration-shorthand": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-4.0.1.tgz", + "integrity": "sha512-xPZIikbx6jyzWvhms27uugIc0I4ykH4keRvoa3rxX5K7lEhkbd54rjj/dv60qOCTisoS+3bmwJTeyV1VNBrXaw==", + "requires": { + "@csstools/color-helpers": "^5.0.1", + "postcss-value-parser": "^4.2.0" + } + }, + "@csstools/postcss-trigonometric-functions": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-4.0.5.tgz", + "integrity": "sha512-/YQThYkt5MLvAmVu7zxjhceCYlKrYddK6LEmK5I4ojlS6BmO9u2yO4+xjXzu2+NPYmHSTtP4NFSamBCMmJ1NJA==", + "requires": { + "@csstools/css-calc": "^2.1.0", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "@csstools/postcss-unset-value": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-4.0.0.tgz", + "integrity": "sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==", + "requires": {} + }, + "@csstools/utilities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@csstools/utilities/-/utilities-2.0.0.tgz", + "integrity": "sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==", + "requires": {} + }, "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@docsearch/css": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.6.1.tgz", - "integrity": "sha512-VtVb5DS+0hRIprU2CO6ZQjK2Zg4QU5HrDM1+ix6rT0umsYvFvatMAnf97NHZlVWDaaLlx7GRfR/7FikANiM2Fg==" + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.8.0.tgz", + "integrity": "sha512-pieeipSOW4sQ0+bE5UFC51AOZp9NGxg89wAlZ1BAQFaiRAGK1IKUaPQ0UGZeNctJXyqZ1UvBtOQh2HH+U5GtmA==" }, "@docsearch/react": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.6.1.tgz", - "integrity": "sha512-qXZkEPvybVhSXj0K7U3bXc233tk5e8PfhoZ6MhPOiik/qUQxYC+Dn9DnoS7CxHQQhHfCvTiN0eY9M12oRghEXw==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.8.0.tgz", + "integrity": "sha512-WnFK720+iwTVt94CxY3u+FgX6exb3BfN5kE9xUY6uuAH/9W/UFboBZFLlrw/zxFRHoHZCOXRtOylsXF+6LHI+Q==", "requires": { - "@algolia/autocomplete-core": "1.9.3", - "@algolia/autocomplete-preset-algolia": "1.9.3", - "@docsearch/css": "3.6.1", - "algoliasearch": "^4.19.1" + "@algolia/autocomplete-core": "1.17.7", + "@algolia/autocomplete-preset-algolia": "1.17.7", + "@docsearch/css": "3.8.0", + "algoliasearch": "^5.12.0" + }, + "dependencies": { + "@algolia/client-analytics": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.16.0.tgz", + "integrity": "sha512-8HqIoGUwjc/XqjA+AjpRvtB40QzQ067qHuJujkR0k6WBLEM3OiB30FOfLZLabxnPIZgU55zmQ8exe+0WpgyKqA==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + }, + "@algolia/client-personalization": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.16.0.tgz", + "integrity": "sha512-psAzXJgzqPMCID31wrWVRg19K+h5TsLKSv6YfzQhB5munnj4IAE2lxEet2hDkji7vPA0WWpXGAW5Tx0scyMvkA==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + }, + "@algolia/recommend": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.16.0.tgz", + "integrity": "sha512-hehiMLsDnXnnZGXXKdeXUsvP3PwqAKL/rT4XutkYXsqQ1Jnv4EFrMOY8morUT8nlPv7d1bHPF+bTiNaKvkbBbA==", + "requires": { + "@algolia/client-common": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + }, + "algoliasearch": { + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.16.0.tgz", + "integrity": "sha512-0zWz0LGfB0MLrhcnyGDpvVWPSsZnECNU6V/GPtNkHHSgaUj/7i+j36bZm6HClCvo8GvuxbN+ccbFREWUouHlfg==", + "requires": { + "@algolia/client-abtesting": "5.16.0", + "@algolia/client-analytics": "5.16.0", + "@algolia/client-common": "5.16.0", + "@algolia/client-insights": "5.16.0", + "@algolia/client-personalization": "5.16.0", + "@algolia/client-query-suggestions": "5.16.0", + "@algolia/client-search": "5.16.0", + "@algolia/ingestion": "1.16.0", + "@algolia/monitoring": "1.16.0", + "@algolia/recommend": "5.16.0", + "@algolia/requester-browser-xhr": "5.16.0", + "@algolia/requester-fetch": "5.16.0", + "@algolia/requester-node-http": "5.16.0" + } + } } }, - "@docusaurus/core": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.5.2.tgz", - "integrity": "sha512-4Z1WkhCSkX4KO0Fw5m/Vuc7Q3NxBG53NE5u59Rs96fWkMPZVSrzEPP16/Nk6cWb/shK7xXPndTmalJtw7twL/w==", + "@docusaurus/babel": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/babel/-/babel-3.6.3.tgz", + "integrity": "sha512-7dW9Hat9EHYCVicFXYA4hjxBY38+hPuCURL8oRF9fySRm7vzNWuEOghA1TXcykuXZp0HLG2td4RhDxCvGG7tNw==", "requires": { - "@babel/core": "^7.23.3", - "@babel/generator": "^7.23.3", + "@babel/core": "^7.25.9", + "@babel/generator": "^7.25.9", "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.22.9", - "@babel/preset-env": "^7.22.9", - "@babel/preset-react": "^7.22.5", - "@babel/preset-typescript": "^7.22.5", - "@babel/runtime": "^7.22.6", - "@babel/runtime-corejs3": "^7.22.6", - "@babel/traverse": "^7.22.8", - "@docusaurus/cssnano-preset": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", - "autoprefixer": "^10.4.14", - "babel-loader": "^9.1.3", + "@babel/plugin-transform-runtime": "^7.25.9", + "@babel/preset-env": "^7.25.9", + "@babel/preset-react": "^7.25.9", + "@babel/preset-typescript": "^7.25.9", + "@babel/runtime": "^7.25.9", + "@babel/runtime-corejs3": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", "babel-plugin-dynamic-import-node": "^2.3.3", - "boxen": "^6.2.1", - "chalk": "^4.1.2", - "chokidar": "^3.5.3", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + } + }, + "@docusaurus/bundler": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/bundler/-/bundler-3.6.3.tgz", + "integrity": "sha512-47JLuc8D4wA+6VOvmMd5fUC9rFppBQpQOnxDYiVXffm/DeV/wmm3sbpNd5Y+O+G2+nevLTRnvCm/qyancv0Y3A==", + "requires": { + "@babel/core": "^7.25.9", + "@docusaurus/babel": "3.6.3", + "@docusaurus/cssnano-preset": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "babel-loader": "^9.2.1", "clean-css": "^5.3.2", - "cli-table3": "^0.6.3", - "combine-promises": "^1.1.0", - "commander": "^5.1.0", "copy-webpack-plugin": "^11.0.0", - "core-js": "^3.31.1", "css-loader": "^6.8.1", "css-minimizer-webpack-plugin": "^5.0.1", "cssnano": "^6.1.2", + "file-loader": "^6.2.0", + "html-minifier-terser": "^7.2.0", + "mini-css-extract-plugin": "^2.9.1", + "null-loader": "^4.0.1", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "postcss-preset-env": "^10.1.0", + "react-dev-utils": "^12.0.1", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "webpack": "^5.95.0", + "webpackbar": "^6.0.1" + } + }, + "@docusaurus/core": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.6.3.tgz", + "integrity": "sha512-xL7FRY9Jr5DWqB6pEnqgKqcMPJOX5V0pgWXi5lCiih11sUBmcFKM7c3+GyxcVeeWFxyYSDP3grLTWqJoP4P9Vw==", + "requires": { + "@docusaurus/babel": "3.6.3", + "@docusaurus/bundler": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "core-js": "^3.31.1", "del": "^6.1.1", "detect-port": "^1.5.1", "escape-html": "^1.0.3", "eta": "^2.2.0", "eval": "^0.1.8", - "file-loader": "^6.2.0", "fs-extra": "^11.1.1", - "html-minifier-terser": "^7.2.0", "html-tags": "^3.3.1", - "html-webpack-plugin": "^5.5.3", + "html-webpack-plugin": "^5.6.0", "leven": "^3.1.0", "lodash": "^4.17.21", - "mini-css-extract-plugin": "^2.7.6", "p-map": "^4.0.0", - "postcss": "^8.4.26", - "postcss-loader": "^7.3.3", "prompts": "^2.4.2", "react-dev-utils": "^12.0.1", "react-helmet-async": "^1.3.0", @@ -16281,17 +19189,14 @@ "react-router-dom": "^5.3.4", "rtl-detect": "^1.0.4", "semver": "^7.5.4", - "serve-handler": "^6.1.5", + "serve-handler": "^6.1.6", "shelljs": "^0.8.5", - "terser-webpack-plugin": "^5.3.9", "tslib": "^2.6.0", "update-notifier": "^6.0.2", - "url-loader": "^4.1.1", - "webpack": "^5.88.1", - "webpack-bundle-analyzer": "^4.9.0", - "webpack-dev-server": "^4.15.1", - "webpack-merge": "^5.9.0", - "webpackbar": "^5.0.2" + "webpack": "^5.95.0", + "webpack-bundle-analyzer": "^4.10.2", + "webpack-dev-server": "^4.15.2", + "webpack-merge": "^6.0.1" }, "dependencies": { "semver": { @@ -16305,9 +19210,9 @@ } }, "@docusaurus/cssnano-preset": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.5.2.tgz", - "integrity": "sha512-D3KiQXOMA8+O0tqORBrTOEQyQxNIfPm9jEaJoALjjSjc2M/ZAWcUfPQEnwr2JB2TadHw2gqWgpZckQmrVWkytA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-3.6.3.tgz", + "integrity": "sha512-qP7SXrwZ+23GFJdPN4aIHQrZW+oH/7tzwEuc/RNL0+BdZdmIjYQqUxdXsjE4lFxLNZjj0eUrSNYIS6xwfij+5Q==", "requires": { "cssnano-preset-advanced": "^6.1.2", "postcss": "^8.4.38", @@ -16316,22 +19221,22 @@ } }, "@docusaurus/logger": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.5.2.tgz", - "integrity": "sha512-LHC540SGkeLfyT3RHK3gAMK6aS5TRqOD4R72BEU/DE2M/TY8WwEUAMY576UUc/oNJXv8pGhBmQB6N9p3pt8LQw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/logger/-/logger-3.6.3.tgz", + "integrity": "sha512-xSubJixcNyMV9wMV4q0s47CBz3Rlc5jbcCCuij8pfQP8qn/DIpt0ks8W6hQWzHAedg/J/EwxxUOUrnEoKzJo8g==", "requires": { "chalk": "^4.1.2", "tslib": "^2.6.0" } }, "@docusaurus/mdx-loader": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.5.2.tgz", - "integrity": "sha512-ku3xO9vZdwpiMIVd8BzWV0DCqGEbCP5zs1iHfKX50vw6jX8vQo0ylYo1YJMZyz6e+JFJ17HYHT5FzVidz2IflA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-3.6.3.tgz", + "integrity": "sha512-3iJdiDz9540ppBseeI93tWTDtUGVkxzh59nMq4ignylxMuXBLK8dFqVeaEor23v1vx6TrGKZ2FuLaTB+U7C0QQ==", "requires": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@mdx-js/mdx": "^3.0.0", "@slorber/remark-comment": "^1.0.0", "escape-html": "^1.0.3", @@ -16356,11 +19261,11 @@ } }, "@docusaurus/module-type-aliases": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.5.2.tgz", - "integrity": "sha512-Z+Xu3+2rvKef/YKTMxZHsEXp1y92ac0ngjDiExRdqGTmEKtCUpkbNYH8v5eXo5Ls+dnW88n6WTa+Q54kLOkwPg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-3.6.3.tgz", + "integrity": "sha512-MjaXX9PN/k5ugNvfRZdWyKWq4FsrhN4LEXaj0pEmMebJuBNlFeGyKQUa9DRhJHpadNaiMLrbo9m3U7Ig5YlsZg==", "requires": { - "@docusaurus/types": "3.5.2", + "@docusaurus/types": "3.6.3", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -16370,15 +19275,15 @@ } }, "@docusaurus/plugin-client-redirects": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.5.2.tgz", - "integrity": "sha512-GMU0ZNoVG1DEsZlBbwLPdh0iwibrVZiRfmdppvX17SnByCVP74mb/Nne7Ss7ALgxQLtM4IHbXi8ij90VVjAJ+Q==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-client-redirects/-/plugin-client-redirects-3.6.3.tgz", + "integrity": "sha512-fQDCxoJCO1jXNQGQmhgYoX3Yx+Z2xSbrLf3PBET6pHnsRk6gGW/VuCHcfQuZlJzbTxN0giQ5u3XcQQ/LzXftJA==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "eta": "^2.2.0", "fs-extra": "^11.1.1", "lodash": "^4.17.21", @@ -16386,18 +19291,18 @@ } }, "@docusaurus/plugin-content-blog": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.5.2.tgz", - "integrity": "sha512-R7ghWnMvjSf+aeNDH0K4fjyQnt5L0KzUEnUhmf1e3jZrv3wogeytZNN6n7X8yHcMsuZHPOrctQhXWnmxu+IRRg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-3.6.3.tgz", + "integrity": "sha512-k0ogWwwJU3pFRFfvW1kRVHxzf2DutLGaaLjAnHVEU6ju+aRP0Z5ap/13DHyPOfHeE4WKpn/M0TqjdwZAcY3kAw==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "cheerio": "1.0.0-rc.12", "feed": "^4.2.2", "fs-extra": "^11.1.1", @@ -16411,19 +19316,19 @@ } }, "@docusaurus/plugin-content-docs": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.5.2.tgz", - "integrity": "sha512-Bt+OXn/CPtVqM3Di44vHjE7rPCEsRCB/DMo2qoOuozB9f7+lsdrHvD0QCHdBs0uhz6deYJDppAr2VgqybKPlVQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.6.3.tgz", + "integrity": "sha512-r2wS8y/fsaDcxkm20W5bbYJFPzdWdEaTWVYjNxlHlcmX086eqQR1Fomlg9BHTJ0dLXPzAlbC8EN4XqMr3QzNCQ==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@types/react-router-config": "^5.0.7", "combine-promises": "^1.1.0", "fs-extra": "^11.1.1", @@ -16435,124 +19340,125 @@ } }, "@docusaurus/plugin-content-pages": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.5.2.tgz", - "integrity": "sha512-WzhHjNpoQAUz/ueO10cnundRz+VUtkjFhhaQ9jApyv1a46FPURO4cef89pyNIOMny1fjDz/NUN2z6Yi+5WUrCw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-3.6.3.tgz", + "integrity": "sha512-eHrmTgjgLZsuqfsYr5X2xEwyIcck0wseSofWrjTwT9FLOWp+KDmMAuVK+wRo7sFImWXZk3oV/xX/g9aZrhD7OA==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "fs-extra": "^11.1.1", "tslib": "^2.6.0", "webpack": "^5.88.1" } }, "@docusaurus/plugin-debug": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.5.2.tgz", - "integrity": "sha512-kBK6GlN0itCkrmHuCS6aX1wmoWc5wpd5KJlqQ1FyrF0cLDnvsYSnh7+ftdwzt7G6lGBho8lrVwkkL9/iQvaSOA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-3.6.3.tgz", + "integrity": "sha512-zB9GXfIZNPRfzKnNjU6xGVrqn9bPXuGhpjgsuc/YtcTDjnjhasg38NdYd5LEqXex5G/zIorQgWB3n6x/Ut62vQ==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", "fs-extra": "^11.1.1", "react-json-view-lite": "^1.2.0", "tslib": "^2.6.0" } }, "@docusaurus/plugin-google-analytics": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.5.2.tgz", - "integrity": "sha512-rjEkJH/tJ8OXRE9bwhV2mb/WP93V441rD6XnM6MIluu7rk8qg38iSxS43ga2V2Q/2ib53PcqbDEJDG/yWQRJhQ==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-3.6.3.tgz", + "integrity": "sha512-rCDNy1QW8Dag7nZq67pcum0bpFLrwvxJhYuVprhFh8BMBDxV0bY+bAkGHbSf68P3Bk9C3hNOAXX1srGLIDvcTA==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "tslib": "^2.6.0" } }, "@docusaurus/plugin-google-gtag": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.5.2.tgz", - "integrity": "sha512-lm8XL3xLkTPHFKKjLjEEAHUrW0SZBSHBE1I+i/tmYMBsjCcUB5UJ52geS5PSiOCFVR74tbPGcPHEV/gaaxFeSA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-3.6.3.tgz", + "integrity": "sha512-+OyDvhM6rqVkQOmLVkQWVJAizEEfkPzVWtIHXlWPOCFGK9X4/AWeBSrU0WG4iMg9Z4zD4YDRrU+lvI4s6DSC+w==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@types/gtag.js": "^0.0.12", "tslib": "^2.6.0" } }, "@docusaurus/plugin-google-tag-manager": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.5.2.tgz", - "integrity": "sha512-QkpX68PMOMu10Mvgvr5CfZAzZQFx8WLlOiUQ/Qmmcl6mjGK6H21WLT5x7xDmcpCoKA/3CegsqIqBR+nA137lQg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-3.6.3.tgz", + "integrity": "sha512-1M6UPB13gWUtN2UHX083/beTn85PlRI9ABItTl/JL1FJ5dJTWWFXXsHf9WW/6hrVwthwTeV/AGbGKvLKV+IlCA==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "tslib": "^2.6.0" } }, "@docusaurus/plugin-sitemap": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.5.2.tgz", - "integrity": "sha512-DnlqYyRAdQ4NHY28TfHuVk414ft2uruP4QWCH//jzpHjqvKyXjj2fmDtI8RPUBh9K8iZKFMHRnLtzJKySPWvFA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-3.6.3.tgz", + "integrity": "sha512-94qOO4M9Fwv9KfVQJsgbe91k+fPJ4byf1L3Ez8TUa6TAFPo/BrLwQ80zclHkENlL1824TuxkcMKv33u6eydQCg==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "fs-extra": "^11.1.1", "sitemap": "^7.1.1", "tslib": "^2.6.0" } }, "@docusaurus/preset-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.5.2.tgz", - "integrity": "sha512-3ihfXQ95aOHiLB5uCu+9PRy2gZCeSZoDcqpnDvf3B+sTrMvMTr8qRUzBvWkoIqc82yG5prCboRjk1SVILKx6sg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-3.6.3.tgz", + "integrity": "sha512-VHSYWROT3flvNNI1SrnMOtW1EsjeHNK9dhU6s9eY5hryZe79lUqnZJyze/ymDe2LXAqzyj6y5oYvyBoZZk6ErA==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/plugin-debug": "3.5.2", - "@docusaurus/plugin-google-analytics": "3.5.2", - "@docusaurus/plugin-google-gtag": "3.5.2", - "@docusaurus/plugin-google-tag-manager": "3.5.2", - "@docusaurus/plugin-sitemap": "3.5.2", - "@docusaurus/theme-classic": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-search-algolia": "3.5.2", - "@docusaurus/types": "3.5.2" + "@docusaurus/core": "3.6.3", + "@docusaurus/plugin-content-blog": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/plugin-content-pages": "3.6.3", + "@docusaurus/plugin-debug": "3.6.3", + "@docusaurus/plugin-google-analytics": "3.6.3", + "@docusaurus/plugin-google-gtag": "3.6.3", + "@docusaurus/plugin-google-tag-manager": "3.6.3", + "@docusaurus/plugin-sitemap": "3.6.3", + "@docusaurus/theme-classic": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-search-algolia": "3.6.3", + "@docusaurus/types": "3.6.3" } }, "@docusaurus/theme-classic": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.5.2.tgz", - "integrity": "sha512-XRpinSix3NBv95Rk7xeMF9k4safMkwnpSgThn0UNQNumKvmcIYjfkwfh2BhwYh/BxMXQHJ/PdmNh22TQFpIaYg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-3.6.3.tgz", + "integrity": "sha512-1RRLK1tSArI2c00qugWYO3jRocjOZwGF1mBzPPylDVRwWCS/rnWWR91ChdbbaxIupRJ+hX8ZBYrwr5bbU0oztQ==", "requires": { - "@docusaurus/core": "3.5.2", - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/plugin-content-blog": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/plugin-content-pages": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/types": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/plugin-content-blog": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/plugin-content-pages": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-translations": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "@mdx-js/react": "^3.0.0", "clsx": "^2.0.0", "copy-text-to-clipboard": "^3.2.0", - "infima": "0.2.0-alpha.44", + "infima": "0.2.0-alpha.45", "lodash": "^4.17.21", "nprogress": "^0.2.0", "postcss": "^8.4.26", @@ -16565,14 +19471,14 @@ } }, "@docusaurus/theme-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.5.2.tgz", - "integrity": "sha512-QXqlm9S6x9Ibwjs7I2yEDgsCocp708DrCrgHgKwg2n2AY0YQ6IjU0gAK35lHRLOvAoJUfCKpQAwUykB0R7+Eew==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-3.6.3.tgz", + "integrity": "sha512-b8ZkhczXHDxWWyvz+YJy4t/PlPbEogTTbgnHoflYnH7rmRtyoodTsu8WVM12la5LmlMJBclBXFl29OH8kPE7gg==", "requires": { - "@docusaurus/mdx-loader": "3.5.2", - "@docusaurus/module-type-aliases": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", + "@docusaurus/mdx-loader": "3.6.3", + "@docusaurus/module-type-aliases": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", "@types/history": "^4.7.11", "@types/react": "*", "@types/react-router-config": "*", @@ -16584,18 +19490,18 @@ } }, "@docusaurus/theme-search-algolia": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.5.2.tgz", - "integrity": "sha512-qW53kp3VzMnEqZGjakaV90sst3iN1o32PH+nawv1uepROO8aEGxptcq2R5rsv7aBShSRbZwIobdvSYKsZ5pqvA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-3.6.3.tgz", + "integrity": "sha512-rt+MGCCpYgPyWCGXtbxlwFbTSobu15jWBTPI2LHsHNa5B0zSmOISX6FWYAPt5X1rNDOqMGM0FATnh7TBHRohVA==", "requires": { "@docsearch/react": "^3.5.2", - "@docusaurus/core": "3.5.2", - "@docusaurus/logger": "3.5.2", - "@docusaurus/plugin-content-docs": "3.5.2", - "@docusaurus/theme-common": "3.5.2", - "@docusaurus/theme-translations": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-validation": "3.5.2", + "@docusaurus/core": "3.6.3", + "@docusaurus/logger": "3.6.3", + "@docusaurus/plugin-content-docs": "3.6.3", + "@docusaurus/theme-common": "3.6.3", + "@docusaurus/theme-translations": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-validation": "3.6.3", "algoliasearch": "^4.18.0", "algoliasearch-helper": "^3.13.3", "clsx": "^2.0.0", @@ -16607,18 +19513,18 @@ } }, "@docusaurus/theme-translations": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.5.2.tgz", - "integrity": "sha512-GPZLcu4aT1EmqSTmbdpVrDENGR2yObFEX8ssEFYTCiAIVc0EihNSdOIBTazUvgNqwvnoU1A8vIs1xyzc3LITTw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-3.6.3.tgz", + "integrity": "sha512-Gb0regclToVlngSIIwUCtBMQBq48qVUaN1XQNKW4XwlsgUyk0vP01LULdqbem7czSwIeBAFXFoORJ0RPX7ht/w==", "requires": { "fs-extra": "^11.1.1", "tslib": "^2.6.0" } }, "@docusaurus/types": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.5.2.tgz", - "integrity": "sha512-N6GntLXoLVUwkZw7zCxwy9QiuEXIcTVzA9AkmNw16oc0AP3SXLrMmDMMBIfgqwuKWa6Ox6epHol9kMtJqekACw==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-3.6.3.tgz", + "integrity": "sha512-xD9oTGDrouWzefkhe9ogB2fDV96/82cRpNGx2HIvI5L87JHNhQVIWimQ/3JIiiX/TEd5S9s+VO6FFguwKNRVow==", "requires": { "@mdx-js/mdx": "^3.0.0", "@types/history": "^4.7.11", @@ -16627,17 +19533,30 @@ "joi": "^17.9.2", "react-helmet-async": "^1.3.0", "utility-types": "^3.10.0", - "webpack": "^5.88.1", + "webpack": "^5.95.0", "webpack-merge": "^5.9.0" + }, + "dependencies": { + "webpack-merge": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "requires": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + } + } } }, "@docusaurus/utils": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.5.2.tgz", - "integrity": "sha512-33QvcNFh+Gv+C2dP9Y9xWEzMgf3JzrpL2nW9PopidiohS1nDcyknKRx2DWaFvyVTTYIkkABVSr073VTj/NITNA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-3.6.3.tgz", + "integrity": "sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==", "requires": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils-common": "3.5.2", + "@docusaurus/logger": "3.6.3", + "@docusaurus/types": "3.6.3", + "@docusaurus/utils-common": "3.6.3", "@svgr/webpack": "^8.1.0", "escape-string-regexp": "^4.0.0", "file-loader": "^6.2.0", @@ -16659,21 +19578,22 @@ } }, "@docusaurus/utils-common": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.5.2.tgz", - "integrity": "sha512-i0AZjHiRgJU6d7faQngIhuHKNrszpL/SHQPgF1zH4H+Ij6E9NBYGy6pkcGWToIv7IVPbs+pQLh1P3whn0gWXVg==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-3.6.3.tgz", + "integrity": "sha512-v4nKDaANLgT3pMBewHYEMAl/ufY0LkXao1QkFWzI5huWFOmNQ2UFzv2BiKeHX5Ownis0/w6cAyoxPhVdDonlSQ==", "requires": { + "@docusaurus/types": "3.6.3", "tslib": "^2.6.0" } }, "@docusaurus/utils-validation": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.5.2.tgz", - "integrity": "sha512-m+Foq7augzXqB6HufdS139PFxDC5d5q2QKZy8q0qYYvGdI6nnlNsGH4cIGsgBnV7smz+mopl3g4asbSDvMV0jA==", + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-3.6.3.tgz", + "integrity": "sha512-bhEGGiN5BE38h21vjqD70Gxg++j+PfYVddDUE5UFvLDup68QOcpD33CLr+2knPorlxRbEaNfz6HQDUMQ3HuqKw==", "requires": { - "@docusaurus/logger": "3.5.2", - "@docusaurus/utils": "3.5.2", - "@docusaurus/utils-common": "3.5.2", + "@docusaurus/logger": "3.6.3", + "@docusaurus/utils": "3.6.3", + "@docusaurus/utils-common": "3.6.3", "fs-extra": "^11.2.0", "joi": "^17.9.2", "js-yaml": "^4.1.0", @@ -16694,6 +19614,49 @@ "@hapi/hoek": "^9.0.0" } }, + "@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "requires": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==" + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, "@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", @@ -16764,9 +19727,9 @@ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==" }, "@mdx-js/mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.0.1.tgz", - "integrity": "sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", + "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "requires": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", @@ -16774,14 +19737,15 @@ "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", - "estree-util-build-jsx": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", - "estree-util-to-js": "^2.0.0", + "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", - "hast-util-to-estree": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", - "periscopic": "^3.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", @@ -16831,6 +19795,12 @@ "fastq": "^1.6.0" } }, + "@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true + }, "@pnpm/config.env-replace": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", @@ -17081,27 +20051,27 @@ } }, "@types/eslint": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", - "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "requires": { "@types/estree": "*", "@types/json-schema": "*" } }, "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "requires": { "@types/eslint": "*", "@types/estree": "*" } }, "@types/estree": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.3.tgz", - "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==" }, "@types/estree-jsx": { "version": "1.0.5", @@ -17201,9 +20171,9 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/mdast": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", - "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "requires": { "@types/unist": "*" } @@ -17237,9 +20207,9 @@ } }, "@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" }, "@types/prismjs": { "version": "1.26.3", @@ -17354,9 +20324,9 @@ } }, "@types/unist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", - "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==" + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, "@types/ws": { "version": "8.5.10", @@ -17367,9 +20337,9 @@ } }, "@types/yargs": { - "version": "17.0.32", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.32.tgz", - "integrity": "sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==", + "version": "17.0.33", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", + "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", "requires": { "@types/yargs-parser": "*" } @@ -17380,138 +20350,138 @@ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, "@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.1.tgz", + "integrity": "sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==" }, "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==" }, "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==" }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==" }, "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==" }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==" }, "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -17535,15 +20505,9 @@ } }, "acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==" - }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "requires": {} + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==" }, "acorn-jsx": { "version": "5.3.2", @@ -17673,9 +20637,9 @@ } }, "algoliasearch-helper": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.4.tgz", - "integrity": "sha512-fvBCywguW9f+939S6awvRMstqMF1XXcd2qs1r1aGqL/PJ1go/DqN06tWmDVmhCDqBJanm++imletrQWf0G2S1g==", + "version": "3.22.6", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.22.6.tgz", + "integrity": "sha512-F2gSb43QHyvZmvH/2hxIjbk/uFdO2MguQYTFP7J+RowMW1csjIODMobEnpLI8nbLQuzZnGZdIxl5Bpy1k9+CFQ==", "requires": { "@algolia/events": "^4.0.1" } @@ -17688,6 +20652,21 @@ "string-width": "^4.1.0" } }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, "ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -17706,6 +20685,11 @@ "color-convert": "^2.0.1" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -17716,9 +20700,9 @@ } }, "arg": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", - "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" }, "argparse": { "version": "2.0.1", @@ -17736,9 +20720,9 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" }, "astring": { - "version": "1.8.6", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", - "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==" + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==" }, "at-least-node": { "version": "1.0.0", @@ -17759,9 +20743,9 @@ } }, "babel-loader": { - "version": "9.1.3", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", - "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "requires": { "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" @@ -17776,30 +20760,30 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.4.10", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.10.tgz", - "integrity": "sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==", + "version": "0.4.12", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz", + "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==", "requires": { "@babel/compat-data": "^7.22.6", - "@babel/helper-define-polyfill-provider": "^0.6.1", + "@babel/helper-define-polyfill-provider": "^0.6.3", "semver": "^6.3.1" } }, "babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" } }, "babel-plugin-polyfill-regenerator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.1.tgz", - "integrity": "sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz", + "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==", "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1" + "@babel/helper-define-polyfill-provider": "^0.6.3" } }, "bail": { @@ -17948,14 +20932,14 @@ } }, "browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "requires": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" } }, "buffer-from": { @@ -18025,6 +21009,11 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, "caniuse-api": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", @@ -18037,9 +21026,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001655", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", - "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==" + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==" }, "ccount": { "version": "2.0.1", @@ -18291,14 +21280,14 @@ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==" }, "consola": { - "version": "2.15.3", - "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", - "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==" }, "content-disposition": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "integrity": "sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==" }, "content-type": { "version": "1.0.5", @@ -18347,13 +21336,13 @@ } }, "globby": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.2.tgz", - "integrity": "sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "requires": { "dir-glob": "^3.0.1", - "fast-glob": "^3.2.11", - "ignore": "^5.2.0", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } @@ -18371,17 +21360,17 @@ "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==" }, "core-js-compat": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.36.1.tgz", - "integrity": "sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==", + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz", + "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==", "requires": { - "browserslist": "^4.23.0" + "browserslist": "^4.24.2" } }, "core-js-pure": { - "version": "3.36.1", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.36.1.tgz", - "integrity": "sha512-NXCvHvSVYSrewP0L5OhltzXeWFJLo2AL2TYnj6iLV3Bw8mM62wAQMNgUCRI6EBu6hVVpbCxmOPlxh1Ikw2PfUA==" + "version": "3.39.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz", + "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==" }, "core-util-is": { "version": "1.0.3", @@ -18417,12 +21406,58 @@ "type-fest": "^1.0.1" } }, + "css-blank-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-7.0.1.tgz", + "integrity": "sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, "css-declaration-sorter": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "requires": {} }, + "css-has-pseudo": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-7.0.1.tgz", + "integrity": "sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==", + "requires": { + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0", + "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "requires": {} + }, + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, "css-loader": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz", @@ -18439,12 +21474,9 @@ }, "dependencies": { "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" } } }, @@ -18482,6 +21514,12 @@ } } }, + "css-prefers-color-scheme": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-10.0.0.tgz", + "integrity": "sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==", + "requires": {} + }, "css-select": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", @@ -18508,6 +21546,11 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, + "cssdb": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-8.2.3.tgz", + "integrity": "sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==" + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -18683,11 +21726,13 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { - "object-keys": "^1.0.12" + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" } }, "del": { @@ -18754,7 +21799,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -18766,6 +21811,11 @@ "dequal": "^2.0.0" } }, + "didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -18774,6 +21824,11 @@ "path-type": "^4.0.0" } }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, "dns-packet": { "version": "5.6.1", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", @@ -18863,9 +21918,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { - "version": "1.5.13", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", - "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==" + "version": "1.5.62", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.62.tgz", + "integrity": "sha512-t8c+zLmJHa9dJy96yBZRXGQYoiCEnHYgFwn1asvSPZSUdVxnB62A4RASd7k41ytG3ErFBA0TpHlKg9D9SQBmLg==" }, "emoji-regex": { "version": "8.0.0", @@ -18883,9 +21938,9 @@ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "emoticon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.0.1.tgz", - "integrity": "sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-4.1.0.tgz", + "integrity": "sha512-VWZfnxqwNcc51hIy/sbOdEem6D+cVtpPzEEtVAFdaas30+1dgkyaOQ4sQ6Bp0tOMqWO1v+HQfYaoodOkdhK6SQ==" }, "encodeurl": { "version": "1.0.2", @@ -18893,9 +21948,9 @@ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -18932,6 +21987,28 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.1.tgz", "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==" }, + "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", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "requires": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + } + }, + "esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "requires": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -19010,6 +22087,15 @@ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==" }, + "estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "requires": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + } + }, "estree-util-to-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", @@ -19028,12 +22114,11 @@ } }, "estree-util-value-to-estree": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.1.1.tgz", - "integrity": "sha512-5mvUrF2suuv5f5cGDnDphIy4/gW86z82kl5qG6mM9z04SEQI4FB5Apmaw/TGEf3l55nLtMs5s51dmhUzvAHQCA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/estree-util-value-to-estree/-/estree-util-value-to-estree-3.2.1.tgz", + "integrity": "sha512-Vt2UOjyPbNQQgT5eJh+K5aATti0OjCIAGc9SgMdOFYbohuifsWclR74l0iZTJwePMgWYdX1hlVS+dedH9XV8kw==", "requires": { - "@types/estree": "^1.0.0", - "is-plain-obj": "^4.0.0" + "@types/estree": "^1.0.0" } }, "estree-util-visit": { @@ -19193,9 +22278,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -19209,21 +22294,6 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, - "fast-url-parser": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", - "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", - "requires": { - "punycode": "^1.3.2" - }, - "dependencies": { - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - } - } - }, "fastq": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz", @@ -19256,6 +22326,21 @@ "xml-js": "^1.6.11" } }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + } + } + }, "file-loader": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", @@ -19266,11 +22351,11 @@ }, "dependencies": { "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -19335,13 +22420,6 @@ "requires": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" - }, - "dependencies": { - "path-exists": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", - "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" - } } }, "flat": { @@ -19354,10 +22432,26 @@ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==" }, + "foreground-child": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", + "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", + "requires": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "dependencies": { + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==" + } + } + }, "fork-ts-checker-webpack-plugin": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.0.tgz", - "integrity": "sha512-cS178Y+xxtIjEUorcHddKS7yCMlrDPV31mt47blKKRfMd70Kxu5xruAFE2o9sDY6wVC5deuob/u/alD04YYHnw==", + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", "requires": { "@babel/code-frame": "^7.8.3", "@types/json-schema": "^7.0.5", @@ -19408,12 +22502,9 @@ } }, "semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" }, "tapable": { "version": "1.1.3", @@ -19678,14 +22769,6 @@ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -19723,14 +22806,14 @@ } }, "hast-util-from-parse5": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.1.tgz", - "integrity": "sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-8.0.2.tgz", + "integrity": "sha512-SfMzfdAi/zAoZ1KkFEyyeXBn7u/ShQrfd675ZEE9M3qj+PMFX05xubzRyF76CCSJu8au9jgVxDV1+okFvgZU4A==", "requires": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", - "hastscript": "^8.0.0", + "hastscript": "^9.0.0", "property-information": "^6.0.0", "vfile": "^6.0.0", "vfile-location": "^5.0.0", @@ -19746,9 +22829,9 @@ } }, "hast-util-raw": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.0.2.tgz", - "integrity": "sha512-PldBy71wO9Uq1kyaMch9AHIghtQvIwxBUkv823pKmkTM3oV1JxtsTNYdevMxvUHqcnOAuO65JKU2+0NOxc2ksA==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-9.1.0.tgz", + "integrity": "sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==", "requires": { "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", @@ -19786,12 +22869,27 @@ "style-to-object": "^0.4.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" + }, + "dependencies": { + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "style-to-object": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", + "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "requires": { + "inline-style-parser": "0.1.1" + } + } } }, "hast-util-to-jsx-runtime": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz", - "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.2.tgz", + "integrity": "sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==", "requires": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", @@ -19808,21 +22906,6 @@ "style-to-object": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" - }, - "dependencies": { - "inline-style-parser": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz", - "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g==" - }, - "style-to-object": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz", - "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==", - "requires": { - "inline-style-parser": "0.2.3" - } - } } }, "hast-util-to-parse5": { @@ -19848,9 +22931,9 @@ } }, "hastscript": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-8.0.0.tgz", - "integrity": "sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-9.0.0.tgz", + "integrity": "sha512-jzaLBGavEDKHrc5EfFImKN7nZKKBdSLIdGvCwDZ9TfzbF2ffXiov8CKE445L2Z1Ek2t/m4SKQ2j6Ipv7NyUolw==", "requires": { "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", @@ -20095,9 +23178,9 @@ "requires": {} }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==" + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==" }, "image-size": { "version": "1.1.1", @@ -20108,9 +23191,9 @@ } }, "immer": { - "version": "9.0.12", - "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.12.tgz", - "integrity": "sha512-lk7UNmSbAukB5B6dh9fnh5D0bJTOFKxVg2cyJWTYrWRfhLrLMBquONcUs3aFq507hNoIZEDDh8lb8UtOizSMhA==" + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" }, "import-fresh": { "version": "3.3.0", @@ -20137,9 +23220,9 @@ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" }, "infima": { - "version": "0.2.0-alpha.44", - "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.44.tgz", - "integrity": "sha512-tuRkUSO/lB3rEhLJk25atwAjgLuzq070+pOW8XcvpHky/YbENnRRdPd85IBkyeTgttmOy5ah+yHYsK1HhUd4lQ==" + "version": "0.2.0-alpha.45", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.45.tgz", + "integrity": "sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==" }, "inflight": { "version": "1.0.6", @@ -20161,9 +23244,9 @@ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" }, "inline-style-parser": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", - "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", + "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==" }, "interpret": { "version": "1.4.0", @@ -20200,7 +23283,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-binary-path": { "version": "2.1.0", @@ -20219,11 +23302,11 @@ } }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "requires": { - "has": "^1.0.3" + "hasown": "^2.0.2" } }, "is-decimal": { @@ -20311,14 +23394,6 @@ "isobject": "^3.0.1" } }, - "is-reference": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", - "requires": { - "@types/estree": "*" - } - }, "is-regexp": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", @@ -20367,6 +23442,15 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, + "jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "requires": { + "@isaacs/cliui": "^8.0.2", + "@pkgjs/parseargs": "^0.11.0" + } + }, "jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", @@ -20401,14 +23485,14 @@ } }, "jiti": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==" + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==" }, "joi": { - "version": "17.12.3", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.12.3.tgz", - "integrity": "sha512-2RRziagf555owrm9IRVtdKynOBeITiDpuZqIpgwqXShPncPKNiRQoiGsl/T8SQdq+8ugRzH2LqY67irr2y/d+g==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "requires": { "@hapi/hoek": "^9.3.0", "@hapi/topo": "^5.1.0", @@ -20431,9 +23515,9 @@ } }, "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==" }, "json-buffer": { "version": "3.0.1", @@ -20591,15 +23675,21 @@ "yallist": "^4.0.0" } }, + "lucide-react": { + "version": "0.436.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.436.0.tgz", + "integrity": "sha512-N292bIxoqm1aObAg0MzFtvhYwgQE6qnIOWx/GLj5ONgcTPH6N0fD9bVq/GfdeC9ZORBXozt/XeEKDpiB3x3vlQ==", + "requires": {} + }, "markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==" }, "markdown-table": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz", - "integrity": "sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==" + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==" }, "mdast-util-directive": { "version": "3.0.0", @@ -20635,9 +23725,9 @@ } }, "mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", + "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "requires": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", @@ -20654,9 +23744,9 @@ }, "dependencies": { "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -20695,9 +23785,9 @@ } }, "mdast-util-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", "requires": { "@types/mdast": "^4.0.0", "ccount": "^2.0.0", @@ -20707,18 +23797,18 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -20780,9 +23870,9 @@ } }, "mdast-util-mdx-expression": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", - "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "requires": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -20793,9 +23883,9 @@ } }, "mdast-util-mdx-jsx": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", - "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.3.tgz", + "integrity": "sha512-bfOjvNt+1AcbPLTFMFWY149nJz0OjmewJs3LQQ5pIyVGxP4CdOqNVJL6kTaM5c68p8q82Xv3nCyFfUnuEcH3UQ==", "requires": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", @@ -20807,7 +23897,6 @@ "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", - "unist-util-remove-position": "^5.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } @@ -20835,9 +23924,9 @@ } }, "mdast-util-to-hast": { - "version": "13.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz", - "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==", + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.0.tgz", + "integrity": "sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==", "requires": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -20851,15 +23940,16 @@ } }, "mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "requires": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" @@ -20917,9 +24007,9 @@ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.1.tgz", + "integrity": "sha512-eBPdkcoCNvYcxQOAKAlceo5SNdzZWfF+FcSupREAzdAh9rRmE239CEQAiTwIgblwnoM8zzj35sZ5ZwvSEOF6Kw==", "requires": { "@types/debug": "^4.0.0", "debug": "^4.0.0", @@ -20941,34 +24031,34 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.2.tgz", + "integrity": "sha512-FKjQKbxd1cibWMM1P9N+H8TwlgGgSkWZMmfuVucLCHaYqeSvJ0hFeHsIa65pA2nYbes0f8LDHPMrd9X7Ujxg9w==", "requires": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", @@ -20989,34 +24079,34 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-extension-directive": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.0.tgz", - "integrity": "sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-3.0.2.tgz", + "integrity": "sha512-wjcXHgk+PPdmvR58Le9d7zQYWy+vKEU9Se44p2CrCDPiLr2FMyiT4Fyb5UFKFC66wGB3kPlgD7q3TnoqPS7SZA==", "requires": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -21028,27 +24118,27 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21064,18 +24154,18 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21095,9 +24185,9 @@ } }, "micromark-extension-gfm-autolink-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.0.0.tgz", - "integrity": "sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", @@ -21106,25 +24196,25 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-extension-gfm-footnote": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.0.0.tgz", - "integrity": "sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", "requires": { "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", @@ -21137,34 +24227,34 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-extension-gfm-strikethrough": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.0.0.tgz", - "integrity": "sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", "requires": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -21175,16 +24265,16 @@ }, "dependencies": { "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-extension-gfm-table": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.0.0.tgz", - "integrity": "sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.0.tgz", + "integrity": "sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==", "requires": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -21194,27 +24284,27 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21227,9 +24317,9 @@ } }, "micromark-extension-gfm-task-list-item": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.0.1.tgz", - "integrity": "sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", "requires": { "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", @@ -21239,27 +24329,27 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21279,34 +24369,34 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-extension-mdx-jsx": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.0.tgz", - "integrity": "sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.1.tgz", + "integrity": "sha512-vNuFb9czP8QCtAQcEJn0UJQJZA8Dk6DXKBqx+bg/w0WGuSxDxNr7hErW89tHUY31dUW4NqEOWwmEUNhjTFmHkg==", "requires": { "@types/acorn": "^4.0.0", "@types/estree": "^1.0.0", @@ -21315,33 +24405,34 @@ "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21385,25 +24476,25 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -21411,25 +24502,25 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "requires": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -21438,28 +24529,29 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-factory-mdx-expression": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.1.tgz", - "integrity": "sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.2.tgz", + "integrity": "sha512-5E5I2pFzJyg2CtemqAbcyCktpHXuJbABnsb32wX2U8IQKhhVFBqkcZR5LRm1WVoFqa4kTueZK4abep7wdo9nrw==", "requires": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -21468,19 +24560,28 @@ "vfile-message": "^4.0.0" }, "dependencies": { + "micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "requires": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21501,9 +24602,9 @@ } }, "micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "requires": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -21512,34 +24613,34 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "requires": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", @@ -21548,27 +24649,27 @@ }, "dependencies": { "micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21589,24 +24690,24 @@ } }, "micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "requires": { "micromark-util-symbol": "^2.0.0" }, "dependencies": { "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", @@ -21614,49 +24715,49 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "requires": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-decode-numeric-character-reference": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", - "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "requires": { "micromark-util-symbol": "^2.0.0" }, "dependencies": { "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "requires": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", @@ -21665,25 +24766,25 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==" }, "micromark-util-events-to-acorn": { "version": "2.0.2", @@ -21701,44 +24802,44 @@ }, "dependencies": { "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==" }, "micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "requires": { "micromark-util-symbol": "^2.0.0" }, "dependencies": { "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "requires": { "micromark-util-types": "^2.0.0" } }, "micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "requires": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", @@ -21746,25 +24847,25 @@ }, "dependencies": { "micromark-util-character": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", - "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, "micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.3.tgz", + "integrity": "sha512-VXJJuNxYWSoYL6AJ6OQECCFGhIU2GGHMw8tahogePBrjkG8aCCas3ibkp7RnVOSTClg2is05/R7maAhF1XyQMg==", "requires": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", @@ -21773,9 +24874,9 @@ }, "dependencies": { "micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==" } } }, @@ -21785,9 +24886,9 @@ "integrity": "sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==" }, "micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.1.tgz", + "integrity": "sha512-534m2WhVTddrcKVepwmVEVnUAmtrx9bfIjNoQHRqfnvdaHQiFytEhJoTgpWJvDEXCO5gLTQh3wYC1PgOJA4NSQ==" }, "micromatch": { "version": "4.0.5", @@ -21827,9 +24928,9 @@ "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==" }, "mini-css-extract-plugin": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.8.1.tgz", - "integrity": "sha512-/1HDlyFRxWIZPI1ZpgqlZ8jMw/1Dp/dl3P0L1jtZ+zVcHqwPhGwaJwKL00WVgfnBy6PWCde9W65or7IIETImuA==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "requires": { "schema-utils": "^4.0.0", "tapable": "^2.2.1" @@ -21853,6 +24954,11 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==" + }, "mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -21872,6 +24978,16 @@ "thunky": "^1.0.2" } }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -21897,9 +25013,9 @@ } }, "node-emoji": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.1.3.tgz", - "integrity": "sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-2.2.0.tgz", + "integrity": "sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==", "requires": { "@sindresorhus/is": "^4.6.0", "char-regex": "^1.0.2", @@ -21948,11 +25064,37 @@ "boolbase": "^1.0.0" } }, + "null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==" + }, "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", @@ -21964,13 +25106,13 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object.assign": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", - "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "has-symbols": "^1.0.1", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", "object-keys": "^1.1.1" } }, @@ -22029,11 +25171,11 @@ "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==" }, "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", "requires": { - "p-try": "^2.0.0" + "yocto-queue": "^1.0.0" } }, "p-locate": { @@ -22042,21 +25184,6 @@ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", "requires": { "p-limit": "^4.0.0" - }, - "dependencies": { - "p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", - "requires": { - "yocto-queue": "^1.0.0" - } - }, - "yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==" - } } }, "p-map": { @@ -22102,6 +25229,11 @@ } } }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==" + }, "param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -22135,9 +25267,9 @@ }, "dependencies": { "@types/unist": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", - "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==" + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==" } } }, @@ -22158,19 +25290,19 @@ "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" }, "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "requires": { - "entities": "^4.4.0" + "entities": "^4.5.0" } }, "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "requires": { - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, @@ -22189,9 +25321,9 @@ } }, "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==" }, "path-is-absolute": { "version": "1.0.1", @@ -22201,7 +25333,7 @@ "path-is-inside": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==" }, "path-key": { "version": "3.1.1", @@ -22213,36 +25345,52 @@ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, + "path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "requires": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==" + } + } + }, "path-to-regexp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", - "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", + "integrity": "sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==" }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, - "periscopic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", - "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", - "requires": { - "@types/estree": "^1.0.0", - "estree-walker": "^3.0.0", - "is-reference": "^3.0.0" - } - }, "picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" + }, + "pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==" + }, "pkg-dir": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", @@ -22276,6 +25424,14 @@ "path-exists": "^3.0.0" } }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", @@ -22287,7 +25443,7 @@ "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==" } } }, @@ -22299,13 +25455,32 @@ } }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + } + }, + "postcss-attribute-case-insensitive": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-7.0.1.tgz", + "integrity": "sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-calc": { @@ -22317,6 +25492,44 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-functional-notation": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-7.0.6.tgz", + "integrity": "sha512-wLXvm8RmLs14Z2nVpB4CWlnvaWPRcOZFltJSlcbYwSJ1EDZKsKDhPKIMecCnuU054KSmlmubkqczmm6qBPCBhA==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-10.0.0.tgz", + "integrity": "sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==", + "requires": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-10.0.0.tgz", + "integrity": "sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==", + "requires": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, "postcss-colormin": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz", @@ -22337,6 +25550,70 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-custom-media": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", + "requires": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" + } + }, + "postcss-custom-properties": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-14.0.4.tgz", + "integrity": "sha512-QnW8FCCK6q+4ierwjnmXF9Y9KF8q0JkbgVfvQEMa93x1GT8FvOiUevWCN2YLaOWyByeDX8S6VFbZEeWoAoXs2A==", + "requires": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-8.0.4.tgz", + "integrity": "sha512-ASOXqNvDCE0dAJ/5qixxPeL1aOVGHGW2JwSy7HyjWNbnWTQCl+fDc968HY1jCmZI0+BaYT5CxsOiUhavpG/7eg==", + "requires": { + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-dir-pseudo-class": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-9.0.1.tgz", + "integrity": "sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, "postcss-discard-comments": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz", @@ -22369,6 +25646,121 @@ "postcss-selector-parser": "^6.0.16" } }, + "postcss-double-position-gradients": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-6.0.0.tgz", + "integrity": "sha512-JkIGah3RVbdSEIrcobqj4Gzq0h53GG4uqDPsho88SgY84WnpkTpI0k50MFK/sX7XqVisZ6OqUfFnoUO6m1WWdg==", + "requires": { + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-focus-visible": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-10.0.1.tgz", + "integrity": "sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-focus-within": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "requires": {} + }, + "postcss-gap-properties": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-6.0.0.tgz", + "integrity": "sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==", + "requires": {} + }, + "postcss-image-set-function": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-7.0.0.tgz", + "integrity": "sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==", + "requires": { + "@csstools/utilities": "^2.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "requires": { + "camelcase-css": "^2.0.1" + } + }, + "postcss-lab-function": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-7.0.6.tgz", + "integrity": "sha512-HPwvsoK7C949vBZ+eMyvH2cQeMr3UREoHvbtra76/UhDuiViZH6pir+z71UaJQohd7VDSVUdR6TkWYKExEc9aQ==", + "requires": { + "@csstools/css-color-parser": "^3.0.6", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/utilities": "^2.0.0" + } + }, + "postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "requires": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "dependencies": { + "yaml": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.0.tgz", + "integrity": "sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==" + } + } + }, "postcss-loader": { "version": "7.3.4", "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.4.tgz", @@ -22380,15 +25772,20 @@ }, "dependencies": { "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==" } } }, + "postcss-logical": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-8.0.0.tgz", + "integrity": "sha512-HpIdsdieClTjXLOyYdUPAX/XQASNIwdKt5hoZW08ZOAiI+tbV0ta1oclkpVkW5ANU+xJvk3KkA0FejkjGLXUkg==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, "postcss-merge-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-6.0.3.tgz", @@ -22461,21 +25858,43 @@ "requires": {} }, "postcss-modules-local-by-default": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", - "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz", + "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==", "requires": { "icss-utils": "^5.0.0", - "postcss-selector-parser": "^6.0.2", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-modules-scope": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", - "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", + "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", "requires": { - "postcss-selector-parser": "^6.0.4" + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-modules-values": { @@ -22486,6 +25905,47 @@ "icss-utils": "^5.0.0" } }, + "postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "requires": { + "postcss-selector-parser": "^6.1.1" + } + }, + "postcss-nesting": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", + "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "requires": { + "@csstools/selector-resolve-nested": "^3.0.0", + "@csstools/selector-specificity": "^5.0.0", + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "@csstools/selector-resolve-nested": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", + "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "requires": {} + }, + "@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "requires": {} + }, + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, "postcss-normalize-charset": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz", @@ -22557,6 +26017,12 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-opacity-percentage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-3.0.0.tgz", + "integrity": "sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==", + "requires": {} + }, "postcss-ordered-values": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz", @@ -22566,6 +26032,117 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-overflow-shorthand": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-6.0.0.tgz", + "integrity": "sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "requires": {} + }, + "postcss-place": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-10.0.0.tgz", + "integrity": "sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==", + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-10.1.1.tgz", + "integrity": "sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==", + "requires": { + "@csstools/postcss-cascade-layers": "^5.0.1", + "@csstools/postcss-color-function": "^4.0.6", + "@csstools/postcss-color-mix-function": "^3.0.6", + "@csstools/postcss-content-alt-text": "^2.0.4", + "@csstools/postcss-exponential-functions": "^2.0.5", + "@csstools/postcss-font-format-keywords": "^4.0.0", + "@csstools/postcss-gamut-mapping": "^2.0.6", + "@csstools/postcss-gradients-interpolation-method": "^5.0.6", + "@csstools/postcss-hwb-function": "^4.0.6", + "@csstools/postcss-ic-unit": "^4.0.0", + "@csstools/postcss-initial": "^2.0.0", + "@csstools/postcss-is-pseudo-class": "^5.0.1", + "@csstools/postcss-light-dark-function": "^2.0.7", + "@csstools/postcss-logical-float-and-clear": "^3.0.0", + "@csstools/postcss-logical-overflow": "^2.0.0", + "@csstools/postcss-logical-overscroll-behavior": "^2.0.0", + "@csstools/postcss-logical-resize": "^3.0.0", + "@csstools/postcss-logical-viewport-units": "^3.0.3", + "@csstools/postcss-media-minmax": "^2.0.5", + "@csstools/postcss-media-queries-aspect-ratio-number-values": "^3.0.4", + "@csstools/postcss-nested-calc": "^4.0.0", + "@csstools/postcss-normalize-display-values": "^4.0.0", + "@csstools/postcss-oklab-function": "^4.0.6", + "@csstools/postcss-progressive-custom-properties": "^4.0.0", + "@csstools/postcss-random-function": "^1.0.1", + "@csstools/postcss-relative-color-syntax": "^3.0.6", + "@csstools/postcss-scope-pseudo-class": "^4.0.1", + "@csstools/postcss-sign-functions": "^1.1.0", + "@csstools/postcss-stepped-value-functions": "^4.0.5", + "@csstools/postcss-text-decoration-shorthand": "^4.0.1", + "@csstools/postcss-trigonometric-functions": "^4.0.5", + "@csstools/postcss-unset-value": "^4.0.0", + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.1", + "css-blank-pseudo": "^7.0.1", + "css-has-pseudo": "^7.0.1", + "css-prefers-color-scheme": "^10.0.0", + "cssdb": "^8.2.1", + "postcss-attribute-case-insensitive": "^7.0.1", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^7.0.6", + "postcss-color-hex-alpha": "^10.0.0", + "postcss-color-rebeccapurple": "^10.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-custom-properties": "^14.0.4", + "postcss-custom-selectors": "^8.0.4", + "postcss-dir-pseudo-class": "^9.0.1", + "postcss-double-position-gradients": "^6.0.0", + "postcss-focus-visible": "^10.0.1", + "postcss-focus-within": "^9.0.1", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^6.0.0", + "postcss-image-set-function": "^7.0.0", + "postcss-lab-function": "^7.0.6", + "postcss-logical": "^8.0.0", + "postcss-nesting": "^13.0.1", + "postcss-opacity-percentage": "^3.0.0", + "postcss-overflow-shorthand": "^6.0.0", + "postcss-page-break": "^3.0.4", + "postcss-place": "^10.0.0", + "postcss-pseudo-class-any-link": "^10.0.1", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^8.0.1" + } + }, + "postcss-pseudo-class-any-link": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-10.0.1.tgz", + "integrity": "sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, "postcss-reduce-idents": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-6.0.3.tgz", @@ -22591,10 +26168,35 @@ "postcss-value-parser": "^4.2.0" } }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "requires": {} + }, + "postcss-selector-not": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-8.0.1.tgz", + "integrity": "sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==", + "requires": { + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } + } + }, "postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -22858,9 +26460,9 @@ } }, "loader-utils": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", - "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==" + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.3.1.tgz", + "integrity": "sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==" }, "locate-path": { "version": "6.0.0", @@ -22885,6 +26487,16 @@ "requires": { "p-limit": "^3.0.2" } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" } } }, @@ -22994,6 +26606,14 @@ "tiny-warning": "^1.0.0" } }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "requires": { + "pify": "^2.3.0" + } + }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -23025,6 +26645,50 @@ "resolve": "^1.1.6" } }, + "recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "requires": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + } + }, + "recma-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", + "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", + "requires": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + } + }, + "recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "requires": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + } + }, + "recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "requires": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + } + }, "recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -23039,17 +26703,17 @@ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { - "version": "10.1.1", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", - "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz", + "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==", "requires": { "regenerate": "^1.4.2" } }, "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "regenerator-transform": { "version": "0.15.2", @@ -23060,14 +26724,14 @@ } }, "regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.2.0.tgz", + "integrity": "sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==", "requires": { - "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", + "regenerate-unicode-properties": "^10.2.0", + "regjsgen": "^0.8.0", + "regjsparser": "^0.12.0", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" } @@ -23088,12 +26752,17 @@ "rc": "1.2.8" } }, + "regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==" + }, "regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", "requires": { - "jsesc": "~0.5.0" + "jsesc": "~3.0.2" } }, "rehype-raw": { @@ -23106,6 +26775,16 @@ "vfile": "^6.0.0" } }, + "rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "requires": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + } + }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", @@ -23159,9 +26838,9 @@ } }, "remark-mdx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.0.1.tgz", - "integrity": "sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", + "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", "requires": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" @@ -23179,9 +26858,9 @@ } }, "remark-rehype": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz", - "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.1.tgz", + "integrity": "sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==", "requires": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", @@ -23270,6 +26949,11 @@ } } }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -23286,11 +26970,11 @@ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -23421,9 +27105,9 @@ } }, "search-insights": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.1.tgz", - "integrity": "sha512-HHFjYH/0AqXacETlIbe9EYc3UNlQYGNNTY0fZ/sWl6SweX+GDxq9NB5+RVoPLgEFuOtCz7M9dhYxqDnhbbF0eQ==", + "version": "2.17.3", + "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", + "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "peer": true }, "section-matter": { @@ -23523,17 +27207,16 @@ } }, "serve-handler": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz", - "integrity": "sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg==", + "version": "6.1.6", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.6.tgz", + "integrity": "sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==", "requires": { "bytes": "3.0.0", "content-disposition": "0.5.2", - "fast-url-parser": "1.1.3", "mime-types": "2.1.18", "minimatch": "3.1.2", "path-is-inside": "1.0.2", - "path-to-regexp": "2.2.1", + "path-to-regexp": "3.3.0", "range-parser": "1.2.0" }, "dependencies": { @@ -23553,7 +27236,7 @@ "range-parser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + "integrity": "sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==" } } }, @@ -23772,9 +27455,9 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==" }, "source-map-support": { "version": "0.5.20", @@ -23830,6 +27513,11 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, + "std-env": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -23855,6 +27543,16 @@ "strip-ansi": "^6.0.0" } }, + "string-width-cjs": { + "version": "npm:string-width@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.1" + } + }, "stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", @@ -23882,6 +27580,14 @@ "ansi-regex": "^5.0.1" } }, + "strip-ansi-cjs": { + "version": "npm:strip-ansi@6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, "strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -23898,11 +27604,11 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==" }, "style-to-object": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.4.4.tgz", - "integrity": "sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", + "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "requires": { - "inline-style-parser": "0.1.1" + "inline-style-parser": "0.2.4" } }, "stylehacks": { @@ -23914,6 +27620,56 @@ "postcss-selector-parser": "^6.0.16" } }, + "sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "requires": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "requires": { + "balanced-match": "^1.0.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "requires": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + } + }, + "minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -23953,15 +27709,59 @@ } } }, + "tailwindcss": { + "version": "3.4.12", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.12.tgz", + "integrity": "sha512-Htf/gHj2+soPb9UayUNci/Ja3d8pTmu9ONTfh4QY8r3MATTZOzmv6UYWF7ZwikEIC8okpfqmGqrmDehua8mF8w==", + "requires": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "requires": { + "is-glob": "^4.0.3" + } + }, + "lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==" + } + } + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "terser": { - "version": "5.22.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz", - "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "version": "5.36.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz", + "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==", "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -23977,15 +27777,15 @@ } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "terser": "^5.26.0" }, "dependencies": { "schema-utils": { @@ -24003,7 +27803,23 @@ "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "requires": { + "thenify": ">= 3.1.0 < 4" + } }, "thunky": { "version": "1.1.0", @@ -24020,11 +27836,6 @@ "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -24053,6 +27864,11 @@ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==" }, + "ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, "tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", @@ -24081,15 +27897,15 @@ } }, "typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "peer": true }, "unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==" }, "unicode-emoji-modifier-base": { "version": "1.0.0", @@ -24106,9 +27922,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz", + "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==" }, "unicode-property-aliases-ecmascript": { "version": "2.1.0", @@ -24116,9 +27932,9 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==" }, "unified": { - "version": "11.0.4", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", - "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "requires": { "@types/unist": "^3.0.0", "bail": "^2.0.0", @@ -24161,15 +27977,6 @@ "@types/unist": "^3.0.0" } }, - "unist-util-remove-position": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", - "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", - "requires": { - "@types/unist": "^3.0.0", - "unist-util-visit": "^5.0.0" - } - }, "unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -24208,12 +28015,12 @@ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "update-notifier": { @@ -24324,11 +28131,11 @@ }, "dependencies": { "schema-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", - "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "requires": { - "@types/json-schema": "^7.0.6", + "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } @@ -24371,19 +28178,18 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "vfile": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", - "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "requires": { "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "vfile-location": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", - "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.3.tgz", + "integrity": "sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==", "requires": { "@types/unist": "^3.0.0", "vfile": "^6.0.0" @@ -24399,9 +28205,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -24421,36 +28227,40 @@ "integrity": "sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==" }, "webpack": { - "version": "5.89.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", - "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "version": "5.96.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz", + "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==", "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" + }, "schema-utils": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", @@ -24547,13 +28357,13 @@ } }, "webpack-merge": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", - "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", + "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", "requires": { "clone-deep": "^4.0.1", "flat": "^5.0.2", - "wildcard": "^2.0.0" + "wildcard": "^2.0.1" } }, "webpack-sources": { @@ -24562,20 +28372,37 @@ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" }, "webpackbar": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz", - "integrity": "sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-6.0.1.tgz", + "integrity": "sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==", "requires": { - "chalk": "^4.1.0", - "consola": "^2.15.3", + "ansi-escapes": "^4.3.2", + "chalk": "^4.1.2", + "consola": "^3.2.3", + "figures": "^3.2.0", + "markdown-table": "^2.0.0", "pretty-time": "^1.1.0", - "std-env": "^3.0.1" + "std-env": "^3.7.0", + "wrap-ansi": "^7.0.0" }, "dependencies": { - "std-env": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.0.1.tgz", - "integrity": "sha512-mC1Ps9l77/97qeOZc+HrOL7TIaOboHqMZ24dGVQrlxFcpPpfCHpH+qfUT7Dz+6mlG8+JPA1KfBQo19iC/+Ngcw==" + "markdown-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz", + "integrity": "sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==", + "requires": { + "repeat-string": "^1.0.0" + } + }, + "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" + } } } }, @@ -24690,6 +28517,16 @@ } } }, + "wrap-ansi-cjs": { + "version": "npm:wrap-ansi@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" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -24736,9 +28573,9 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==" }, "zwitch": { "version": "2.0.4", diff --git a/docs/package.json b/docs/package.json index 2a740434cc..1c537597d1 100644 --- a/docs/package.json +++ b/docs/package.json @@ -5,7 +5,7 @@ "scripts": { "docusaurus": "docusaurus", "start": "docusaurus start", - "build": "docusaurus build", + "build": "npm install && docusaurus build", "swizzle": "docusaurus swizzle", "deploy": "docusaurus deploy", "clear": "docusaurus clear", @@ -14,21 +14,25 @@ "write-heading-ids": "docusaurus write-heading-ids" }, "dependencies": { - "@docusaurus/core": "^3.5.2", - "@docusaurus/plugin-client-redirects": "^3.5.2", - "@docusaurus/plugin-google-gtag": "^3.5.2", - "@docusaurus/plugin-sitemap": "^3.5.2", - "@docusaurus/preset-classic": "^3.5.2", + "@docusaurus/core": "^3.6.3", + "@docusaurus/plugin-client-redirects": "^3.6.3", + "@docusaurus/plugin-google-gtag": "^3.6.3", + "@docusaurus/plugin-sitemap": "^3.6.3", + "@docusaurus/preset-classic": "^3.6.3", "@mdx-js/react": "^3.0.1", + "autoprefixer": "^10.4.20", "clsx": "^2.0.0", + "lucide-react": "^0.436.0", "plugin-image-zoom": "github:flexanalytics/plugin-image-zoom", + "postcss": "^8.4.41", "prism-react-renderer": "^2.1.0", "react": "^18.2.0", - "react-dom": "^18.2.0" + "react-dom": "^18.2.0", + "tailwindcss": "^3.4.12" }, "devDependencies": { - "@docusaurus/module-type-aliases": "^3.5.2", - "@docusaurus/types": "^3.5.2" + "@docusaurus/module-type-aliases": "^3.6.3", + "@docusaurus/types": "^3.6.3" }, "overrides": { "got": "^12.1.0", diff --git a/docs/postcss.config.js b/docs/postcss.config.js new file mode 100644 index 0000000000..ffc77e2bfa --- /dev/null +++ b/docs/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, + }; \ No newline at end of file diff --git a/docs/sidebars.js b/docs/sidebars.js index ae0a868555..93d51fe0ba 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -13,69 +13,124 @@ const sidebars = { { 'type': 'category', 'label': 'Getting Started', + 'className': 'category-as-header getting-started-header', + 'collapsed': false, + 'collapsible': false, 'items': [ + 'doc-home-page', 'getting-started/platform-overview', 'getting-started/quickstart-guide', + { + 'type': 'category', + 'label': 'ToolJet Concepts', + 'items': [ + 'tooljet-concepts/what-are-components', + 'tooljet-concepts/what-are-datasources', + 'tooljet-concepts/what-are-queries', + 'tooljet-concepts/inspector', + 'tooljet-concepts/what-are-events', + 'tooljet-concepts/actions', + 'tooljet-concepts/variables', + 'tooljet-concepts/how-to-access-values', + 'tooljet-concepts/component-specific-actions', + 'tooljet-concepts/exposed-variables', + 'tooljet-concepts/pages', + 'tooljet-concepts/run-js', + 'tooljet-concepts/styling-components', + 'tooljet-concepts/workspace-constants', + 'tooljet-concepts/permissions', + 'tooljet-concepts/super-admin', + ], + }, + { + 'type': 'category', + 'label': 'How To', + 'items': [ + 'how-to/use-url-params-on-load', + 'how-to/pass-query-params-in-custom-components', + 'how-to/use-custom-parameters', + 'how-to/pass-values-in-rest-api', + 'how-to/build-dynamic-forms', + 'how-to/setup-rsyslog', + 'how-to/conditionally-display-components', + 'how-to/use-inspector', + 'how-to/use-form-component', + 'how-to/access-cellvalue-rowdata', + 'how-to/conditionally-format-table', + 'how-to/bulk-update-multiple-rows', + 'how-to/delete-multiple-rows', + 'how-to/use-server-side-pagination', + 'how-to/access-currentuser', + 'how-to/use-axios-in-runjs', + 'how-to/import-external-libraries-using-runpy', + 'how-to/import-external-libraries-using-runjs', + 'how-to/run-actions-from-runjs', + 'how-to/intentionally-fail-js-query', + 'how-to/run-query-at-specified-intervals', + 'how-to/use-to-py-function-in-runpy', + 'how-to/access-users-location', + 'how-to/use-s3-signed-url-to-upload-docs', + 'how-to/s3-custom-endpoints', + 'how-to/upload-files-aws', + 'how-to/upload-files-gcs', + 'how-to/loading-image-pdf-from-db', + 'how-to/use-events-on-chart', + 'how-to/print-multi-tabs-report', + 'how-to/display-listview-record-on-new-page' + ], + }, + { + 'type': 'category', + 'label': 'Deployment', + 'link': { + 'type': 'doc', + 'id': 'setup/index', + }, + 'items': [ + 'setup/try-tooljet', + 'setup/choose-your-tooljet', + 'setup/system-requirements', + 'setup/digitalocean', + 'setup/docker', + 'setup/ec2', + 'setup/ecs', + 'setup/openshift', + 'setup/helm', + 'setup/kubernetes', + 'setup/kubernetes-gke', + 'setup/kubernetes-aks', + 'setup/kubernetes-eks', + 'setup/azure-container', + 'setup/google-cloud-run', + 'setup/env-vars', + 'setup/http-proxy', + 'setup/tooljet-subpath', + 'setup/v2-migration-guide', + 'setup/upgrade-to-lts', + 'setup/upgrade-to-v3', + 'setup/cloud-v3-migration', + ] + } ], }, { - 'type': 'category', - 'label': 'ToolJet Concepts', - 'items': [ - 'tooljet-concepts/what-are-components', - 'tooljet-concepts/what-are-datasources', - 'tooljet-concepts/what-are-queries', - 'tooljet-concepts/inspector', - 'tooljet-concepts/what-are-events', - 'tooljet-concepts/actions', - 'tooljet-concepts/variables', - 'tooljet-concepts/how-to-access-values', - 'tooljet-concepts/component-specific-actions', - 'tooljet-concepts/exposed-variables', - 'tooljet-concepts/pages', - 'tooljet-concepts/run-js', - 'tooljet-concepts/styling-components', - 'tooljet-concepts/workspace-constants', - 'tooljet-concepts/permissions', - 'tooljet-concepts/super-admin', - ], - }, - { - 'type': 'category', - 'label': 'Setup', - 'link': { - 'type': 'doc', - 'id': 'setup/index', - }, - 'items': [ - 'setup/try-tooljet', - 'setup/choose-your-tooljet', - 'setup/system-requirements', - 'setup/digitalocean', - 'setup/docker', - 'setup/ec2', - 'setup/ecs', - 'setup/openshift', - 'setup/helm', - 'setup/kubernetes', - 'setup/kubernetes-gke', - 'setup/kubernetes-aks', - 'setup/kubernetes-eks', - 'setup/azure-container', - 'setup/google-cloud-run', - 'setup/client', - 'setup/env-vars', - 'setup/http-proxy', - 'setup/tooljet-subpath', - 'setup/v2-migration-guide', - 'setup/upgrade-to-lts', - 'setup/upgrade-to-v3', - 'setup/cloud-v3-migration', + "type": "category", + "label": "Build with AI", + 'className': 'category-as-header build-with-ai-header', + 'collapsed': false, + 'collapsible': false, + "items": [ + "build-with-ai/overview", + "build-with-ai/generate-applications", + "build-with-ai/ai-docs-assistant" ] }, { 'type': 'category', 'label': 'App Builder', + 'collapsed': false, + 'collapsible': false, + 'className': 'category-as-header app-builder-header', 'items': [ 'app-builder/overview', { @@ -89,7 +144,7 @@ const sidebars = { 'app-builder/walkthrough/variables', 'app-builder/importing-exporting-applications', ], - }, + }, { 'type': 'category', 'label': 'References', @@ -127,7 +182,18 @@ const sidebars = { 'label': 'Chart', 'items': [ 'widgets/chart/chart-properties', - 'widgets/chart/chart-examples' + 'widgets/chart/chart-examples', + 'widgets/chart/transforming-data-for-charts' + ] + }, + { + 'type': 'category', + 'label': 'Chat', + 'items': [ + 'widgets/chat/overview', + 'widgets/chat/properties', + 'widgets/chat/csa', + 'widgets/chat/markdown' ] }, 'widgets/checkbox', @@ -171,6 +237,18 @@ const sidebars = { 'widgets/table/table-properties', 'widgets/table/table-columns', 'widgets/table/table-csa-and-variables', + { + 'type': 'category', + 'label': 'Serverside Operations', + 'items': [ + 'widgets/table/serverside-operations/overview', + 'widgets/table/serverside-operations/search', + 'widgets/table/serverside-operations/sort', + 'widgets/table/serverside-operations/filter', + 'widgets/table/serverside-operations/pagination' + ] + }, + 'widgets/table/dynamic-column' ] }, 'widgets/tabs', @@ -222,61 +300,29 @@ const sidebars = { }, ], }, + 'app-builder/anti-patterns', 'tutorial/keyboard-shortcuts', ], }, - { - 'type': 'category', - 'label': 'How To', - 'items': [ - 'how-to/use-url-params-on-load', - 'how-to/pass-query-params-in-custom-components', - 'how-to/use-custom-parameters', - 'how-to/pass-values-in-rest-api', - 'how-to/build-dynamic-forms', - 'how-to/setup-rsyslog', - 'how-to/conditionally-display-components', - 'how-to/use-inspector', - 'how-to/use-form-component', - 'how-to/access-cellvalue-rowdata', - 'how-to/conditionally-format-table', - 'how-to/bulk-update-multiple-rows', - 'how-to/delete-multiple-rows', - 'how-to/use-server-side-pagination', - 'how-to/access-currentuser', - 'how-to/use-axios-in-runjs', - 'how-to/import-external-libraries-using-runpy', - 'how-to/import-external-libraries-using-runjs', - 'how-to/run-actions-from-runjs', - 'how-to/intentionally-fail-js-query', - 'how-to/run-query-at-specified-intervals', - 'how-to/use-to-py-function-in-runpy', - 'how-to/access-users-location', - 'how-to/use-s3-signed-url-to-upload-docs', - 'how-to/s3-custom-endpoints', - 'how-to/upload-files-aws', - 'how-to/upload-files-gcs', - 'how-to/loading-image-pdf-from-db', - 'how-to/use-events-on-chart', - 'how-to/print-multi-tabs-report' - ], - }, { 'type': 'category', 'label': 'Data Sources', + 'className': 'category-as-header data-sources-header', + 'collapsed': false, + 'collapsible': false, 'items': [ 'data-sources/overview', 'data-sources/sample-data-sources', { 'type': 'category', - 'label': 'Datasources library', + 'label': 'Data Sources library', 'items': [ 'data-sources/airtable', 'data-sources/s3', 'data-sources/amazonses', 'data-sources/appwrite', 'data-sources/athena', - 'data-sources/azureblob', + 'data-sources/azureblobstorage', 'data-sources/baserow', 'data-sources/bigquery', 'data-sources/firestore', @@ -287,7 +333,7 @@ const sidebars = { 'data-sources/dynamodb', 'data-sources/elasticsearch', 'data-sources/gcs', - 'data-sources/google.sheets', + 'data-sources/googlesheets', 'data-sources/graphql', 'data-sources/grpc', 'data-sources/influxdb', @@ -306,7 +352,7 @@ const sidebars = { { 'type': 'category', 'label': 'REST API', - 'collapsed': false, + 'collapsed': true, 'items': [ 'data-sources/restapi/configuration', 'data-sources/restapi/authentication', @@ -315,6 +361,7 @@ const sidebars = { ], }, + 'data-sources/soap-api', 'data-sources/rethinkdb', 'data-sources/run-js', 'data-sources/run-py', @@ -331,206 +378,406 @@ const sidebars = { ], }, 'tutorial/transformations', + 'data-sources/local-data-sources-migration', + { + 'type': 'category', + 'label': 'Marketplace', + 'collapsed': true, + 'items': [ + 'marketplace/marketplace-overview', + { + 'type': 'category', + 'label': 'Marketplace Plugins', + 'items': [ + 'marketplace/plugins/marketplace-plugin-awsredshift', + 'marketplace/plugins/marketplace-plugin-textract', + 'marketplace/plugins/marketplace-plugin-aws-lambda', + 'marketplace/plugins/marketplace-plugin-engagespot', + 'marketplace/plugins/marketplace-plugin-github', + 'marketplace/plugins/marketplace-plugin-harperdb', + 'marketplace/plugins/marketplace-plugin-openai', + 'marketplace/plugins/marketplace-plugin-plivo', + 'marketplace/plugins/marketplace-plugin-salesforce', + 'marketplace/plugins/marketplace-plugin-supabase', + 'marketplace/plugins/marketplace-plugin-pocketbase', + 'marketplace/plugins/marketplace-plugin-portkey', + 'marketplace/plugins/marketplace-plugin-Presto', + 'marketplace/plugins/marketplace-plugin-jira', + 'marketplace/plugins/marketplace-plugin-sharepoint', + 'marketplace/plugins/marketplace-plugin-pinecone', + 'marketplace/plugins/marketplace-plugin-gemini', + 'marketplace/plugins/marketplace-plugin-anthropic', + 'marketplace/plugins/marketplace-plugin-mistral_ai', + 'marketplace/plugins/marketplace-plugin-hugging_face', + 'marketplace/plugins/marketplace-plugin-cohere', + 'marketplace/plugins/marketplace-plugin-weaviate', + 'marketplace/plugins/marketplace-plugin-qdrant' + ], + }, + ], + }, ], }, { 'type': 'category', 'label': 'ToolJet Database', + 'className': 'category-as-header tjdb-header', + 'collapsed': false, + 'collapsible': false, 'items': [ 'tooljet-db/tooljet-database', 'tooljet-db/database-editor', + { + 'type': 'category', + 'label': 'Column Constraints', + 'items': [ + 'tooljet-db/constraints/primary-key', + 'tooljet-db/constraints/foreign-key' + ] + }, 'tooljet-db/data-types', + 'tooljet-db/table-operations', 'tooljet-db/querying-tooljet-db', ] }, - { - 'type': 'category', - 'label': 'Org Management', - 'items': [ - 'dashboard', - { - "type": "category", - "label": "Workspaces", - "items": [ - "org-management/workspaces/workspace_overview", - "org-management/workspaces/workspace-variables", - "org-management/workspaces/workspace-variables-migration", - "org-management/workspaces/workspace_constants" - ] - }, - { - 'type': 'category', - 'label': 'User Authentication', - 'items': [ - 'user-authentication/user-lifecycle', - 'user-authentication/workspace-login', - { - 'type': 'category', - 'label': 'SSO', - 'items': [ - 'user-authentication/sso/github', - 'user-authentication/sso/google', - { - 'type': 'category', - 'label': 'OpenId Connect', - 'link': { - 'type': 'generated-index', - 'title': 'OpenId Connect', - 'description': ' ', - 'keywords': [ - 'okta', - 'openid', - 'azureAD', - ], - }, - 'collapsed': true, - 'items': [ - 'user-authentication/sso/openid/setup', - 'user-authentication/sso/openid/azuread', - 'user-authentication/sso/openid/okta', - 'user-authentication/sso/openid/google-openid', - ], - }, - 'user-authentication/sso/oidc', - 'user-authentication/sso/ldap', - 'user-authentication/sso/saml', - 'user-authentication/sso/auto-sso-login', - ], - }, - ], - }, - 'org-management/permissions', - 'tutorial/manage-users-groups', - 'tutorial/tooljet-api', - 'Enterprise/audit_logs', - 'Enterprise/white-label', - 'Enterprise/superadmin', - { - "type": "category", - "label": "Licensing", - "items": [ - "org-management/licensing/tooljet-cloud", - "org-management/licensing/self-hosted" - ] - }, - "org-management/smtp-configuration" - ], - }, - { - 'type': 'category', - 'label': 'Release Management', - 'items': [ - 'gitsync', - 'release-management/multi-environment', - 'tutorial/versioning-and-release', - ], - }, { 'type': 'category', 'label': 'Workflows', + 'className': 'category-as-header workflows-header', + 'collapsed': false, + 'collapsible': false, 'items': [ 'workflows/overview', 'workflows/nodes', 'workflows/workflow-triggers', 'workflows/results', 'workflows/permissions', - ], - }, - { - 'type': 'category', - 'label': 'Marketplace', - 'collapsed': true, - 'items': [ - 'marketplace/marketplace-overview', { 'type': 'category', - 'label': 'Marketplace Plugins', + 'label': 'How-to', 'items': [ - 'marketplace/plugins/marketplace-plugin-redshift', - 'marketplace/plugins/marketplace-plugin-textract', - 'marketplace/plugins/marketplace-plugin-aws-lambda', - 'marketplace/plugins/marketplace-plugin-engagespot', - 'marketplace/plugins/marketplace-plugin-github', - 'marketplace/plugins/marketplace-plugin-harperdb', - 'marketplace/plugins/marketplace-plugin-openai', - 'marketplace/plugins/marketplace-plugin-plivo', - 'marketplace/plugins/marketplace-plugin-salesforce', - 'marketplace/plugins/marketplace-plugin-supabase', - 'marketplace/plugins/marketplace-plugin-pocketbase', - 'marketplace/plugins/marketplace-plugin-portkey', - 'marketplace/plugins/marketplace-plugin-prestodb', - 'marketplace/plugins/marketplace-plugin-jira', - ], - }, + 'workflows/how-to/trigger-using-webhook', + 'workflows/how-to/trigger-workflow-from-app', + 'workflows/how-to/trigger-workflow-using-scheduler' + ] + } ], }, - 'tooljet-copilot', - 'security', - 'tracking', { 'type': 'category', - 'label': 'Project Overview', - 'collapsed': true, + 'label': 'Setup ToolJet', + 'className': 'category-as-header setup-tj-header', + 'collapsible': false, + 'collapsed': false, 'items': [ - 'project-overview/release-notes', + 'tj-setup/overview', + 'tj-setup/tj-deployment', + { + 'type': 'category', + 'label': 'Licensing', + 'items': [ + 'tj-setup/licensing/self-hosted', + 'tj-setup/licensing/cloud' + ] + }, + 'tj-setup/instances', + 'tj-setup/workspaces', + { + 'type': 'category', + 'label': 'Branding', + 'items': [ + 'tj-setup/org-branding/white-labeling', + 'tj-setup/org-branding/custom-domain' + ] + }, + { + 'type': 'category', + 'label': 'Setup SMTP Server', + 'link': { + 'type': 'doc', + 'id': 'tj-setup/smtp-setup/configuration', + }, + 'items': [ + 'tj-setup/smtp-setup/configuration', + 'tj-setup/smtp-setup/email-providers' + ] + } + ] + }, + { + 'type': 'category', + 'collapsed': false, + 'collapsible': false, + 'className': 'category-as-header user-management-header', + 'label': 'User Management and Access Control', + 'items': [ + 'user-management/overview', + { + 'type': 'category', + 'label': 'Onboard and Offboard Users', + 'items': [ + 'user-management/onboard-users/overview', + 'user-management/onboard-users/invite-user', + 'user-management/onboard-users/bulk-invite-users', + 'user-management/onboard-users/self-signup-user', + 'user-management/onboard-users/user-metadata', + 'user-management/onboard-users/archive-user', + ] + }, + { + 'type': 'category', + 'label': 'Authentication', + 'items': [ + { + 'type': 'category', + 'label': 'Self-hosted', + 'items': [ + 'user-management/authentication/self-hosted/overview', + 'user-management/authentication/self-hosted/instance-login', + 'user-management/authentication/self-hosted/workspace-login' + ] + }, + 'user-management/authentication/cloud-login', + ] + }, + { + 'type': 'category', + 'label': 'Role Based Access Control', + 'items': [ + 'user-management/role-based-access/super-admin', + 'user-management/role-based-access/user-roles', + 'user-management/role-based-access/custom-groups', + 'user-management/role-based-access/access-control', + ] + }, + { + 'type': 'category', + 'label': 'Single Sign-On (SSO)', + 'link': { + 'type': 'doc', + 'id': 'user-management/sso/overview', + }, + 'items': [ + 'user-management/sso/overview', + 'user-management/sso/github', + 'user-management/sso/google', + { + 'type': 'category', + 'label': 'OpenID Connect', + 'link': { + 'type': 'doc', + 'id': 'user-management/sso/oidc/setup', + }, + 'items': [ + 'user-management/sso/oidc/setup', + 'user-management/sso/oidc/azuread', + 'user-management/sso/oidc/okta', + 'user-management/sso/oidc/google' + ] + }, + 'user-management/sso/ldap', + { + 'type': 'category', + 'label': 'SAML', + 'link': { + 'type': 'doc', + 'id': 'user-management/sso/saml/setup', + }, + 'items': [ + 'user-management/sso/saml/setup', + 'user-management/sso/saml/okta' + ] + }, + ] + }, + { + 'type': 'category', + 'label': 'Group Sync', + 'items': [ + 'user-management/group-sync/oidc' + ] + }, + { + 'type': 'category', + 'label': 'Profile Management', + 'items': [ + 'user-management/profile-management/user-details', + 'user-management/profile-management/reset-password', + 'user-management/profile-management/user-profile' + ] + } + ] + }, + { + 'type': 'category', + 'collapsed': false, + 'collapsible': false, + 'className': 'category-as-header dev-cycle-header', + 'label': 'Development Lifecycle', + 'items': [ + 'development-lifecycle/overview', + { + 'type': 'category', + 'label': 'Release Management', + 'items': [ + 'development-lifecycle/release/version-control', + 'development-lifecycle/release/release-rollback', + 'development-lifecycle/release/share-app', + ] + }, + { + 'type': 'category', + 'label': 'GitSync', + 'items': [ + 'development-lifecycle/gitsync/overview', + 'development-lifecycle/gitsync/gitsync-config', + 'development-lifecycle/gitsync/ssh-config', + 'development-lifecycle/gitsync/delete-gitsync', + 'development-lifecycle/gitsync/push', + 'development-lifecycle/gitsync/pull' + ] + }, + { + 'type': 'category', + 'label': 'Environment', + 'items': [ + { + 'type': 'category', + 'label': 'Self-Hosted', + 'items': [ + 'development-lifecycle/environment/self-hosted/multi-environment', + 'development-lifecycle/environment/self-hosted/example-configuration', + { + 'type': 'category', + 'label': 'Multi-Instance', + 'items': [ + 'development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment', + 'development-lifecycle/environment/self-hosted/multi-instance/example-configuration' + ] + }, + ] + }, + { + 'type': 'category', + 'label': 'Cloud', + 'items': [ + 'development-lifecycle/environment/cloud/multi-environment', + 'development-lifecycle/environment/cloud/example-configuration' + ] + } + ] + }, + { + 'type': 'category', + 'label': 'Backup', + 'items': [ + 'development-lifecycle/backup/gitsync-backup' + ] + }, + ] + }, + { + 'type': 'category', + 'label': 'Security and Monitoring', + 'collapsed': false, + 'collapsible': false, + 'className': 'category-as-header security-header', + 'items': [ + { + 'type': 'category', + 'label': 'Constants', + 'items': [ + 'security/constants/constants', + 'security/constants/variables' + ] + }, + 'security/audit-logs', + 'security/compliance' + + ] + }, + { + 'type': 'category', + 'label': 'ToolJet API', + 'className': 'category-as-header tj-api-header', + 'collapsible': false, + 'collapsed': true, + 'items': ['tooljet-api'] + } + , + { + 'type': 'category', + 'label': 'Resources', + 'className': 'category-as-header resources-header', + 'collapsed': true, + 'collapsible': false, + 'items': [ + { + 'type': 'link', + 'label': 'Release Notes', + 'href': 'https://app.tooljet.ai/applications/release-notes', + }, { 'type': 'link', 'label': 'Roadmap', 'href': 'https://github.com/orgs/ToolJet/projects/15', }, - ], - }, - { - 'type': 'category', - 'label': 'Contributing Guide', - 'collapsed': true, - 'items': [ - 'contributing-guide/setup/architecture', + 'versions', + 'tracking', { 'type': 'category', - 'label': 'Setup', + 'label': 'Contributing Guide', + 'collapsed': true, 'items': [ - 'contributing-guide/setup/codespaces', - 'contributing-guide/setup/macos', - 'contributing-guide/setup/docker', - 'contributing-guide/setup/ubuntu', - 'contributing-guide/setup/windows', - 'contributing-guide/setup/system-requirements-for-contributing', - ], - }, - { - 'type': 'category', - 'label': 'Marketplace', - 'items': [ - 'contributing-guide/marketplace/marketplace-setup', - 'contributing-guide/marketplace/creating-a-plugin', - ], - }, - { - 'type': 'category', - 'label': 'Documentation', - 'items': [ - 'contributing-guide/documentation-guidelines/introduction', - 'contributing-guide/documentation-guidelines/pr-checklist', - 'contributing-guide/documentation-guidelines/style-guide', + 'contributing-guide/setup/architecture', + { + 'type': 'category', + 'label': 'Setup', + 'items': [ + 'contributing-guide/setup/codespaces', + 'contributing-guide/setup/macos', + 'contributing-guide/setup/docker', + 'contributing-guide/setup/ubuntu', + 'contributing-guide/setup/windows', + 'contributing-guide/setup/system-requirements-for-contributing', + ], + }, + { + 'type': 'category', + 'label': 'Marketplace', + 'items': [ + 'contributing-guide/marketplace/marketplace-setup', + 'contributing-guide/marketplace/creating-a-plugin', + ], + }, + { + 'type': 'category', + 'label': 'Documentation', + 'items': [ + 'contributing-guide/documentation-guidelines/introduction', + 'contributing-guide/documentation-guidelines/pr-checklist', + 'contributing-guide/documentation-guidelines/style-guide', + ], + }, + 'tooljet-cli', + 'contributing-guide/testing', + 'contributing-guide/l10n', + { + 'type': 'category', + 'label': 'Troubleshooting', + 'items': [ + 'contributing-guide/troubleshooting/eslint', + 'contributing-guide/troubleshooting/runpy-limitations', + ], + }, + 'contributing-guide/code-of-conduct', + 'contributing-guide/slackcoc', ], }, - 'tooljet-cli', - 'contributing-guide/testing', - 'contributing-guide/l10n', - { - 'type': 'category', - 'label': 'Troubleshooting', - 'items': [ - 'contributing-guide/troubleshooting/eslint', - 'contributing-guide/troubleshooting/runpy-limitations', - ], - }, - 'contributing-guide/code-of-conduct', - 'contributing-guide/slackcoc', ], }, + ], }; diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css index 4b257f4fe3..f155533140 100644 --- a/docs/src/css/custom.css +++ b/docs/src/css/custom.css @@ -17,8 +17,9 @@ --ifm-color-primary-light: rgb(70, 203, 174); --ifm-color-primary-lighter: rgb(102, 212, 189); --ifm-color-primary-lightest: rgb(146, 224, 208); - --ifm-code-font-size: 95%; - --ifm-menu-color-active: #3E63DD; + --ifm-code-font-size: 90%; + --ifm-menu-color: #1B1F24; + --ifm-menu-font-size: 15px; --ifm-font-family-base: 'IBM Plex Sans'; --tblr-blue: #206bc4; --tblr-azure: #4299e1; @@ -43,13 +44,86 @@ --tblr-font-sans-serif: "Inter", -apple-system, BlinkMacSystemFont, San Francisco, Segoe UI, Roboto, Helvetica Neue, sans-serif; --tblr-font-monospace: null, Menlo, Monaco, Consolas, Liberation Mono, Courier New, monospace; --tblr-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); - --doc-sidebar-width: 250px !important; + --doc-sidebar-width: 300px !important; --ifm-link-color: #3e63dd; - --ifm-menu-color-background-active: #f0f4ff; - --ifm-link-menu-color-background-hover: #f0f4ff; + --ifm-menu-color-background-active: #8890992E; + --ifm-link-menu-color-background-hover: #8890992E; + --ifm-breadcrumb-item-background-active: transparent; } + +.table-of-contents { + max-width: 280px !important; +} + +.theme-doc-markdown a:not(.home-page a) { + color: #1B1F24; + text-decoration: underline; + font-weight: 400; +} + + +[data-theme='dark'] .theme-doc-markdown a:not(.home-page a) { + color: white; + +} + + +.table-of-contents__link:hover, +.table-of-contents__link:hover code, +.table-of-contents__link--active, +.table-of-contents__link--active code { + color: #1B1F24; + font-weight: 600; + --ifm-breadcrumb-item-background-active: transparent; +} + +[data-theme='dark'] .table-of-contents__link:hover, +[data-theme='dark'] .table-of-contents__link:hover code, +[data-theme='dark'] .table-of-contents__link--active, +[data-theme='dark'] .table-of-contents__link--active code { + color: white; + font-weight: 600; + --ifm-breadcrumb-item-background-active: transparent; +} + + +.pagination-nav { + border-top: 1px solid #E4E7EB; + margin: 0 67px; + margin-top: 36px !important; +} + +.pagination-nav__link { + border: none; + padding: 20px 0 0; +} + +.pagination-nav__link--prev .pagination-nav__label::before { + content: ''; +} + +.pagination-nav__link--next .pagination-nav__label::after { + content: ''; +} + +.pagination-nav__sublabel { + color: #6A727C; +} + +.pagination-nav__label { + color: #1B1F24; +} + +.pagination-nav__link--prev .pagination-nav__sublabel::before { + content: '« '; +} + +.pagination-nav__link--next .pagination-nav__sublabel::after { + content: ' »'; +} + h3 { font-size: 1.2rem; } @@ -62,10 +136,37 @@ h3 { background: var(--ifm-menu-link-sublist-icon) 50% / 1rem 1rem !important; } +.badge { + display: flex; + align-items: center; + justify-content: center; + gap: 5px; + border: none; + width: max-content; +} + .badge--primary { margin-bottom: 1rem; + background-color: #FAEFE7; + color: #BF4F03; } +.badge img { + box-shadow: none; +} + + +.badge--warning { + background-color: #FCEEEF; + color: #D72D39; +} + +/* .badge--secondary { + background-color: #dfdfdf; +} */ + + + article { padding-left: 7%; padding-right: 7%; @@ -185,7 +286,8 @@ body { .video-container { position: relative; - padding-bottom: 56.25%; /* 16:9 */ + padding-bottom: 56.25%; + /* 16:9 */ height: 0; clip-path: inset(1px 1px); } @@ -201,9 +303,40 @@ body { img { max-width: 100%; max-height: 100%; - border: 0 ; + border: 0; border-radius: 10px; - box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2) + box-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2) +} + +.img-s { + max-width: 360px !important; + box-shadow: none !important; + border-radius: 6px !important; + border: 1px solid #E4E7EB !important; + background-color: #ffffff +} + +.img-m { + max-width: 480px !important; + box-shadow: none !important; + border-radius: 6px !important; + border: 1px solid #E4E7EB !important; + background-color: #ffffff +} + +.img-l { + max-width: 640px !important; + box-shadow: none !important; + border-radius: 6px !important; + border: 1px solid #E4E7EB !important; + background-color: #ffffff +} + +.img-full { + box-shadow: none !important; + border-radius: 6px !important; + border: 1px solid #E4E7EB !important; + background-color: #ffffff } .card-icon img { @@ -234,7 +367,103 @@ img { color: inherit; } -.menu { +.alert { + border-left: none; + color: #1B1F24; +} + +/* Note Alert box*/ + +.alert.alert--secondary { + background-color: #F6F8FA !important; +} + +.alert.alert--secondary svg { + fill: #4368E3 +} + +.alert.alert--secondary code { + border-radius: 4px; + background: #F6F8FA; + mix-blend-mode: multiply; + padding: 2px 4px; +} + +/* Info Alert box*/ + +.alert.alert--info { + background-color: #F6F8FA !important; +} + +.alert.alert--info svg { + fill: #4368E3 +} + +.alert.alert--info code { + border-radius: 4px; + background: #F6F8FA; + mix-blend-mode: multiply; + padding: 2px 4px; +} + + + +/* Warning Alert box */ + +.alert.alert--warning { + background-color: #FAEFE7 !important; +} + +.alert.alert--warning svg { + fill: #BF4F03 +} + +.alert.alert--warning code { + border-radius: 4px; + background: #FAEFE7; + mix-blend-mode: multiply; + padding: 2px 4px; +} + + +/* Tip Alert box */ + +.alert.alert--success { + background-color: #E8F3EB; +} + +.alert.alert--success svg { + fill: #1E823B +} + +.alert.alert--success code { + border-radius: 4px; + background: #E8F3EB; + mix-blend-mode: multiply; + padding: 2px 4px; +} + + +/* Danger Alert box */ + +.alert.alert--danger { + background-color: #FCEEEF; +} + +.alert.alert--danger svg { + fill: #D72D39 +} + +.alert.alert--danger code { + border-radius: 4px; + background: #FCEEEF; + mix-blend-mode: multiply; + padding: 2px 4px; +} + + + +.admonition-heading .menu { overflow: hidden; } @@ -242,6 +471,10 @@ img { overflow-y: auto; } +.navbar { + padding: 0px 24px; +} + .navbar-social-link:hover { opacity: 0.6; } @@ -254,6 +487,69 @@ img { background-repeat: no-repeat; } +.navbar-signin, +.navbar-signin:hover, +.navbar-website, +.navbar-website:hover { + color: #1B1F24; + text-decoration: none; + font-size: 12px; + font-weight: 600; +} + +@media screen and (max-width: 996px) { + + .navbar-signin, + .navbar-website, + .dropdown { + display: none !important; + } +} + +[data-theme='dark'] .navbar-signin, +[data-theme='dark'] .navbar-signin:hover, +[data-theme='dark'] .navbar-website, +[data-theme='dark'] .navbar-website:hover { + color: white; +} + +.navbar-website { + box-shadow: 0px 0px 1px 0px rgba(48, 50, 51, 0.05), + 0px 1px 1px 0px rgba(48, 50, 51, 0.10); + border: 1px solid #E4E7EB; + border-radius: 6px; + margin-right: 6px; + display: flex; + justify-content: center; + align-items: center; +} + + + +button[title="Switch between dark and light mode (currently light mode)"], +[data-theme='dark'] button[title="Switch between dark and light mode (currently dark mode)"] { + box-shadow: 0px 0px 1px 0px rgba(48, 50, 51, 0.05), + 0px 1px 1px 0px rgba(48, 50, 51, 0.10); + border: 1px solid #E4E7EB; + border-radius: 6px !important; +} + +button[title="Switch between dark and light mode (currently light mode)"] svg, +[data-theme='dark'] button[title="Switch between dark and light mode (currently dark mode)"] svg { + width: 20px; +} + + +.navbar-website::before { + content: ''; + width: 24px; + height: 24px; + display: flex; + margin-right: 6px; + background-repeat: no-repeat; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 17' fill='none'%3E%3Cpath fill-rule='evenodd' clip-rule='evenodd' d='M6.56025 3.87506C6.32064 4.47898 6.12561 5.21257 5.99383 6.03614C6.63143 5.97774 7.30507 5.94665 8.00018 5.94665C8.69528 5.94665 9.36893 5.97774 10.0065 6.03614C9.87474 5.21257 9.67972 4.47898 9.4401 3.87506C9.20979 3.29459 8.94823 2.85911 8.68369 2.5771C8.42016 2.29617 8.18902 2.20182 8.00018 2.20182C7.81134 2.20182 7.58019 2.29617 7.31666 2.5771C7.05213 2.85911 6.79056 3.29459 6.56025 3.87506ZM5.61966 3.49575C5.32068 4.2493 5.09127 5.15704 4.95067 6.16055C4.25853 6.26346 3.6269 6.40077 3.07908 6.56646C2.44165 6.75925 1.88891 6.99895 1.48422 7.28834C1.4331 7.3249 1.38263 7.36354 1.33353 7.40427C1.78022 4.62062 3.90092 2.40244 6.62076 1.83337C6.60727 1.84722 6.59389 1.86121 6.58063 1.87535C6.19877 2.28242 5.87822 2.84407 5.61966 3.49575ZM9.37959 1.83337C9.39308 1.84721 9.40646 1.86121 9.41973 1.87535C9.80158 2.28242 10.1221 2.84407 10.3807 3.49575C10.6797 4.2493 10.9091 5.15704 11.0497 6.16055C11.7418 6.26346 12.3735 6.40077 12.9213 6.56646C13.5587 6.75925 14.1114 6.99896 14.5161 7.28834C14.5673 7.3249 14.6177 7.36354 14.6668 7.40428C14.2201 4.62062 12.0994 2.40244 9.37959 1.83337ZM14.6669 9.5956C14.6177 9.63634 14.5673 9.67499 14.5161 9.71156C14.1114 10.0009 13.5587 10.2406 12.9213 10.4334C12.3735 10.5991 11.7418 10.7364 11.0497 10.8393C10.9091 11.8429 10.6797 12.7506 10.3807 13.5041C10.1221 14.1558 9.80158 14.7175 9.41973 15.1246C9.4064 15.1388 9.39295 15.1528 9.37939 15.1667C12.0994 14.5977 14.2202 12.3794 14.6669 9.5956ZM6.62097 15.1667C6.6074 15.1528 6.59396 15.1388 6.58063 15.1246C6.19877 14.7175 5.87822 14.1558 5.61966 13.5041C5.32068 12.7506 5.09127 11.8429 4.95067 10.8393C4.25853 10.7364 3.6269 10.5991 3.07908 10.4334C2.44165 10.2406 1.88891 10.0009 1.48422 9.71156C1.43308 9.67499 1.38261 9.63634 1.3335 9.5956C1.78014 12.3794 3.90097 14.5977 6.62097 15.1667ZM3.37017 9.45519C3.79983 9.58514 4.29418 9.69779 4.83905 9.78818C4.8082 9.36939 4.79219 8.93879 4.79219 8.49995C4.79219 8.06111 4.8082 7.6305 4.83905 7.21172C4.29418 7.30211 3.79983 7.41476 3.37017 7.54471C2.78543 7.72156 2.34912 7.92201 2.0703 8.12139C1.77833 8.33017 1.75305 8.46549 1.75305 8.49995C1.75305 8.5344 1.77833 8.66973 2.0703 8.87851C2.34912 9.07788 2.78543 9.27833 3.37017 9.45519ZM5.80524 8.49995C5.80524 8.99101 5.82648 9.46791 5.86641 9.92528C6.53236 9.99412 7.25007 10.0319 8.00018 10.0319C8.75029 10.0319 9.468 9.99412 10.1339 9.92528C10.1739 9.46791 10.1951 8.99101 10.1951 8.49995C10.1951 8.00889 10.1739 7.53198 10.1339 7.07462C9.468 7.00578 8.75029 6.96797 8.00018 6.96797C7.25007 6.96797 6.53236 7.00578 5.86641 7.07462C5.82648 7.53198 5.80524 8.00889 5.80524 8.49995ZM6.56025 13.1248C6.32064 12.5209 6.12561 11.7873 5.99383 10.9638C6.63143 11.0222 7.30507 11.0532 8.00018 11.0532C8.69528 11.0532 9.36893 11.0222 10.0065 10.9638C9.87474 11.7873 9.67972 12.5209 9.4401 13.1248C9.20979 13.7053 8.94823 14.1408 8.68369 14.4228C8.42016 14.7037 8.18902 14.7981 8.00018 14.7981C7.81134 14.7981 7.58019 14.7037 7.31666 14.4228C7.05213 14.1408 6.79056 13.7053 6.56025 13.1248ZM12.6302 9.45519C12.2005 9.58514 11.7062 9.69779 11.1613 9.78818C11.1922 9.36939 11.2082 8.93879 11.2082 8.49995C11.2082 8.06111 11.1922 7.63051 11.1613 7.21172C11.7062 7.30211 12.2005 7.41476 12.6302 7.54471C13.2149 7.72157 13.6512 7.92201 13.9301 8.12139C14.222 8.33017 14.2473 8.46549 14.2473 8.49995C14.2473 8.5344 14.222 8.66973 13.9301 8.87851C13.6512 9.07789 13.2149 9.27833 12.6302 9.45519Z' fill='%23ACB2B9'/%3E%3C/svg%3E"); +} + .navbar-github-logo::before { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23181717' aria-hidden='true' viewBox='0 -2 28 28' version='1.1' data-view-component='true' %3E%3Cpath fill-rule='evenodd' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12' %3E%3C/path%3E%3C/svg%3E"); } @@ -274,6 +570,10 @@ img { height: 20px; } +.navbar-twitter-logo { + border-right: 1px solid #E4E7EB !important; +} + .navbar-twitter-logo::before { background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='currentColor' viewBox='0 0 512 512' aria-hidden='true'%3E%3Cpath d='M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z' %3E%3C/path%3E%3C/svg%3E"); } @@ -321,18 +621,32 @@ img { } .DocSearch-Button { - border-radius: 5px !important; + border: 1px solid #CCD1D5 !important; + border-radius: 6px !important; + background: transparent !important; +} + +.DocSearch-Button-Key { + border: none !important; + box-shadow: none !important; + background: transparent !important; + color: #6A727C !important; + font: inherit !important; + padding: 0 !important; } .DocSearch-Search-Icon { - height: 13px; - width: 13px; + height: 16px; + width: 16px; + color: #6A727C !important } .DocSearch-Button-Placeholder { - font-size: 0.85rem + font-size: 12px; + color: #6A727C } + .dropdown-archived-versions { font-size: 0.875rem; padding: 0.2rem 0.5rem; @@ -342,6 +656,55 @@ img { margin: 0.3rem 0; } + +.dropdown { + min-width: 180px; + display: flex; + justify-content: center; + align-items: center; + border-right: 1px solid #E4E7EB !important; +} + +.dropdown>.navbar__link { + font-size: 14px; + color: black; + font-weight: 600; + text-decoration: none; +} + +[data-theme='dark'] .dropdown>.navbar__link { + color: white; +} + +.dropdown:hover { + border-radius: 10px; + background: rgba(136, 144, 153, 0.18) +} + +.dropdown>.navbar__link::before { + content: 'Version '; + font-weight: 400; +} + +.dropdown__menu { + min-width: 180px; +} + +.dropdown>.navbar__link:after { + color: #6A727C; + margin-left: 8px; +} + +.dropdown__link--active, +.dropdown__link--active:hover { + color: #6A727C; +} + +[data-theme='dark'] .dropdown__link--active, +.dropdown__link--active:hover { + color: #c5ccd4; +} + @media screen and (min-width: 768px) { .DocSearch-Button-Container { min-width: 200px; @@ -350,8 +713,9 @@ img { } @media (max-width: 1000px) { + /* Styles for screens smaller than 1000px */ - [data-theme='dark'] .clean-btn{ + [data-theme='dark'] .clean-btn { background-color: #272729; color: #fff; border-radius: 4px; @@ -365,3 +729,240 @@ img { border-bottom-right-radius: 5px; } } + + +/* HOMEPAGE STYLES */ + +.docs-doc-id-doc-home-page article { + padding-left: 0px; + padding-right: 0px; +} + +.docs-doc-id-doc-home-page .theme-doc-breadcrumbs { + display: none; +} + +.docs-doc-id-doc-home-page .theme-doc-version-badge { + display: none; +} + +.docs-doc-id-doc-home-page .padding-top--md { + padding: 0px !important; +} + +.docs-doc-id-doc-home-page .padding-bottom--lg { + padding: 0px; + margin: 0px; +} + +.docs-doc-id-doc-home-page .theme-doc-markdown header { + display: none; +} + +.docs-doc-id-doc-home-page .theme-doc-footer { + display: none; +} + +.docs-doc-id-doc-home-page .pagination-nav { + display: none; +} + +.docs-doc-id-doc-home-page .theme-doc-version-banner { + display: none; +} + +.menu__link--active { + max-width: 98%; +} + +.docs-doc-id-doc-home-page .col { + padding-right: 0px !important; + padding-left: 0px !important; +} + +.docs-doc-id-doc-home-page .row { + margin: 0px !important; +} + +.docs-doc-id-doc-home-page p { + margin-bottom: 0px !important; +} + +.docs-doc-id-doc-home-page .container { + min-width: 100%; +} + +/* HOMEPAGE STYLES END*/ + +.category-as-header .menu__link--active { + color: #1B1F24; + font-weight: 600; +} + + +[data-theme='dark'] .category-as-header .menu__link--active { + color: white; +} + +.category-as-header .menu__link { + font-size: 15px; +} + +[data-theme='dark'] .menu__link { + color: white; +} + +/* Side bar Styles */ +.category-as-header>.menu__list-item-collapsible:first-child a { + font-size: 15px; + font-style: normal; + font-weight: 600 !important; + line-height: 20px; + margin-top: 20px; + color: #1B1F24; +} + +[data-theme='dark'] .category-as-header>.menu__list-item-collapsible:first-child a { + color: white; +} + +.category-as-header .menu__link--active:not(.menu__link--sublist) { + background-color: var(--ifm-menu-color-background-active); +} + +.category-as-header .menu__link:not(.menu__link--sublist) { + max-width: 94%; +} + +.category-as-header>.menu__list-item-collapsible:first-child:hover { + background-color: transparent; +} + +.category-as-header>.menu__list-item-collapsible:first-child a:first-of-type::before { + content: ""; + display: inline-block; + width: 16px; + height: 16px; + background-size: contain; + background-repeat: no-repeat; + margin-right: 5px; + vertical-align: middle; +} + +.getting-started-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/getting-started.svg'); +} + +.build-with-ai-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/build-with-ai.svg'); +} + +.app-builder-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/app-builder.svg'); +} + +.data-sources-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/data-source.svg'); +} + +.tjdb-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/tjdb.svg'); +} + +.workflows-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/workflows.svg'); +} + +.setup-tj-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/setup-tj.svg'); +} + +.user-management-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/user-management.svg'); +} + +.dev-cycle-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/dev-cycle.svg'); +} + +.security-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/security.svg'); +} + +.tj-api-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/tj-api.svg'); +} + +.resources-header .menu__list-item-collapsible:first-child a:first-of-type::before { + background-image: url('../../static/img/sidebar-icons/resources.svg'); +} + + +/* Dropdownns */ + +#tj-dropdown { + border: none !important; + background-color: #F6F8FA; +} + +#tj-dropdown code { + border-radius: 4px; + background: inherit; + mix-blend-mode: normal; + padding: 5px 10px; +} + +#tj-dropdown[data-collapsed="false"] summary { + font-weight: bold; +} + +#tj-dropdown div div { + border: none; + padding-top: 0; + margin-top: 6px; +} + +#tj-dropdown div div a { + text-decoration-color: #6A727C !important; +} + +#tj-dropdown>summary::before { + border-color: transparent transparent transparent #6A727C !important; +} + +/* Bread crumbs */ + +.breadcrumbs__item .breadcrumbs__link { + padding-right: 4px; + padding-left: 4px; + color: #2D343B; +} + +.breadcrumbs__item:first-child .breadcrumbs__link { + padding-left: 0; +} + +.breadcrumbs__item:not(:last-child):after { + content: "/" !important; + background: none; + margin: 0; + color: #2D343B; + font-weight: bold; +} + +.breadcrumbs__item--active .breadcrumbs__link { + font-weight: 600; +} + +.container { + padding-top: 42px !important; + padding-bottom: 42px !important; +} + +.markdown h1:first-child { + margin-bottom: 8px; +} + +.clean-btn.close { + color: #4368E3; +} \ No newline at end of file diff --git a/docs/src/pages/getting-started.png b/docs/src/pages/getting-started.png new file mode 100644 index 0000000000..1624718ae8 Binary files /dev/null and b/docs/src/pages/getting-started.png differ diff --git a/docs/src/theme/Admonition.js b/docs/src/theme/Admonition.js new file mode 100644 index 0000000000..6f3e9cb268 --- /dev/null +++ b/docs/src/theme/Admonition.js @@ -0,0 +1,27 @@ +import React from "react"; +import OriginalAdmonition from "@theme-original/Admonition"; +import NoteIcon from "@site/static/img/alert-box/information.svg"; +import TipIcon from "@site/static/img/alert-box/idea.svg"; +import DangerIcon from "@site/static/img/alert-box/danger.svg"; +import CautionIcon from "@site/static/img/alert-box/warning.svg"; + +const iconMap = { + note: NoteIcon, + tip: TipIcon, + danger: DangerIcon, + info: NoteIcon, + caution: CautionIcon, + warning: CautionIcon +}; + +export default function Admonition(props) { + const { type = "info" } = props; // Default to "info" if type is not provided + const Icon = iconMap[type] || NoteIcon; // Fallback to NoteIcon if type is unrecognized + + return ( + } + /> + ); +} \ No newline at end of file diff --git a/docs/static/img/Logomark_white-v2.svg b/docs/static/img/Logomark_white-v2.svg new file mode 100644 index 0000000000..2478698bdb --- /dev/null +++ b/docs/static/img/Logomark_white-v2.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/alert-box/danger.svg b/docs/static/img/alert-box/danger.svg new file mode 100644 index 0000000000..99b854c6d1 --- /dev/null +++ b/docs/static/img/alert-box/danger.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/alert-box/idea.svg b/docs/static/img/alert-box/idea.svg new file mode 100644 index 0000000000..fb4b7cec5e --- /dev/null +++ b/docs/static/img/alert-box/idea.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/docs/static/img/alert-box/information.svg b/docs/static/img/alert-box/information.svg new file mode 100644 index 0000000000..94c8da5849 --- /dev/null +++ b/docs/static/img/alert-box/information.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/alert-box/warning.svg b/docs/static/img/alert-box/warning.svg new file mode 100644 index 0000000000..8d085fe8a9 --- /dev/null +++ b/docs/static/img/alert-box/warning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/badge-icons/premium.svg b/docs/static/img/badge-icons/premium.svg new file mode 100644 index 0000000000..f85efde615 --- /dev/null +++ b/docs/static/img/badge-icons/premium.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/badge-icons/warning.svg b/docs/static/img/badge-icons/warning.svg new file mode 100644 index 0000000000..78654b3dac --- /dev/null +++ b/docs/static/img/badge-icons/warning.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/cloud-run/add-chromadb.png b/docs/static/img/cloud-run/add-chromadb.png new file mode 100644 index 0000000000..be19a4c65b Binary files /dev/null and b/docs/static/img/cloud-run/add-chromadb.png differ diff --git a/docs/static/img/cloud-run/add-container.png b/docs/static/img/cloud-run/add-container.png new file mode 100644 index 0000000000..ad57cc819d Binary files /dev/null and b/docs/static/img/cloud-run/add-container.png differ diff --git a/docs/static/img/cloud-run/env-for-tooljet.png b/docs/static/img/cloud-run/env-for-tooljet.png index 2a0c05bf5d..cda4a789ba 100644 Binary files a/docs/static/img/cloud-run/env-for-tooljet.png and b/docs/static/img/cloud-run/env-for-tooljet.png differ diff --git a/docs/static/img/cloud-run/google-cloud-run-setup-V3.png b/docs/static/img/cloud-run/google-cloud-run-setup-V3.png new file mode 100644 index 0000000000..69fa1ee4dd Binary files /dev/null and b/docs/static/img/cloud-run/google-cloud-run-setup-V3.png differ diff --git a/docs/static/img/cloud-run/ingress-auth-V3.png b/docs/static/img/cloud-run/ingress-auth-V3.png new file mode 100644 index 0000000000..015ef8a1ce Binary files /dev/null and b/docs/static/img/cloud-run/ingress-auth-V3.png differ diff --git a/docs/static/img/cloud-run/postgrest-container.png b/docs/static/img/cloud-run/postgrest-container.png new file mode 100644 index 0000000000..713c59ccb3 Binary files /dev/null and b/docs/static/img/cloud-run/postgrest-container.png differ diff --git a/docs/static/img/cloud-run/postgrest-environment-variables.png b/docs/static/img/cloud-run/postgrest-environment-variables.png new file mode 100644 index 0000000000..f987b7cf82 Binary files /dev/null and b/docs/static/img/cloud-run/postgrest-environment-variables.png differ diff --git a/docs/static/img/cloud-run/redis-container.png b/docs/static/img/cloud-run/redis-container.png new file mode 100644 index 0000000000..00d664eb70 Binary files /dev/null and b/docs/static/img/cloud-run/redis-container.png differ diff --git a/docs/static/img/cloud-run/temporal-settings.png b/docs/static/img/cloud-run/temporal-settings.png new file mode 100644 index 0000000000..c6f0b363a9 Binary files /dev/null and b/docs/static/img/cloud-run/temporal-settings.png differ diff --git a/docs/static/img/cloud-run/temporal-variables-and-secrets.png b/docs/static/img/cloud-run/temporal-variables-and-secrets.png new file mode 100644 index 0000000000..cdd46701db Binary files /dev/null and b/docs/static/img/cloud-run/temporal-variables-and-secrets.png differ diff --git a/docs/static/img/cloud-run/tooljet-worker-settings.png b/docs/static/img/cloud-run/tooljet-worker-settings.png new file mode 100644 index 0000000000..effe889ded Binary files /dev/null and b/docs/static/img/cloud-run/tooljet-worker-settings.png differ diff --git a/docs/static/img/contributing-guide/create-plugin/mongodb-error.png b/docs/static/img/contributing-guide/create-plugin/mongodb-error.png new file mode 100644 index 0000000000..978f91f76e Binary files /dev/null and b/docs/static/img/contributing-guide/create-plugin/mongodb-error.png differ diff --git a/docs/static/img/contributing-guide/create-plugin/query-error.png b/docs/static/img/contributing-guide/create-plugin/query-error.png new file mode 100644 index 0000000000..5240dfd96c Binary files /dev/null and b/docs/static/img/contributing-guide/create-plugin/query-error.png differ diff --git a/docs/static/img/datasource-reference/google-sheets/create-sheet.png b/docs/static/img/datasource-reference/google-sheets/create-sheet.png new file mode 100644 index 0000000000..1825792758 Binary files /dev/null and b/docs/static/img/datasource-reference/google-sheets/create-sheet.png differ diff --git a/docs/static/img/datasource-reference/google-sheets/list-all-sheets.png b/docs/static/img/datasource-reference/google-sheets/list-all-sheets.png new file mode 100644 index 0000000000..4c90733a4e Binary files /dev/null and b/docs/static/img/datasource-reference/google-sheets/list-all-sheets.png differ diff --git a/docs/static/img/datasource-reference/google-sheets/operations-v3.png b/docs/static/img/datasource-reference/google-sheets/operations-v3.png new file mode 100644 index 0000000000..25fecd66f7 Binary files /dev/null and b/docs/static/img/datasource-reference/google-sheets/operations-v3.png differ diff --git a/docs/static/img/datasource-reference/mongo-db/ssl.png b/docs/static/img/datasource-reference/mongo-db/ssl.png new file mode 100644 index 0000000000..70a19d425f Binary files /dev/null and b/docs/static/img/datasource-reference/mongo-db/ssl.png differ diff --git a/docs/static/img/datasource-reference/mssql/connect-v2.png b/docs/static/img/datasource-reference/mssql/connect-v2.png new file mode 100644 index 0000000000..ff6b75065c Binary files /dev/null and b/docs/static/img/datasource-reference/mssql/connect-v2.png differ diff --git a/docs/static/img/datasource-reference/sample-data-sources/connect-via-canvas-v2.png b/docs/static/img/datasource-reference/sample-data-sources/connect-via-canvas-v2.png new file mode 100644 index 0000000000..ccb12f8320 Binary files /dev/null and b/docs/static/img/datasource-reference/sample-data-sources/connect-via-canvas-v2.png differ diff --git a/docs/static/img/datasource-reference/sample-data-sources/connect-via-query-manager-v2.png b/docs/static/img/datasource-reference/sample-data-sources/connect-via-query-manager-v2.png new file mode 100644 index 0000000000..91392f9fbf Binary files /dev/null and b/docs/static/img/datasource-reference/sample-data-sources/connect-via-query-manager-v2.png differ diff --git a/docs/static/img/datasource-reference/sample-data-sources/create-sample-app-v2.png b/docs/static/img/datasource-reference/sample-data-sources/create-sample-app-v2.png new file mode 100644 index 0000000000..46489f8cb5 Binary files /dev/null and b/docs/static/img/datasource-reference/sample-data-sources/create-sample-app-v2.png differ diff --git a/docs/static/img/datasource-reference/soap-api/api-body.png b/docs/static/img/datasource-reference/soap-api/api-body.png new file mode 100644 index 0000000000..2cf442711b Binary files /dev/null and b/docs/static/img/datasource-reference/soap-api/api-body.png differ diff --git a/docs/static/img/datasource-reference/soap-api/headers.png b/docs/static/img/datasource-reference/soap-api/headers.png new file mode 100644 index 0000000000..d33d4bcc82 Binary files /dev/null and b/docs/static/img/datasource-reference/soap-api/headers.png differ diff --git a/docs/static/img/datasource-reference/v3-migration/create-new-data-source.png b/docs/static/img/datasource-reference/v3-migration/create-new-data-source.png new file mode 100644 index 0000000000..ba91375223 Binary files /dev/null and b/docs/static/img/datasource-reference/v3-migration/create-new-data-source.png differ diff --git a/docs/static/img/datasource-reference/v3-migration/query-error.png b/docs/static/img/datasource-reference/v3-migration/query-error.png new file mode 100644 index 0000000000..512a5ea86f Binary files /dev/null and b/docs/static/img/datasource-reference/v3-migration/query-error.png differ diff --git a/docs/static/img/datasource-reference/v3-migration/query-reconnection.png b/docs/static/img/datasource-reference/v3-migration/query-reconnection.png new file mode 100644 index 0000000000..1eeb4e458c Binary files /dev/null and b/docs/static/img/datasource-reference/v3-migration/query-reconnection.png differ diff --git a/docs/static/img/datasource-reference/v3-migration/test-queries.png b/docs/static/img/datasource-reference/v3-migration/test-queries.png new file mode 100644 index 0000000000..2501c9e06e Binary files /dev/null and b/docs/static/img/datasource-reference/v3-migration/test-queries.png differ diff --git a/docs/static/img/development-lifecycle/backup/gitsync/commit-message.png b/docs/static/img/development-lifecycle/backup/gitsync/commit-message.png new file mode 100644 index 0000000000..498e80089a Binary files /dev/null and b/docs/static/img/development-lifecycle/backup/gitsync/commit-message.png differ diff --git a/docs/static/img/development-lifecycle/backup/gitsync/github-commit.png b/docs/static/img/development-lifecycle/backup/gitsync/github-commit.png new file mode 100644 index 0000000000..5493e31642 Binary files /dev/null and b/docs/static/img/development-lifecycle/backup/gitsync/github-commit.png differ diff --git a/docs/static/img/development-lifecycle/backup/gitsync/gitsync-button.png b/docs/static/img/development-lifecycle/backup/gitsync/gitsync-button.png new file mode 100644 index 0000000000..eb31259c10 Binary files /dev/null and b/docs/static/img/development-lifecycle/backup/gitsync/gitsync-button.png differ diff --git a/docs/static/img/development-lifecycle/environments/Built-in-env.png b/docs/static/img/development-lifecycle/environments/Built-in-env.png new file mode 100644 index 0000000000..fd81e22d7a Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/Built-in-env.png differ diff --git a/docs/static/img/development-lifecycle/environments/appbuilder-1.png b/docs/static/img/development-lifecycle/environments/appbuilder-1.png new file mode 100644 index 0000000000..e9d31d390a Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/appbuilder-1.png differ diff --git a/docs/static/img/development-lifecycle/environments/appbuilder.png b/docs/static/img/development-lifecycle/environments/appbuilder.png new file mode 100644 index 0000000000..218cc7c2dd Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/appbuilder.png differ diff --git a/docs/static/img/development-lifecycle/environments/check-updates.png b/docs/static/img/development-lifecycle/environments/check-updates.png new file mode 100644 index 0000000000..8cd43483ef Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/check-updates.png differ diff --git a/docs/static/img/development-lifecycle/environments/cloud-constants.png b/docs/static/img/development-lifecycle/environments/cloud-constants.png new file mode 100644 index 0000000000..f3ac66d449 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/cloud-constants.png differ diff --git a/docs/static/img/development-lifecycle/environments/cloud-env.png b/docs/static/img/development-lifecycle/environments/cloud-env.png new file mode 100644 index 0000000000..d76f23ec10 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/cloud-env.png differ diff --git a/docs/static/img/development-lifecycle/environments/create-app-github.png b/docs/static/img/development-lifecycle/environments/create-app-github.png new file mode 100644 index 0000000000..92a8cb9d74 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/create-app-github.png differ diff --git a/docs/static/img/development-lifecycle/environments/create-app.png b/docs/static/img/development-lifecycle/environments/create-app.png new file mode 100644 index 0000000000..d6cfe04978 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/create-app.png differ diff --git a/docs/static/img/development-lifecycle/environments/github-2.png b/docs/static/img/development-lifecycle/environments/github-2.png new file mode 100644 index 0000000000..37afd6ca0f Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/github-2.png differ diff --git a/docs/static/img/development-lifecycle/environments/import-1.png b/docs/static/img/development-lifecycle/environments/import-1.png new file mode 100644 index 0000000000..84fee796d2 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/import-1.png differ diff --git a/docs/static/img/development-lifecycle/environments/import-2.png b/docs/static/img/development-lifecycle/environments/import-2.png new file mode 100644 index 0000000000..e989aa5469 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/import-2.png differ diff --git a/docs/static/img/development-lifecycle/environments/iterate-1.png b/docs/static/img/development-lifecycle/environments/iterate-1.png new file mode 100644 index 0000000000..46f0358c72 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/iterate-1.png differ diff --git a/docs/static/img/development-lifecycle/environments/iterate-github.png b/docs/static/img/development-lifecycle/environments/iterate-github.png new file mode 100644 index 0000000000..1e6148a836 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/iterate-github.png differ diff --git a/docs/static/img/development-lifecycle/environments/multi-instance-concept.png b/docs/static/img/development-lifecycle/environments/multi-instance-concept.png new file mode 100644 index 0000000000..64412baa40 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/multi-instance-concept.png differ diff --git a/docs/static/img/development-lifecycle/environments/multi-instance.png b/docs/static/img/development-lifecycle/environments/multi-instance.png new file mode 100644 index 0000000000..6909f68d21 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/multi-instance.png differ diff --git a/docs/static/img/development-lifecycle/environments/self-hosted-concept.png b/docs/static/img/development-lifecycle/environments/self-hosted-concept.png new file mode 100644 index 0000000000..60b057e4ec Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/self-hosted-concept.png differ diff --git a/docs/static/img/development-lifecycle/environments/selfhosted-constants.png b/docs/static/img/development-lifecycle/environments/selfhosted-constants.png new file mode 100644 index 0000000000..5235d4e6fa Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/selfhosted-constants.png differ diff --git a/docs/static/img/development-lifecycle/environments/selfhosted-datasource.png b/docs/static/img/development-lifecycle/environments/selfhosted-datasource.png new file mode 100644 index 0000000000..18f0f56ba5 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/selfhosted-datasource.png differ diff --git a/docs/static/img/development-lifecycle/environments/update-app.png b/docs/static/img/development-lifecycle/environments/update-app.png new file mode 100644 index 0000000000..ba69e59e18 Binary files /dev/null and b/docs/static/img/development-lifecycle/environments/update-app.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/add-key.png b/docs/static/img/development-lifecycle/gitsync/config/add-key.png new file mode 100644 index 0000000000..1f141dab30 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/add-key.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/deploy-ssh.png b/docs/static/img/development-lifecycle/gitsync/config/deploy-ssh.png new file mode 100644 index 0000000000..bfdf3e4a9a Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/deploy-ssh.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/generate-ssh.png b/docs/static/img/development-lifecycle/gitsync/config/generate-ssh.png new file mode 100644 index 0000000000..b42ed7ba63 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/generate-ssh.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/new-repo.png b/docs/static/img/development-lifecycle/gitsync/config/new-repo.png new file mode 100644 index 0000000000..994bf0d6f5 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/new-repo.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/save-config.png b/docs/static/img/development-lifecycle/gitsync/config/save-config.png new file mode 100644 index 0000000000..a14e84548b Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/save-config.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/ssh-code.png b/docs/static/img/development-lifecycle/gitsync/config/ssh-code.png new file mode 100644 index 0000000000..20c260eb68 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/ssh-code.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/ssh-key.png b/docs/static/img/development-lifecycle/gitsync/config/ssh-key.png new file mode 100644 index 0000000000..9588bbeea8 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/ssh-key.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/config/ssh.png b/docs/static/img/development-lifecycle/gitsync/config/ssh.png new file mode 100644 index 0000000000..b714965772 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/config/ssh.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/delete/connection.png b/docs/static/img/development-lifecycle/gitsync/delete/connection.png new file mode 100644 index 0000000000..5db1f127b6 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/delete/connection.png differ diff --git a/docs/static/img/development-lifecycle/gitsync/delete/delete.png b/docs/static/img/development-lifecycle/gitsync/delete/delete.png new file mode 100644 index 0000000000..c40dbe4f33 Binary files /dev/null and b/docs/static/img/development-lifecycle/gitsync/delete/delete.png differ diff --git a/docs/static/img/development-lifecycle/release/release/confirm.png b/docs/static/img/development-lifecycle/release/release/confirm.png new file mode 100644 index 0000000000..2247cb7243 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/release/confirm.png differ diff --git a/docs/static/img/development-lifecycle/release/release/release.png b/docs/static/img/development-lifecycle/release/release/release.png new file mode 100644 index 0000000000..d03fb43982 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/release/release.png differ diff --git a/docs/static/img/development-lifecycle/release/share/dashboard.png b/docs/static/img/development-lifecycle/release/share/dashboard.png new file mode 100644 index 0000000000..1ce15e7bfe Binary files /dev/null and b/docs/static/img/development-lifecycle/release/share/dashboard.png differ diff --git a/docs/static/img/development-lifecycle/release/share/embed.png b/docs/static/img/development-lifecycle/release/share/embed.png new file mode 100644 index 0000000000..a122e90679 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/share/embed.png differ diff --git a/docs/static/img/development-lifecycle/release/share/folder.png b/docs/static/img/development-lifecycle/release/share/folder.png new file mode 100644 index 0000000000..f0c912510b Binary files /dev/null and b/docs/static/img/development-lifecycle/release/share/folder.png differ diff --git a/docs/static/img/development-lifecycle/release/share/url.png b/docs/static/img/development-lifecycle/release/share/url.png new file mode 100644 index 0000000000..2dfcdbbf49 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/share/url.png differ diff --git a/docs/static/img/development-lifecycle/release/version-control/delete.png b/docs/static/img/development-lifecycle/release/version-control/delete.png new file mode 100644 index 0000000000..537c15a6d7 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/version-control/delete.png differ diff --git a/docs/static/img/development-lifecycle/release/version-control/edit.png b/docs/static/img/development-lifecycle/release/version-control/edit.png new file mode 100644 index 0000000000..334b187d26 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/version-control/edit.png differ diff --git a/docs/static/img/development-lifecycle/release/version-control/newpopup.png b/docs/static/img/development-lifecycle/release/version-control/newpopup.png new file mode 100644 index 0000000000..fcd101b8c3 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/version-control/newpopup.png differ diff --git a/docs/static/img/development-lifecycle/release/version-control/version-menu.png b/docs/static/img/development-lifecycle/release/version-control/version-menu.png new file mode 100644 index 0000000000..bd722e4758 Binary files /dev/null and b/docs/static/img/development-lifecycle/release/version-control/version-menu.png differ diff --git a/docs/static/img/docs_logo.svg b/docs/static/img/docs_logo.svg new file mode 100644 index 0000000000..3631810490 --- /dev/null +++ b/docs/static/img/docs_logo.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/docs_logo_dark.svg b/docs/static/img/docs_logo_dark.svg new file mode 100644 index 0000000000..a4252c5e39 --- /dev/null +++ b/docs/static/img/docs_logo_dark.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/static/img/enterprise/smtp/configuration-v2-env.png b/docs/static/img/enterprise/smtp/configuration-v2-env.png new file mode 100644 index 0000000000..20f3ed1ecc Binary files /dev/null and b/docs/static/img/enterprise/smtp/configuration-v2-env.png differ diff --git a/docs/static/img/enterprise/smtp/configuration-v2.png b/docs/static/img/enterprise/smtp/configuration-v2.png new file mode 100644 index 0000000000..86e841b1cf Binary files /dev/null and b/docs/static/img/enterprise/smtp/configuration-v2.png differ diff --git a/docs/static/img/enterprise/smtp/mailgun-cred.png b/docs/static/img/enterprise/smtp/mailgun-cred.png new file mode 100644 index 0000000000..25bb241908 Binary files /dev/null and b/docs/static/img/enterprise/smtp/mailgun-cred.png differ diff --git a/docs/static/img/enterprise/smtp/sendgrid-api.png b/docs/static/img/enterprise/smtp/sendgrid-api.png new file mode 100644 index 0000000000..f761e997dd Binary files /dev/null and b/docs/static/img/enterprise/smtp/sendgrid-api.png differ diff --git a/docs/static/img/enterprise/smtp/sendgrid-config.png b/docs/static/img/enterprise/smtp/sendgrid-config.png new file mode 100644 index 0000000000..9b6239f523 Binary files /dev/null and b/docs/static/img/enterprise/smtp/sendgrid-config.png differ diff --git a/docs/static/img/enterprise/superadmin/instance-login-logout.png b/docs/static/img/enterprise/superadmin/instance-login-logout.png new file mode 100644 index 0000000000..69e83a3cfe Binary files /dev/null and b/docs/static/img/enterprise/superadmin/instance-login-logout.png differ diff --git a/docs/static/img/enterprise/superadmin/instance-logout.png b/docs/static/img/enterprise/superadmin/instance-logout.png new file mode 100644 index 0000000000..45602aff3e Binary files /dev/null and b/docs/static/img/enterprise/superadmin/instance-logout.png differ diff --git a/docs/static/img/enterprise/white-label/cloud.png b/docs/static/img/enterprise/white-label/cloud.png new file mode 100644 index 0000000000..b93e59b9d3 Binary files /dev/null and b/docs/static/img/enterprise/white-label/cloud.png differ diff --git a/docs/static/img/enterprise/white-label/favicon-v3.png b/docs/static/img/enterprise/white-label/favicon-v3.png new file mode 100644 index 0000000000..223c11b8f4 Binary files /dev/null and b/docs/static/img/enterprise/white-label/favicon-v3.png differ diff --git a/docs/static/img/enterprise/white-label/self-hosted.png b/docs/static/img/enterprise/white-label/self-hosted.png new file mode 100644 index 0000000000..2f8bfe0dbc Binary files /dev/null and b/docs/static/img/enterprise/white-label/self-hosted.png differ diff --git a/docs/static/img/enterprise/white-label/whitelabelling.png b/docs/static/img/enterprise/white-label/whitelabelling.png new file mode 100644 index 0000000000..f17ecf1661 Binary files /dev/null and b/docs/static/img/enterprise/white-label/whitelabelling.png differ diff --git a/docs/static/img/gitsync/ssh2-v2.png b/docs/static/img/gitsync/generate-ssh.png similarity index 100% rename from docs/static/img/gitsync/ssh2-v2.png rename to docs/static/img/gitsync/generate-ssh.png diff --git a/docs/static/img/gitsync/gitea/deploy-ssh.png b/docs/static/img/gitsync/gitea/deploy-ssh.png new file mode 100644 index 0000000000..62bce909b7 Binary files /dev/null and b/docs/static/img/gitsync/gitea/deploy-ssh.png differ diff --git a/docs/static/img/gitsync/gitea/final.png b/docs/static/img/gitsync/gitea/final.png new file mode 100644 index 0000000000..586236058d Binary files /dev/null and b/docs/static/img/gitsync/gitea/final.png differ diff --git a/docs/static/img/gitsync/gitea/new-repo.png b/docs/static/img/gitsync/gitea/new-repo.png new file mode 100644 index 0000000000..65a0d11250 Binary files /dev/null and b/docs/static/img/gitsync/gitea/new-repo.png differ diff --git a/docs/static/img/gitsync/gitea/ssh-url.png b/docs/static/img/gitsync/gitea/ssh-url.png new file mode 100644 index 0000000000..abf49c70c1 Binary files /dev/null and b/docs/static/img/gitsync/gitea/ssh-url.png differ diff --git a/docs/static/img/gitsync/github1.png b/docs/static/img/gitsync/github1.png deleted file mode 100644 index 981f9afc84..0000000000 Binary files a/docs/static/img/gitsync/github1.png and /dev/null differ diff --git a/docs/static/img/gitsync/gitsync-v3.png b/docs/static/img/gitsync/gitsync-v3.png new file mode 100644 index 0000000000..bf7d85e144 Binary files /dev/null and b/docs/static/img/gitsync/gitsync-v3.png differ diff --git a/docs/static/img/gitsync/restore-app.png b/docs/static/img/gitsync/restore-app.png new file mode 100644 index 0000000000..424e79c2f3 Binary files /dev/null and b/docs/static/img/gitsync/restore-app.png differ diff --git a/docs/static/img/gitsync/ssh-url.png b/docs/static/img/gitsync/ssh-url.png new file mode 100644 index 0000000000..90d3a190ff Binary files /dev/null and b/docs/static/img/gitsync/ssh-url.png differ diff --git a/docs/static/img/how-to/display-listview-record-on-new-page/add-new-page.png b/docs/static/img/how-to/display-listview-record-on-new-page/add-new-page.png new file mode 100644 index 0000000000..f81a906608 Binary files /dev/null and b/docs/static/img/how-to/display-listview-record-on-new-page/add-new-page.png differ diff --git a/docs/static/img/how-to/display-listview-record-on-new-page/build-app.png b/docs/static/img/how-to/display-listview-record-on-new-page/build-app.png new file mode 100644 index 0000000000..6f854b9cd0 Binary files /dev/null and b/docs/static/img/how-to/display-listview-record-on-new-page/build-app.png differ diff --git a/docs/static/img/how-to/display-listview-record-on-new-page/display-data.png b/docs/static/img/how-to/display-listview-record-on-new-page/display-data.png new file mode 100644 index 0000000000..25e04f03b0 Binary files /dev/null and b/docs/static/img/how-to/display-listview-record-on-new-page/display-data.png differ diff --git a/docs/static/img/how-to/display-listview-record-on-new-page/set-variable.png b/docs/static/img/how-to/display-listview-record-on-new-page/set-variable.png new file mode 100644 index 0000000000..8f74cfd106 Binary files /dev/null and b/docs/static/img/how-to/display-listview-record-on-new-page/set-variable.png differ diff --git a/docs/static/img/how-to/display-listview-record-on-new-page/setup-second-page.png b/docs/static/img/how-to/display-listview-record-on-new-page/setup-second-page.png new file mode 100644 index 0000000000..1992ee6728 Binary files /dev/null and b/docs/static/img/how-to/display-listview-record-on-new-page/setup-second-page.png differ diff --git a/docs/static/img/how-to/display-listview-record-on-new-page/switch-page.png b/docs/static/img/how-to/display-listview-record-on-new-page/switch-page.png new file mode 100644 index 0000000000..5cbc228507 Binary files /dev/null and b/docs/static/img/how-to/display-listview-record-on-new-page/switch-page.png differ diff --git a/docs/static/img/how-to/oauth2-authorization/callback-url.png b/docs/static/img/how-to/oauth2-authorization/callback-url.png new file mode 100644 index 0000000000..ad3454ff1f Binary files /dev/null and b/docs/static/img/how-to/oauth2-authorization/callback-url.png differ diff --git a/docs/static/img/licensing/cloud-license-price.png b/docs/static/img/licensing/cloud-license-price.png new file mode 100644 index 0000000000..44fe4037f5 Binary files /dev/null and b/docs/static/img/licensing/cloud-license-price.png differ diff --git a/docs/static/img/licensing/cloud-license.png b/docs/static/img/licensing/cloud-license.png new file mode 100644 index 0000000000..456cb3043d Binary files /dev/null and b/docs/static/img/licensing/cloud-license.png differ diff --git a/docs/static/img/licensing/self-hosted-license.png b/docs/static/img/licensing/self-hosted-license.png new file mode 100644 index 0000000000..ce6e4d48d7 Binary files /dev/null and b/docs/static/img/licensing/self-hosted-license.png differ diff --git a/docs/static/img/licensing/selfhosted-access.png b/docs/static/img/licensing/selfhosted-access.png new file mode 100644 index 0000000000..0dea3eb43d Binary files /dev/null and b/docs/static/img/licensing/selfhosted-access.png differ diff --git a/docs/static/img/licensing/selfhosted-limits.png b/docs/static/img/licensing/selfhosted-limits.png new file mode 100644 index 0000000000..10f1b79641 Binary files /dev/null and b/docs/static/img/licensing/selfhosted-limits.png differ diff --git a/docs/static/img/marketplace/plugins/anthropic/config.png b/docs/static/img/marketplace/plugins/anthropic/config.png new file mode 100644 index 0000000000..958d743205 Binary files /dev/null and b/docs/static/img/marketplace/plugins/anthropic/config.png differ diff --git a/docs/static/img/marketplace/plugins/anthropic/query.png b/docs/static/img/marketplace/plugins/anthropic/query.png new file mode 100644 index 0000000000..e2edba7e0f Binary files /dev/null and b/docs/static/img/marketplace/plugins/anthropic/query.png differ diff --git a/docs/static/img/marketplace/plugins/cohere/chat.png b/docs/static/img/marketplace/plugins/cohere/chat.png new file mode 100644 index 0000000000..9bdd38b8ba Binary files /dev/null and b/docs/static/img/marketplace/plugins/cohere/chat.png differ diff --git a/docs/static/img/marketplace/plugins/cohere/config.png b/docs/static/img/marketplace/plugins/cohere/config.png new file mode 100644 index 0000000000..d473659008 Binary files /dev/null and b/docs/static/img/marketplace/plugins/cohere/config.png differ diff --git a/docs/static/img/marketplace/plugins/cohere/text-generation.png b/docs/static/img/marketplace/plugins/cohere/text-generation.png new file mode 100644 index 0000000000..f5b0b83075 Binary files /dev/null and b/docs/static/img/marketplace/plugins/cohere/text-generation.png differ diff --git a/docs/static/img/marketplace/plugins/gemini/chat-query.png b/docs/static/img/marketplace/plugins/gemini/chat-query.png new file mode 100644 index 0000000000..5a1caa6961 Binary files /dev/null and b/docs/static/img/marketplace/plugins/gemini/chat-query.png differ diff --git a/docs/static/img/marketplace/plugins/gemini/config.png b/docs/static/img/marketplace/plugins/gemini/config.png new file mode 100644 index 0000000000..e8ee7b2b45 Binary files /dev/null and b/docs/static/img/marketplace/plugins/gemini/config.png differ diff --git a/docs/static/img/marketplace/plugins/gemini/query.png b/docs/static/img/marketplace/plugins/gemini/query.png new file mode 100644 index 0000000000..9b9a5d04e5 Binary files /dev/null and b/docs/static/img/marketplace/plugins/gemini/query.png differ diff --git a/docs/static/img/marketplace/plugins/github/get-issue.png b/docs/static/img/marketplace/plugins/github/get-issue.png new file mode 100644 index 0000000000..96212d2309 Binary files /dev/null and b/docs/static/img/marketplace/plugins/github/get-issue.png differ diff --git a/docs/static/img/marketplace/plugins/github/get-pull.png b/docs/static/img/marketplace/plugins/github/get-pull.png new file mode 100644 index 0000000000..3711629040 Binary files /dev/null and b/docs/static/img/marketplace/plugins/github/get-pull.png differ diff --git a/docs/static/img/marketplace/plugins/github/get-repo.png b/docs/static/img/marketplace/plugins/github/get-repo.png new file mode 100644 index 0000000000..8d38d60941 Binary files /dev/null and b/docs/static/img/marketplace/plugins/github/get-repo.png differ diff --git a/docs/static/img/marketplace/plugins/github/getuserinfo-v3.png b/docs/static/img/marketplace/plugins/github/getuserinfo-v3.png new file mode 100644 index 0000000000..101d8c5ece Binary files /dev/null and b/docs/static/img/marketplace/plugins/github/getuserinfo-v3.png differ diff --git a/docs/static/img/marketplace/plugins/huggingface/config.png b/docs/static/img/marketplace/plugins/huggingface/config.png new file mode 100644 index 0000000000..9fead7d201 Binary files /dev/null and b/docs/static/img/marketplace/plugins/huggingface/config.png differ diff --git a/docs/static/img/marketplace/plugins/huggingface/inference-api.png b/docs/static/img/marketplace/plugins/huggingface/inference-api.png new file mode 100644 index 0000000000..a88ba6b4f1 Binary files /dev/null and b/docs/static/img/marketplace/plugins/huggingface/inference-api.png differ diff --git a/docs/static/img/marketplace/plugins/huggingface/summary-query.png b/docs/static/img/marketplace/plugins/huggingface/summary-query.png new file mode 100644 index 0000000000..4317fca73e Binary files /dev/null and b/docs/static/img/marketplace/plugins/huggingface/summary-query.png differ diff --git a/docs/static/img/marketplace/plugins/huggingface/text-generation-query.png b/docs/static/img/marketplace/plugins/huggingface/text-generation-query.png new file mode 100644 index 0000000000..1df8d6ef57 Binary files /dev/null and b/docs/static/img/marketplace/plugins/huggingface/text-generation-query.png differ diff --git a/docs/static/img/marketplace/plugins/mistral/config.png b/docs/static/img/marketplace/plugins/mistral/config.png new file mode 100644 index 0000000000..0a3c4ad2d8 Binary files /dev/null and b/docs/static/img/marketplace/plugins/mistral/config.png differ diff --git a/docs/static/img/marketplace/plugins/mistral/query.png b/docs/static/img/marketplace/plugins/mistral/query.png new file mode 100644 index 0000000000..8c99a8c815 Binary files /dev/null and b/docs/static/img/marketplace/plugins/mistral/query.png differ diff --git a/docs/static/img/marketplace/plugins/openai/chat-v3.png b/docs/static/img/marketplace/plugins/openai/chat-v3.png new file mode 100644 index 0000000000..c8c95c6ebd Binary files /dev/null and b/docs/static/img/marketplace/plugins/openai/chat-v3.png differ diff --git a/docs/static/img/marketplace/plugins/openai/completions-v3.png b/docs/static/img/marketplace/plugins/openai/completions-v3.png new file mode 100644 index 0000000000..c67be9c33d Binary files /dev/null and b/docs/static/img/marketplace/plugins/openai/completions-v3.png differ diff --git a/docs/static/img/marketplace/plugins/openai/connection-v4.png b/docs/static/img/marketplace/plugins/openai/connection-v4.png new file mode 100644 index 0000000000..e9030aeaf0 Binary files /dev/null and b/docs/static/img/marketplace/plugins/openai/connection-v4.png differ diff --git a/docs/static/img/marketplace/plugins/openai/embedding-v2.png b/docs/static/img/marketplace/plugins/openai/embedding-v2.png new file mode 100644 index 0000000000..1c0a4a2960 Binary files /dev/null and b/docs/static/img/marketplace/plugins/openai/embedding-v2.png differ diff --git a/docs/static/img/marketplace/plugins/openai/embedding.png b/docs/static/img/marketplace/plugins/openai/embedding.png new file mode 100644 index 0000000000..5148eae45c Binary files /dev/null and b/docs/static/img/marketplace/plugins/openai/embedding.png differ diff --git a/docs/static/img/marketplace/plugins/openai/generate-ai-images-v2.png b/docs/static/img/marketplace/plugins/openai/generate-ai-images-v2.png new file mode 100644 index 0000000000..8b4ebe95a6 Binary files /dev/null and b/docs/static/img/marketplace/plugins/openai/generate-ai-images-v2.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/connection.png b/docs/static/img/marketplace/plugins/pinecone/connection.png new file mode 100644 index 0000000000..2a392ed21d Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/connection.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/delete-vectors.png b/docs/static/img/marketplace/plugins/pinecone/delete-vectors.png new file mode 100644 index 0000000000..8998357d0f Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/delete-vectors.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/fetch-vectors.png b/docs/static/img/marketplace/plugins/pinecone/fetch-vectors.png new file mode 100644 index 0000000000..f26baa2c9f Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/fetch-vectors.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/get-index-stats.png b/docs/static/img/marketplace/plugins/pinecone/get-index-stats.png new file mode 100644 index 0000000000..464b900ea5 Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/get-index-stats.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/list-vector-ids.png b/docs/static/img/marketplace/plugins/pinecone/list-vector-ids.png new file mode 100644 index 0000000000..5f504eef33 Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/list-vector-ids.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/query-vectors.png b/docs/static/img/marketplace/plugins/pinecone/query-vectors.png new file mode 100644 index 0000000000..fb01c6a23a Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/query-vectors.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/update-vector.png b/docs/static/img/marketplace/plugins/pinecone/update-vector.png new file mode 100644 index 0000000000..0fc116e3bd Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/update-vector.png differ diff --git a/docs/static/img/marketplace/plugins/pinecone/upsert-vectors.png b/docs/static/img/marketplace/plugins/pinecone/upsert-vectors.png new file mode 100644 index 0000000000..493ffa2556 Binary files /dev/null and b/docs/static/img/marketplace/plugins/pinecone/upsert-vectors.png differ diff --git a/docs/static/img/marketplace/plugins/qdrant/config.png b/docs/static/img/marketplace/plugins/qdrant/config.png new file mode 100644 index 0000000000..c72e77b058 Binary files /dev/null and b/docs/static/img/marketplace/plugins/qdrant/config.png differ diff --git a/docs/static/img/marketplace/plugins/qdrant/delete-points.png b/docs/static/img/marketplace/plugins/qdrant/delete-points.png new file mode 100644 index 0000000000..8f18db335c Binary files /dev/null and b/docs/static/img/marketplace/plugins/qdrant/delete-points.png differ diff --git a/docs/static/img/marketplace/plugins/qdrant/get-collection-info.png b/docs/static/img/marketplace/plugins/qdrant/get-collection-info.png new file mode 100644 index 0000000000..0103f8142a Binary files /dev/null and b/docs/static/img/marketplace/plugins/qdrant/get-collection-info.png differ diff --git a/docs/static/img/marketplace/plugins/qdrant/get-points.png b/docs/static/img/marketplace/plugins/qdrant/get-points.png new file mode 100644 index 0000000000..a19b0b8527 Binary files /dev/null and b/docs/static/img/marketplace/plugins/qdrant/get-points.png differ diff --git a/docs/static/img/marketplace/plugins/qdrant/list-collection.png b/docs/static/img/marketplace/plugins/qdrant/list-collection.png new file mode 100644 index 0000000000..219d87c468 Binary files /dev/null and b/docs/static/img/marketplace/plugins/qdrant/list-collection.png differ diff --git a/docs/static/img/marketplace/plugins/qdrant/query-points.png b/docs/static/img/marketplace/plugins/qdrant/query-points.png new file mode 100644 index 0000000000..109bc23c5a Binary files /dev/null and b/docs/static/img/marketplace/plugins/qdrant/query-points.png differ diff --git a/docs/static/img/marketplace/plugins/qdrant/upsert-points.png b/docs/static/img/marketplace/plugins/qdrant/upsert-points.png new file mode 100644 index 0000000000..fc91e11559 Binary files /dev/null and b/docs/static/img/marketplace/plugins/qdrant/upsert-points.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/add-item.png b/docs/static/img/marketplace/plugins/sharepoint/add-item.png new file mode 100644 index 0000000000..422c612846 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/add-item.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/connect.png b/docs/static/img/marketplace/plugins/sharepoint/connect.png new file mode 100644 index 0000000000..fb3f2346c5 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/connect.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/create-list.png b/docs/static/img/marketplace/plugins/sharepoint/create-list.png new file mode 100644 index 0000000000..f829500252 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/create-list.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/delete-item.png b/docs/static/img/marketplace/plugins/sharepoint/delete-item.png new file mode 100644 index 0000000000..5b4b5b3a01 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/delete-item.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/get-all-lists.png b/docs/static/img/marketplace/plugins/sharepoint/get-all-lists.png new file mode 100644 index 0000000000..cf97166762 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/get-all-lists.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/get-all-sites.png b/docs/static/img/marketplace/plugins/sharepoint/get-all-sites.png new file mode 100644 index 0000000000..c61df045e0 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/get-all-sites.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/get-analytics.png b/docs/static/img/marketplace/plugins/sharepoint/get-analytics.png new file mode 100644 index 0000000000..94561be858 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/get-analytics.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/get-list-items.png b/docs/static/img/marketplace/plugins/sharepoint/get-list-items.png new file mode 100644 index 0000000000..50b004164d Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/get-list-items.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/get-list-metadata.png b/docs/static/img/marketplace/plugins/sharepoint/get-list-metadata.png new file mode 100644 index 0000000000..fcf439739e Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/get-list-metadata.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/get-pages.png b/docs/static/img/marketplace/plugins/sharepoint/get-pages.png new file mode 100644 index 0000000000..3c6752f853 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/get-pages.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/get-site.png b/docs/static/img/marketplace/plugins/sharepoint/get-site.png new file mode 100644 index 0000000000..47f5f968c4 Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/get-site.png differ diff --git a/docs/static/img/marketplace/plugins/sharepoint/update-item.png b/docs/static/img/marketplace/plugins/sharepoint/update-item.png new file mode 100644 index 0000000000..cd97892ddf Binary files /dev/null and b/docs/static/img/marketplace/plugins/sharepoint/update-item.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/cloud-config.png b/docs/static/img/marketplace/plugins/weaviate/cloud-config.png new file mode 100644 index 0000000000..504b1d3898 Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/cloud-config.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/create-collection.png b/docs/static/img/marketplace/plugins/weaviate/create-collection.png new file mode 100644 index 0000000000..e961bfea9b Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/create-collection.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/create-object.png b/docs/static/img/marketplace/plugins/weaviate/create-object.png new file mode 100644 index 0000000000..87a01351be Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/create-object.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/db-schema.png b/docs/static/img/marketplace/plugins/weaviate/db-schema.png new file mode 100644 index 0000000000..30b4098dcf Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/db-schema.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/delete-collection.png b/docs/static/img/marketplace/plugins/weaviate/delete-collection.png new file mode 100644 index 0000000000..fe6a42981c Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/delete-collection.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/delete-object.png b/docs/static/img/marketplace/plugins/weaviate/delete-object.png new file mode 100644 index 0000000000..545ca2218c Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/delete-object.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/get-collection.png b/docs/static/img/marketplace/plugins/weaviate/get-collection.png new file mode 100644 index 0000000000..62f3beab0f Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/get-collection.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/get-object.png b/docs/static/img/marketplace/plugins/weaviate/get-object.png new file mode 100644 index 0000000000..aca1800a49 Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/get-object.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/list-object.png b/docs/static/img/marketplace/plugins/weaviate/list-object.png new file mode 100644 index 0000000000..2d47b94d4d Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/list-object.png differ diff --git a/docs/static/img/marketplace/plugins/weaviate/local-config.png b/docs/static/img/marketplace/plugins/weaviate/local-config.png new file mode 100644 index 0000000000..1d654614d9 Binary files /dev/null and b/docs/static/img/marketplace/plugins/weaviate/local-config.png differ diff --git a/docs/static/img/platform-overview/platform-overview-v3.png b/docs/static/img/platform-overview/platform-overview-v3.png new file mode 100644 index 0000000000..956ac8fa27 Binary files /dev/null and b/docs/static/img/platform-overview/platform-overview-v3.png differ diff --git a/docs/static/img/security/constants/constants-secret/const-mapping.png b/docs/static/img/security/constants/constants-secret/const-mapping.png new file mode 100644 index 0000000000..59325ad541 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/const-mapping.png differ diff --git a/docs/static/img/security/constants/constants-secret/create-constant.png b/docs/static/img/security/constants/constants-secret/create-constant.png new file mode 100644 index 0000000000..bd1e09b480 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/create-constant.png differ diff --git a/docs/static/img/security/constants/constants-secret/create-new-V2.png b/docs/static/img/security/constants/constants-secret/create-new-V2.png new file mode 100644 index 0000000000..2c14ce38d3 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/create-new-V2.png differ diff --git a/docs/static/img/security/constants/constants-secret/dashboard.png b/docs/static/img/security/constants/constants-secret/dashboard.png new file mode 100644 index 0000000000..f2e24d2711 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/dashboard.png differ diff --git a/docs/static/img/security/constants/constants-secret/env-specific-const-v2.png b/docs/static/img/security/constants/constants-secret/env-specific-const-v2.png new file mode 100644 index 0000000000..277b571d7e Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/env-specific-const-v2.png differ diff --git a/docs/static/img/security/constants/constants-secret/global-const-app.png b/docs/static/img/security/constants/constants-secret/global-const-app.png new file mode 100644 index 0000000000..d76413f983 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/global-const-app.png differ diff --git a/docs/static/img/security/constants/constants-secret/global-constants-app-builder-v2.png b/docs/static/img/security/constants/constants-secret/global-constants-app-builder-v2.png new file mode 100644 index 0000000000..8ca0fa487a Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/global-constants-app-builder-v2.png differ diff --git a/docs/static/img/security/constants/constants-secret/global-constants-queries.png b/docs/static/img/security/constants/constants-secret/global-constants-queries.png new file mode 100644 index 0000000000..0fc38ca754 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/global-constants-queries.png differ diff --git a/docs/static/img/security/constants/constants-secret/golbal-constants-data-source-connection-v2.png b/docs/static/img/security/constants/constants-secret/golbal-constants-data-source-connection-v2.png new file mode 100644 index 0000000000..6b5dac8a7f Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/golbal-constants-data-source-connection-v2.png differ diff --git a/docs/static/img/security/constants/constants-secret/secrets-data-source-connection-v2.png b/docs/static/img/security/constants/constants-secret/secrets-data-source-connection-v2.png new file mode 100644 index 0000000000..7b040ae313 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/secrets-data-source-connection-v2.png differ diff --git a/docs/static/img/security/constants/constants-secret/secrets-queries.png b/docs/static/img/security/constants/constants-secret/secrets-queries.png new file mode 100644 index 0000000000..c0c1281716 Binary files /dev/null and b/docs/static/img/security/constants/constants-secret/secrets-queries.png differ diff --git a/docs/static/img/setup/azure-container/step4-v2.png b/docs/static/img/setup/azure-container/step4-v2.png index 8873d8d91b..3f3ef506a3 100644 Binary files a/docs/static/img/setup/azure-container/step4-v2.png and b/docs/static/img/setup/azure-container/step4-v2.png differ diff --git a/docs/static/img/setup/azure-container/step5a-v2.png b/docs/static/img/setup/azure-container/step5a-v2.png index 74a30c1213..0c74757661 100644 Binary files a/docs/static/img/setup/azure-container/step5a-v2.png and b/docs/static/img/setup/azure-container/step5a-v2.png differ diff --git a/docs/static/img/setup/digitalocean/droplet_1.png b/docs/static/img/setup/digitalocean/droplet_1.png new file mode 100644 index 0000000000..519d484acd Binary files /dev/null and b/docs/static/img/setup/digitalocean/droplet_1.png differ diff --git a/docs/static/img/setup/digitalocean/droplet_plan.png b/docs/static/img/setup/digitalocean/droplet_plan.png new file mode 100644 index 0000000000..2498b9a9f7 Binary files /dev/null and b/docs/static/img/setup/digitalocean/droplet_plan.png differ diff --git a/docs/static/img/setup/ecs/chromadb_1.png b/docs/static/img/setup/ecs/chromadb_1.png new file mode 100644 index 0000000000..88f3f921ca Binary files /dev/null and b/docs/static/img/setup/ecs/chromadb_1.png differ diff --git a/docs/static/img/setup/ecs/chromadb_2.png b/docs/static/img/setup/ecs/chromadb_2.png new file mode 100644 index 0000000000..9efce4a5bb Binary files /dev/null and b/docs/static/img/setup/ecs/chromadb_2.png differ diff --git a/docs/static/img/setup/ecs/ecs-1.png b/docs/static/img/setup/ecs/ecs-1.png index ecafe80da3..aaf87c4410 100644 Binary files a/docs/static/img/setup/ecs/ecs-1.png and b/docs/static/img/setup/ecs/ecs-1.png differ diff --git a/docs/static/img/setup/ecs/ecs-13.png b/docs/static/img/setup/ecs/ecs-13.png index c0d816e918..032f318610 100644 Binary files a/docs/static/img/setup/ecs/ecs-13.png and b/docs/static/img/setup/ecs/ecs-13.png differ diff --git a/docs/static/img/setup/ecs/ecs-2.png b/docs/static/img/setup/ecs/ecs-2.png index 807b7f0283..aec8011397 100644 Binary files a/docs/static/img/setup/ecs/ecs-2.png and b/docs/static/img/setup/ecs/ecs-2.png differ diff --git a/docs/static/img/setup/ecs/ecs-3.png b/docs/static/img/setup/ecs/ecs-3.png index 3904815f0d..aaa43ae55f 100644 Binary files a/docs/static/img/setup/ecs/ecs-3.png and b/docs/static/img/setup/ecs/ecs-3.png differ diff --git a/docs/static/img/setup/ecs/ecs-4.png b/docs/static/img/setup/ecs/ecs-4.png index 18fa8fb11d..eddd07b7da 100644 Binary files a/docs/static/img/setup/ecs/ecs-4.png and b/docs/static/img/setup/ecs/ecs-4.png differ diff --git a/docs/static/img/setup/ecs/ecs-5.png b/docs/static/img/setup/ecs/ecs-5.png index 34e8112663..c6ef3b4cc1 100644 Binary files a/docs/static/img/setup/ecs/ecs-5.png and b/docs/static/img/setup/ecs/ecs-5.png differ diff --git a/docs/static/img/setup/ecs/ecs-8.png b/docs/static/img/setup/ecs/ecs-8.png index 873d44ed50..9d4d855c81 100644 Binary files a/docs/static/img/setup/ecs/ecs-8.png and b/docs/static/img/setup/ecs/ecs-8.png differ diff --git a/docs/static/img/setup/ecs/ecs-temporal-env.png b/docs/static/img/setup/ecs/ecs-temporal-env.png new file mode 100644 index 0000000000..d2632f55a8 Binary files /dev/null and b/docs/static/img/setup/ecs/ecs-temporal-env.png differ diff --git a/docs/static/img/setup/ecs/ecs-temporal.png b/docs/static/img/setup/ecs/ecs-temporal.png new file mode 100644 index 0000000000..b7583358c3 Binary files /dev/null and b/docs/static/img/setup/ecs/ecs-temporal.png differ diff --git a/docs/static/img/setup/ecs/ecs-tooljet-worker.png b/docs/static/img/setup/ecs/ecs-tooljet-worker.png new file mode 100644 index 0000000000..b963d1a865 Binary files /dev/null and b/docs/static/img/setup/ecs/ecs-tooljet-worker.png differ diff --git a/docs/static/img/sidebar-icons/app-builder.svg b/docs/static/img/sidebar-icons/app-builder.svg new file mode 100644 index 0000000000..e9bfdb1c35 --- /dev/null +++ b/docs/static/img/sidebar-icons/app-builder.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/docs/static/img/sidebar-icons/build-with-ai.svg b/docs/static/img/sidebar-icons/build-with-ai.svg new file mode 100644 index 0000000000..e4c2a5babb --- /dev/null +++ b/docs/static/img/sidebar-icons/build-with-ai.svg @@ -0,0 +1,10 @@ + + + diff --git a/docs/static/img/sidebar-icons/data-source.svg b/docs/static/img/sidebar-icons/data-source.svg new file mode 100644 index 0000000000..57d0669f6c --- /dev/null +++ b/docs/static/img/sidebar-icons/data-source.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/dev-cycle.svg b/docs/static/img/sidebar-icons/dev-cycle.svg new file mode 100644 index 0000000000..40afdce7a8 --- /dev/null +++ b/docs/static/img/sidebar-icons/dev-cycle.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/getting-started.svg b/docs/static/img/sidebar-icons/getting-started.svg new file mode 100644 index 0000000000..a6d381d65c --- /dev/null +++ b/docs/static/img/sidebar-icons/getting-started.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/resources.svg b/docs/static/img/sidebar-icons/resources.svg new file mode 100644 index 0000000000..25ee0d73eb --- /dev/null +++ b/docs/static/img/sidebar-icons/resources.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/security.svg b/docs/static/img/sidebar-icons/security.svg new file mode 100644 index 0000000000..7f8cfdb12f --- /dev/null +++ b/docs/static/img/sidebar-icons/security.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/setup-tj.svg b/docs/static/img/sidebar-icons/setup-tj.svg new file mode 100644 index 0000000000..9a127ab2ad --- /dev/null +++ b/docs/static/img/sidebar-icons/setup-tj.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/tj-api.svg b/docs/static/img/sidebar-icons/tj-api.svg new file mode 100644 index 0000000000..b2c0a6a539 --- /dev/null +++ b/docs/static/img/sidebar-icons/tj-api.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/tjdb.svg b/docs/static/img/sidebar-icons/tjdb.svg new file mode 100644 index 0000000000..f13b12a48d --- /dev/null +++ b/docs/static/img/sidebar-icons/tjdb.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/sidebar-icons/user-management.svg b/docs/static/img/sidebar-icons/user-management.svg new file mode 100644 index 0000000000..c8835bbcd4 --- /dev/null +++ b/docs/static/img/sidebar-icons/user-management.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/docs/static/img/sidebar-icons/workflows.svg b/docs/static/img/sidebar-icons/workflows.svg new file mode 100644 index 0000000000..2c627a3730 --- /dev/null +++ b/docs/static/img/sidebar-icons/workflows.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/docs/static/img/sso/general/auto-password.png b/docs/static/img/sso/general/auto-password.png deleted file mode 100644 index a5943cfc09..0000000000 Binary files a/docs/static/img/sso/general/auto-password.png and /dev/null differ diff --git a/docs/static/img/sso/group-sync-oidc.png b/docs/static/img/sso/group-sync-oidc.png deleted file mode 100644 index 8f957b233b..0000000000 Binary files a/docs/static/img/sso/group-sync-oidc.png and /dev/null differ diff --git a/docs/static/img/sso/ldap/disabled-v3.png b/docs/static/img/sso/ldap/disabled-v3.png new file mode 100644 index 0000000000..a81786d40c Binary files /dev/null and b/docs/static/img/sso/ldap/disabled-v3.png differ diff --git a/docs/static/img/sso/ldap/fields-v2.png b/docs/static/img/sso/ldap/fields-v2.png new file mode 100644 index 0000000000..10ba95c053 Binary files /dev/null and b/docs/static/img/sso/ldap/fields-v2.png differ diff --git a/docs/static/img/sso/ldap/login-v2.png b/docs/static/img/sso/ldap/login-v2.png new file mode 100644 index 0000000000..726b1dc8bf Binary files /dev/null and b/docs/static/img/sso/ldap/login-v2.png differ diff --git a/docs/static/img/sso/ldap/settings-v3.png b/docs/static/img/sso/ldap/settings-v3.png new file mode 100644 index 0000000000..997574083a Binary files /dev/null and b/docs/static/img/sso/ldap/settings-v3.png differ diff --git a/docs/static/img/sso/ldap/url-v3.png b/docs/static/img/sso/ldap/url-v3.png new file mode 100644 index 0000000000..81a70ebe9b Binary files /dev/null and b/docs/static/img/sso/ldap/url-v3.png differ diff --git a/docs/static/img/sso/ldap/url-v4.png b/docs/static/img/sso/ldap/url-v4.png new file mode 100644 index 0000000000..7e0cca29b5 Binary files /dev/null and b/docs/static/img/sso/ldap/url-v4.png differ diff --git a/docs/static/img/sso/saml/SAML-Redirect-URL.png b/docs/static/img/sso/saml/SAML-Redirect-URL.png new file mode 100644 index 0000000000..f5ef27321e Binary files /dev/null and b/docs/static/img/sso/saml/SAML-Redirect-URL.png differ diff --git a/docs/static/img/sso/saml/config-new-v3.png b/docs/static/img/sso/saml/config-new-v3.png new file mode 100644 index 0000000000..9850edd1f6 Binary files /dev/null and b/docs/static/img/sso/saml/config-new-v3.png differ diff --git a/docs/static/img/sso/saml/enable-v2.png b/docs/static/img/sso/saml/enable-v2.png new file mode 100644 index 0000000000..25eeb849e5 Binary files /dev/null and b/docs/static/img/sso/saml/enable-v2.png differ diff --git a/docs/static/img/sso/saml/login-v2.png b/docs/static/img/sso/saml/login-v2.png new file mode 100644 index 0000000000..84683ed8bc Binary files /dev/null and b/docs/static/img/sso/saml/login-v2.png differ diff --git a/docs/static/img/sso/saml/url-v3.png b/docs/static/img/sso/saml/url-v3.png new file mode 100644 index 0000000000..dcb2eedadf Binary files /dev/null and b/docs/static/img/sso/saml/url-v3.png differ diff --git a/docs/static/img/sso/saml/workspaceset-v2.png b/docs/static/img/sso/saml/workspaceset-v2.png new file mode 100644 index 0000000000..5c89f4efd3 Binary files /dev/null and b/docs/static/img/sso/saml/workspaceset-v2.png differ diff --git a/docs/static/img/sso/saml/workspaceset-v3.png b/docs/static/img/sso/saml/workspaceset-v3.png new file mode 100644 index 0000000000..21fa3c3117 Binary files /dev/null and b/docs/static/img/sso/saml/workspaceset-v3.png differ diff --git a/docs/static/img/tooljet-ai-favicon.svg b/docs/static/img/tooljet-ai-favicon.svg new file mode 100644 index 0000000000..123b5e596a --- /dev/null +++ b/docs/static/img/tooljet-ai-favicon.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/docs/static/img/tooljet-ai-og-image.png b/docs/static/img/tooljet-ai-og-image.png new file mode 100644 index 0000000000..0d46d1455f Binary files /dev/null and b/docs/static/img/tooljet-ai-og-image.png differ diff --git a/docs/static/img/tooljet-ai/doc0.png b/docs/static/img/tooljet-ai/doc0.png new file mode 100644 index 0000000000..c57441efab Binary files /dev/null and b/docs/static/img/tooljet-ai/doc0.png differ diff --git a/docs/static/img/tooljet-ai/doc1.png b/docs/static/img/tooljet-ai/doc1.png new file mode 100644 index 0000000000..2330ca36a2 Binary files /dev/null and b/docs/static/img/tooljet-ai/doc1.png differ diff --git a/docs/static/img/tooljet-ai/doc2.png b/docs/static/img/tooljet-ai/doc2.png new file mode 100644 index 0000000000..333b3066fe Binary files /dev/null and b/docs/static/img/tooljet-ai/doc2.png differ diff --git a/docs/static/img/tooljet-ai/doc3.png b/docs/static/img/tooljet-ai/doc3.png new file mode 100644 index 0000000000..ed57c4f2c5 Binary files /dev/null and b/docs/static/img/tooljet-ai/doc3.png differ diff --git a/docs/static/img/tooljet-ai/generate01.png b/docs/static/img/tooljet-ai/generate01.png new file mode 100644 index 0000000000..dc19ddbad1 Binary files /dev/null and b/docs/static/img/tooljet-ai/generate01.png differ diff --git a/docs/static/img/tooljet-ai/generate02.png b/docs/static/img/tooljet-ai/generate02.png new file mode 100644 index 0000000000..310db57f6a Binary files /dev/null and b/docs/static/img/tooljet-ai/generate02.png differ diff --git a/docs/static/img/tooljet-ai/generate03.png b/docs/static/img/tooljet-ai/generate03.png new file mode 100644 index 0000000000..848f10a9fa Binary files /dev/null and b/docs/static/img/tooljet-ai/generate03.png differ diff --git a/docs/static/img/tooljet-ai/generate04.png b/docs/static/img/tooljet-ai/generate04.png new file mode 100644 index 0000000000..680b77709b Binary files /dev/null and b/docs/static/img/tooljet-ai/generate04.png differ diff --git a/docs/static/img/tooljet-ai/generate05.png b/docs/static/img/tooljet-ai/generate05.png new file mode 100644 index 0000000000..b42bc3f5ef Binary files /dev/null and b/docs/static/img/tooljet-ai/generate05.png differ diff --git a/docs/static/img/tooljet-ai/overview-ai-1.png b/docs/static/img/tooljet-ai/overview-ai-1.png new file mode 100644 index 0000000000..6f1b34b803 Binary files /dev/null and b/docs/static/img/tooljet-ai/overview-ai-1.png differ diff --git a/docs/static/img/tooljet-ai/overview-ai-2.png b/docs/static/img/tooljet-ai/overview-ai-2.png new file mode 100644 index 0000000000..a6b6419354 Binary files /dev/null and b/docs/static/img/tooljet-ai/overview-ai-2.png differ diff --git a/docs/static/img/tooljet-ai/overview-ai-3.png b/docs/static/img/tooljet-ai/overview-ai-3.png new file mode 100644 index 0000000000..8e3338bccd Binary files /dev/null and b/docs/static/img/tooljet-ai/overview-ai-3.png differ diff --git a/docs/static/img/tooljet-ai/overview-ai-4.png b/docs/static/img/tooljet-ai/overview-ai-4.png new file mode 100644 index 0000000000..37c6cd42cf Binary files /dev/null and b/docs/static/img/tooljet-ai/overview-ai-4.png differ diff --git a/docs/static/img/tooljet-og-image-old.png b/docs/static/img/tooljet-og-image-old.png new file mode 100644 index 0000000000..d8053c7cd0 Binary files /dev/null and b/docs/static/img/tooljet-og-image-old.png differ diff --git a/docs/static/img/tooljet-og-image.png b/docs/static/img/tooljet-og-image.png index d8053c7cd0..52fde032c3 100644 Binary files a/docs/static/img/tooljet-og-image.png and b/docs/static/img/tooljet-og-image.png differ diff --git a/docs/static/img/tooljet-setup/instance/multi-instance.png b/docs/static/img/tooljet-setup/instance/multi-instance.png new file mode 100644 index 0000000000..08e9f7e4ca Binary files /dev/null and b/docs/static/img/tooljet-setup/instance/multi-instance.png differ diff --git a/docs/static/img/tooljet-setup/instance/overview.png b/docs/static/img/tooljet-setup/instance/overview.png new file mode 100644 index 0000000000..a37385a1d6 Binary files /dev/null and b/docs/static/img/tooljet-setup/instance/overview.png differ diff --git a/docs/static/img/tooljet-setup/whitelabelling/cloud.png b/docs/static/img/tooljet-setup/whitelabelling/cloud.png new file mode 100644 index 0000000000..e8874ad109 Binary files /dev/null and b/docs/static/img/tooljet-setup/whitelabelling/cloud.png differ diff --git a/docs/static/img/tooljet-setup/whitelabelling/intro.png b/docs/static/img/tooljet-setup/whitelabelling/intro.png new file mode 100644 index 0000000000..75d2ceb83b Binary files /dev/null and b/docs/static/img/tooljet-setup/whitelabelling/intro.png differ diff --git a/docs/static/img/tooljet-setup/whitelabelling/self-hosted.png b/docs/static/img/tooljet-setup/whitelabelling/self-hosted.png new file mode 100644 index 0000000000..4252850960 Binary files /dev/null and b/docs/static/img/tooljet-setup/whitelabelling/self-hosted.png differ diff --git a/docs/static/img/tooljet-setup/workspace/archive-workspace.png b/docs/static/img/tooljet-setup/workspace/archive-workspace.png new file mode 100644 index 0000000000..f1e82e1501 Binary files /dev/null and b/docs/static/img/tooljet-setup/workspace/archive-workspace.png differ diff --git a/docs/static/img/tooljet-setup/workspace/archive.png b/docs/static/img/tooljet-setup/workspace/archive.png new file mode 100644 index 0000000000..2a76b3913c Binary files /dev/null and b/docs/static/img/tooljet-setup/workspace/archive.png differ diff --git a/docs/static/img/tooljet-setup/workspace/create-workspace.png b/docs/static/img/tooljet-setup/workspace/create-workspace.png new file mode 100644 index 0000000000..a3f34c96dc Binary files /dev/null and b/docs/static/img/tooljet-setup/workspace/create-workspace.png differ diff --git a/docs/static/img/tooljet-setup/workspace/create.png b/docs/static/img/tooljet-setup/workspace/create.png new file mode 100644 index 0000000000..acbf2cd711 Binary files /dev/null and b/docs/static/img/tooljet-setup/workspace/create.png differ diff --git a/docs/static/img/tooljet-setup/workspace/switch-workspace.png b/docs/static/img/tooljet-setup/workspace/switch-workspace.png new file mode 100644 index 0000000000..c1f32d1a7c Binary files /dev/null and b/docs/static/img/tooljet-setup/workspace/switch-workspace.png differ diff --git a/docs/static/img/tutorial/manage-users-groups/deleting-custom-group.png b/docs/static/img/tutorial/manage-users-groups/deleting-custom-group.png index 65a6aa504d..687d82a6d9 100644 Binary files a/docs/static/img/tutorial/manage-users-groups/deleting-custom-group.png and b/docs/static/img/tutorial/manage-users-groups/deleting-custom-group.png differ diff --git a/docs/static/img/tutorial/manage-users-groups/duplicate-group.png b/docs/static/img/tutorial/manage-users-groups/duplicate-group.png index 3b47308ae3..70235247a9 100644 Binary files a/docs/static/img/tutorial/manage-users-groups/duplicate-group.png and b/docs/static/img/tutorial/manage-users-groups/duplicate-group.png differ diff --git a/docs/static/img/user-management/authentication/cloud/cloud-workspace.png b/docs/static/img/user-management/authentication/cloud/cloud-workspace.png new file mode 100644 index 0000000000..f0b3d5f297 Binary files /dev/null and b/docs/static/img/user-management/authentication/cloud/cloud-workspace.png differ diff --git a/docs/static/img/user-management/authentication/selfhosted/global.png b/docs/static/img/user-management/authentication/selfhosted/global.png new file mode 100644 index 0000000000..84cf320fd5 Binary files /dev/null and b/docs/static/img/user-management/authentication/selfhosted/global.png differ diff --git a/docs/static/img/user-management/authentication/selfhosted/instance-level.png b/docs/static/img/user-management/authentication/selfhosted/instance-level.png new file mode 100644 index 0000000000..7c908c4d38 Binary files /dev/null and b/docs/static/img/user-management/authentication/selfhosted/instance-level.png differ diff --git a/docs/static/img/user-management/authentication/selfhosted/nexus.png b/docs/static/img/user-management/authentication/selfhosted/nexus.png new file mode 100644 index 0000000000..01e2a59e38 Binary files /dev/null and b/docs/static/img/user-management/authentication/selfhosted/nexus.png differ diff --git a/docs/static/img/user-management/authentication/selfhosted/pixel.png b/docs/static/img/user-management/authentication/selfhosted/pixel.png new file mode 100644 index 0000000000..8ca8794156 Binary files /dev/null and b/docs/static/img/user-management/authentication/selfhosted/pixel.png differ diff --git a/docs/static/img/user-management/authentication/selfhosted/workspace-level.png b/docs/static/img/user-management/authentication/selfhosted/workspace-level.png new file mode 100644 index 0000000000..2c7b2b765d Binary files /dev/null and b/docs/static/img/user-management/authentication/selfhosted/workspace-level.png differ diff --git a/docs/static/img/user-management/group-sync/oidc/mapping.png b/docs/static/img/user-management/group-sync/oidc/mapping.png new file mode 100644 index 0000000000..1ef7ecacc4 Binary files /dev/null and b/docs/static/img/user-management/group-sync/oidc/mapping.png differ diff --git a/docs/static/img/user-management/managing-users/user-management/user-drawer.png b/docs/static/img/user-management/managing-users/user-management/user-drawer.png new file mode 100644 index 0000000000..4bb77a1681 Binary files /dev/null and b/docs/static/img/user-management/managing-users/user-management/user-drawer.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/archive-user-menu.png b/docs/static/img/user-management/onboard-user/archive-user/archive-user-menu.png new file mode 100644 index 0000000000..93532c6a77 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/archive-user-menu.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/archived-user.png b/docs/static/img/user-management/onboard-user/archive-user/archived-user.png new file mode 100644 index 0000000000..40a4228164 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/archived-user.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/sh-archive-user-menu.png b/docs/static/img/user-management/onboard-user/archive-user/sh-archive-user-menu.png new file mode 100644 index 0000000000..72c83005a0 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/sh-archive-user-menu.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/sh-archived-user.png b/docs/static/img/user-management/onboard-user/archive-user/sh-archived-user.png new file mode 100644 index 0000000000..6203b4afa5 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/sh-archived-user.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/sh-unarchive-user-menu.png b/docs/static/img/user-management/onboard-user/archive-user/sh-unarchive-user-menu.png new file mode 100644 index 0000000000..e5ff6e3e13 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/sh-unarchive-user-menu.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/sh-unarchived-user.png b/docs/static/img/user-management/onboard-user/archive-user/sh-unarchived-user.png new file mode 100644 index 0000000000..86c9cee49c Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/sh-unarchived-user.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/unarchive-user-menu.png b/docs/static/img/user-management/onboard-user/archive-user/unarchive-user-menu.png new file mode 100644 index 0000000000..f44a9e2e54 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/unarchive-user-menu.png differ diff --git a/docs/static/img/user-management/onboard-user/archive-user/unarchived-user.png b/docs/static/img/user-management/onboard-user/archive-user/unarchived-user.png new file mode 100644 index 0000000000..da607b34d1 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/archive-user/unarchived-user.png differ diff --git a/docs/static/img/user-management/onboard-user/bulk-invite/upload-csv.png b/docs/static/img/user-management/onboard-user/bulk-invite/upload-csv.png new file mode 100644 index 0000000000..9ed511db3d Binary files /dev/null and b/docs/static/img/user-management/onboard-user/bulk-invite/upload-csv.png differ diff --git a/docs/static/img/user-management/onboard-user/bulk-invite/uploaded-users.png b/docs/static/img/user-management/onboard-user/bulk-invite/uploaded-users.png new file mode 100644 index 0000000000..1c76b0cbc2 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/bulk-invite/uploaded-users.png differ diff --git a/docs/static/img/user-management/onboard-user/invite-user/add-user.png b/docs/static/img/user-management/onboard-user/invite-user/add-user.png new file mode 100644 index 0000000000..8dfca99d7e Binary files /dev/null and b/docs/static/img/user-management/onboard-user/invite-user/add-user.png differ diff --git a/docs/static/img/user-management/onboard-user/invite-user/copy-link.png b/docs/static/img/user-management/onboard-user/invite-user/copy-link.png new file mode 100644 index 0000000000..78b730eee3 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/invite-user/copy-link.png differ diff --git a/docs/static/img/user-management/onboard-user/invite-user/email.png b/docs/static/img/user-management/onboard-user/invite-user/email.png new file mode 100644 index 0000000000..f5c29bfc9f Binary files /dev/null and b/docs/static/img/user-management/onboard-user/invite-user/email.png differ diff --git a/docs/static/img/user-management/onboard-user/invite-user/user-details.png b/docs/static/img/user-management/onboard-user/invite-user/user-details.png new file mode 100644 index 0000000000..9b363fb0bf Binary files /dev/null and b/docs/static/img/user-management/onboard-user/invite-user/user-details.png differ diff --git a/docs/static/img/user-management/onboard-user/invite-user/user-status.png b/docs/static/img/user-management/onboard-user/invite-user/user-status.png new file mode 100644 index 0000000000..4ff4a1ddbd Binary files /dev/null and b/docs/static/img/user-management/onboard-user/invite-user/user-status.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/allowed-domain.png b/docs/static/img/user-management/onboard-user/self-signup/allowed-domain.png new file mode 100644 index 0000000000..2369579c54 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/allowed-domain.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/enable-signup.png b/docs/static/img/user-management/onboard-user/self-signup/enable-signup.png new file mode 100644 index 0000000000..ad58985939 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/enable-signup.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/instance-signup.png b/docs/static/img/user-management/onboard-user/self-signup/instance-signup.png new file mode 100644 index 0000000000..72ca55f558 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/instance-signup.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/login-page.png b/docs/static/img/user-management/onboard-user/self-signup/login-page.png new file mode 100644 index 0000000000..438a8f7fd8 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/login-page.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/login-url.png b/docs/static/img/user-management/onboard-user/self-signup/login-url.png new file mode 100644 index 0000000000..8ae29cd3a2 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/login-url.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/personal-ws.png b/docs/static/img/user-management/onboard-user/self-signup/personal-ws.png new file mode 100644 index 0000000000..d09abced46 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/personal-ws.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/sh-allowed-domain.png b/docs/static/img/user-management/onboard-user/self-signup/sh-allowed-domain.png new file mode 100644 index 0000000000..8f0221470a Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/sh-allowed-domain.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/sh-enable-signup.png b/docs/static/img/user-management/onboard-user/self-signup/sh-enable-signup.png new file mode 100644 index 0000000000..cbb6e8fac2 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/sh-enable-signup.png differ diff --git a/docs/static/img/user-management/onboard-user/self-signup/signup-page.png b/docs/static/img/user-management/onboard-user/self-signup/signup-page.png new file mode 100644 index 0000000000..e899aadc93 Binary files /dev/null and b/docs/static/img/user-management/onboard-user/self-signup/signup-page.png differ diff --git a/docs/static/img/user-management/profile-management/metadata.png b/docs/static/img/user-management/profile-management/metadata.png new file mode 100644 index 0000000000..5d7195610f Binary files /dev/null and b/docs/static/img/user-management/profile-management/metadata.png differ diff --git a/docs/static/img/user-management/profile-management/profile-settings/settings.png b/docs/static/img/user-management/profile-management/profile-settings/settings.png new file mode 100644 index 0000000000..de451b646f Binary files /dev/null and b/docs/static/img/user-management/profile-management/profile-settings/settings.png differ diff --git a/docs/static/img/user-management/profile-management/reset-password/auto-password.png b/docs/static/img/user-management/profile-management/reset-password/auto-password.png new file mode 100644 index 0000000000..00e37fd6e7 Binary files /dev/null and b/docs/static/img/user-management/profile-management/reset-password/auto-password.png differ diff --git a/docs/static/img/user-management/profile-management/reset-password/forget-password.png b/docs/static/img/user-management/profile-management/reset-password/forget-password.png new file mode 100644 index 0000000000..aea00d8171 Binary files /dev/null and b/docs/static/img/user-management/profile-management/reset-password/forget-password.png differ diff --git a/docs/static/img/user-management/profile-management/reset-password/mail.png b/docs/static/img/user-management/profile-management/reset-password/mail.png new file mode 100644 index 0000000000..59e4be7650 Binary files /dev/null and b/docs/static/img/user-management/profile-management/reset-password/mail.png differ diff --git a/docs/static/img/user-management/profile-management/reset-password/super-admin-reset.png b/docs/static/img/user-management/profile-management/reset-password/super-admin-reset.png new file mode 100644 index 0000000000..43b930394e Binary files /dev/null and b/docs/static/img/user-management/profile-management/reset-password/super-admin-reset.png differ diff --git a/docs/static/img/user-management/profile-management/user-details.png b/docs/static/img/user-management/profile-management/user-details.png new file mode 100644 index 0000000000..1086b56445 Binary files /dev/null and b/docs/static/img/user-management/profile-management/user-details.png differ diff --git a/docs/static/img/user-management/profile-management/user-details/edit-menu.png b/docs/static/img/user-management/profile-management/user-details/edit-menu.png new file mode 100644 index 0000000000..20352c597c Binary files /dev/null and b/docs/static/img/user-management/profile-management/user-details/edit-menu.png differ diff --git a/docs/static/img/user-management/profile-management/user-details/edit-name.png b/docs/static/img/user-management/profile-management/user-details/edit-name.png new file mode 100644 index 0000000000..6373a4c2f5 Binary files /dev/null and b/docs/static/img/user-management/profile-management/user-details/edit-name.png differ diff --git a/docs/static/img/user-management/profile-management/user-details/super-admin-toggle.png b/docs/static/img/user-management/profile-management/user-details/super-admin-toggle.png new file mode 100644 index 0000000000..315ded59ef Binary files /dev/null and b/docs/static/img/user-management/profile-management/user-details/super-admin-toggle.png differ diff --git a/docs/static/img/user-management/profile-management/user-details/update-details.png b/docs/static/img/user-management/profile-management/user-details/update-details.png new file mode 100644 index 0000000000..0b7d3becd4 Binary files /dev/null and b/docs/static/img/user-management/profile-management/user-details/update-details.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 new file mode 100644 index 0000000000..242722a502 Binary files /dev/null and b/docs/static/img/user-management/rbac/access-control/app-permission.png differ diff --git a/docs/static/img/user-management/rbac/access-control/apps.png b/docs/static/img/user-management/rbac/access-control/apps.png new file mode 100644 index 0000000000..a17d8406f7 Binary files /dev/null and b/docs/static/img/user-management/rbac/access-control/apps.png differ diff --git a/docs/static/img/user-management/rbac/access-control/ds-permission.png b/docs/static/img/user-management/rbac/access-control/ds-permission.png new file mode 100644 index 0000000000..4768d05586 Binary files /dev/null and b/docs/static/img/user-management/rbac/access-control/ds-permission.png differ diff --git a/docs/static/img/user-management/rbac/access-control/select-permission.png b/docs/static/img/user-management/rbac/access-control/select-permission.png new file mode 100644 index 0000000000..2f6d17a158 Binary files /dev/null and b/docs/static/img/user-management/rbac/access-control/select-permission.png differ diff --git a/docs/static/img/user-management/rbac/access-control/select-resource.png b/docs/static/img/user-management/rbac/access-control/select-resource.png new file mode 100644 index 0000000000..fbbbfa1cba Binary files /dev/null and b/docs/static/img/user-management/rbac/access-control/select-resource.png differ diff --git a/docs/static/img/user-management/rbac/custom-group/new-group.png b/docs/static/img/user-management/rbac/custom-group/new-group.png new file mode 100644 index 0000000000..2ac47fa9e1 Binary files /dev/null and b/docs/static/img/user-management/rbac/custom-group/new-group.png differ diff --git a/docs/static/img/user-management/rbac/user-roles/edit-user-menu.png b/docs/static/img/user-management/rbac/user-roles/edit-user-menu.png new file mode 100644 index 0000000000..c5bd85a4cf Binary files /dev/null and b/docs/static/img/user-management/rbac/user-roles/edit-user-menu.png differ diff --git a/docs/static/img/user-management/rbac/user-roles/update-user-role.png b/docs/static/img/user-management/rbac/user-roles/update-user-role.png new file mode 100644 index 0000000000..2db59f52cc Binary files /dev/null and b/docs/static/img/user-management/rbac/user-roles/update-user-role.png differ diff --git a/docs/static/img/user-management/rbac/user-roles/updated-role.png b/docs/static/img/user-management/rbac/user-roles/updated-role.png new file mode 100644 index 0000000000..90df07b105 Binary files /dev/null and b/docs/static/img/user-management/rbac/user-roles/updated-role.png differ diff --git a/docs/static/img/user-management/rbac/user-roles/warning.png b/docs/static/img/user-management/rbac/user-roles/warning.png new file mode 100644 index 0000000000..96b6a8d9fc Binary files /dev/null and b/docs/static/img/user-management/rbac/user-roles/warning.png differ diff --git a/docs/static/img/user-management/sso/github/config-github.png b/docs/static/img/user-management/sso/github/config-github.png new file mode 100644 index 0000000000..0ad6cf835b Binary files /dev/null and b/docs/static/img/user-management/sso/github/config-github.png differ diff --git a/docs/static/img/user-management/sso/github/github-clientid.png b/docs/static/img/user-management/sso/github/github-clientid.png new file mode 100644 index 0000000000..b970d5b064 Binary files /dev/null and b/docs/static/img/user-management/sso/github/github-clientid.png differ diff --git a/docs/static/img/user-management/sso/github/github-modal.png b/docs/static/img/user-management/sso/github/github-modal.png new file mode 100644 index 0000000000..de01ff14de Binary files /dev/null and b/docs/static/img/user-management/sso/github/github-modal.png differ diff --git a/docs/static/img/user-management/sso/github/oauth-app.png b/docs/static/img/user-management/sso/github/oauth-app.png new file mode 100644 index 0000000000..e5febd64fc Binary files /dev/null and b/docs/static/img/user-management/sso/github/oauth-app.png differ diff --git a/docs/static/img/user-management/sso/github/oauth-config.png b/docs/static/img/user-management/sso/github/oauth-config.png new file mode 100644 index 0000000000..3f643fbb5a Binary files /dev/null and b/docs/static/img/user-management/sso/github/oauth-config.png differ diff --git a/docs/static/img/user-management/sso/github/sso-menu.png b/docs/static/img/user-management/sso/github/sso-menu.png new file mode 100644 index 0000000000..b497110757 Binary files /dev/null and b/docs/static/img/user-management/sso/github/sso-menu.png differ diff --git a/docs/static/img/user-management/sso/google/client-id.png b/docs/static/img/user-management/sso/google/client-id.png new file mode 100644 index 0000000000..f71dabf262 Binary files /dev/null and b/docs/static/img/user-management/sso/google/client-id.png differ diff --git a/docs/static/img/user-management/sso/google/create-oauth.png b/docs/static/img/user-management/sso/google/create-oauth.png new file mode 100644 index 0000000000..1f4013b894 Binary files /dev/null and b/docs/static/img/user-management/sso/google/create-oauth.png differ diff --git a/docs/static/img/user-management/sso/google/gc-new-project.png b/docs/static/img/user-management/sso/google/gc-new-project.png new file mode 100644 index 0000000000..8bd266c689 Binary files /dev/null and b/docs/static/img/user-management/sso/google/gc-new-project.png differ diff --git a/docs/static/img/user-management/sso/google/gc-uri.png b/docs/static/img/user-management/sso/google/gc-uri.png new file mode 100644 index 0000000000..25dd54010d Binary files /dev/null and b/docs/static/img/user-management/sso/google/gc-uri.png differ diff --git a/docs/static/img/user-management/sso/google/google-modal.png b/docs/static/img/user-management/sso/google/google-modal.png new file mode 100644 index 0000000000..3f47f80cc7 Binary files /dev/null and b/docs/static/img/user-management/sso/google/google-modal.png differ diff --git a/docs/static/img/user-management/sso/google/oauth-type.png b/docs/static/img/user-management/sso/google/oauth-type.png new file mode 100644 index 0000000000..64c0108f3a Binary files /dev/null and b/docs/static/img/user-management/sso/google/oauth-type.png differ diff --git a/docs/static/img/user-management/sso/google/scope.png b/docs/static/img/user-management/sso/google/scope.png new file mode 100644 index 0000000000..b55a7a55de Binary files /dev/null and b/docs/static/img/user-management/sso/google/scope.png differ diff --git a/docs/static/img/user-management/sso/google/sso-menu.png b/docs/static/img/user-management/sso/google/sso-menu.png new file mode 100644 index 0000000000..3503ac7211 Binary files /dev/null and b/docs/static/img/user-management/sso/google/sso-menu.png differ diff --git a/docs/static/img/user-management/sso/google/tooljet-config.png b/docs/static/img/user-management/sso/google/tooljet-config.png new file mode 100644 index 0000000000..5071727f49 Binary files /dev/null and b/docs/static/img/user-management/sso/google/tooljet-config.png differ diff --git a/docs/static/img/user-management/sso/oidc/config.png b/docs/static/img/user-management/sso/oidc/config.png new file mode 100644 index 0000000000..22d676d07e Binary files /dev/null and b/docs/static/img/user-management/sso/oidc/config.png differ diff --git a/docs/static/img/user-management/sso/oidc/okta/app-type.png b/docs/static/img/user-management/sso/oidc/okta/app-type.png new file mode 100644 index 0000000000..00f37f1aec Binary files /dev/null and b/docs/static/img/user-management/sso/oidc/okta/app-type.png differ diff --git a/docs/static/img/user-management/sso/oidc/okta/client-cred.png b/docs/static/img/user-management/sso/oidc/okta/client-cred.png new file mode 100644 index 0000000000..68ea66b2c6 Binary files /dev/null and b/docs/static/img/user-management/sso/oidc/okta/client-cred.png differ diff --git a/docs/static/img/user-management/sso/oidc/okta/create-app.png b/docs/static/img/user-management/sso/oidc/okta/create-app.png new file mode 100644 index 0000000000..43c2bd19e1 Binary files /dev/null and b/docs/static/img/user-management/sso/oidc/okta/create-app.png differ diff --git a/docs/static/img/user-management/sso/oidc/okta/redirect.png b/docs/static/img/user-management/sso/oidc/okta/redirect.png new file mode 100644 index 0000000000..13d16625c6 Binary files /dev/null and b/docs/static/img/user-management/sso/oidc/okta/redirect.png differ diff --git a/docs/static/img/user-management/sso/oidc/sso-menu.png b/docs/static/img/user-management/sso/oidc/sso-menu.png new file mode 100644 index 0000000000..79b229a1d3 Binary files /dev/null and b/docs/static/img/user-management/sso/oidc/sso-menu.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-configuration.png b/docs/static/img/user-management/sso/saml/okta-configuration.png new file mode 100644 index 0000000000..9a64bb2265 Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-configuration.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-configure-saml-attribute.png b/docs/static/img/user-management/sso/saml/okta-configure-saml-attribute.png new file mode 100644 index 0000000000..fdad931afd Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-configure-saml-attribute.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-configure-saml-general.png b/docs/static/img/user-management/sso/saml/okta-configure-saml-general.png new file mode 100644 index 0000000000..60a49e82b1 Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-configure-saml-general.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-create-app-integration.png b/docs/static/img/user-management/sso/saml/okta-create-app-integration.png new file mode 100644 index 0000000000..19006b43e6 Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-create-app-integration.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-general-settings.png b/docs/static/img/user-management/sso/saml/okta-general-settings.png new file mode 100644 index 0000000000..4af4b49fcf Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-general-settings.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-grp-attribute.png b/docs/static/img/user-management/sso/saml/okta-grp-attribute.png new file mode 100644 index 0000000000..3f23e4f0ba Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-grp-attribute.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-sign-on.png b/docs/static/img/user-management/sso/saml/okta-sign-on.png new file mode 100644 index 0000000000..ac7822d2ef Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-sign-on.png differ diff --git a/docs/static/img/user-management/sso/saml/okta-tj-login.png b/docs/static/img/user-management/sso/saml/okta-tj-login.png new file mode 100644 index 0000000000..5b911d1b3c Binary files /dev/null and b/docs/static/img/user-management/sso/saml/okta-tj-login.png differ diff --git a/docs/static/img/user-management/sso/saml/signin-method.png b/docs/static/img/user-management/sso/saml/signin-method.png new file mode 100644 index 0000000000..1eebcce99b Binary files /dev/null and b/docs/static/img/user-management/sso/saml/signin-method.png differ diff --git a/docs/static/img/v2-beta/database/newui/flat_json.png b/docs/static/img/v2-beta/database/newui/flat_json.png new file mode 100644 index 0000000000..1909f676f3 Binary files /dev/null and b/docs/static/img/v2-beta/database/newui/flat_json.png differ diff --git a/docs/static/img/v2-beta/database/newui/nested_json_gui.png b/docs/static/img/v2-beta/database/newui/nested_json_gui.png new file mode 100644 index 0000000000..9aedd81bc4 Binary files /dev/null and b/docs/static/img/v2-beta/database/newui/nested_json_gui.png differ diff --git a/docs/static/img/v2-beta/database/ux2/clear-all.png b/docs/static/img/v2-beta/database/ux2/clear-all.png new file mode 100644 index 0000000000..0bd539f882 Binary files /dev/null and b/docs/static/img/v2-beta/database/ux2/clear-all.png differ diff --git a/docs/static/img/v2-beta/database/ux2/datatypes-v4.png b/docs/static/img/v2-beta/database/ux2/datatypes-v4.png new file mode 100644 index 0000000000..68ccf888b9 Binary files /dev/null and b/docs/static/img/v2-beta/database/ux2/datatypes-v4.png differ diff --git a/docs/static/img/widgets/chat/component-eh.png b/docs/static/img/widgets/chat/component-eh.png new file mode 100644 index 0000000000..4a940b5604 Binary files /dev/null and b/docs/static/img/widgets/chat/component-eh.png differ diff --git a/docs/static/img/widgets/chat/component.png b/docs/static/img/widgets/chat/component.png new file mode 100644 index 0000000000..3666bd4680 Binary files /dev/null and b/docs/static/img/widgets/chat/component.png differ diff --git a/docs/static/img/widgets/chat/final-bot.png b/docs/static/img/widgets/chat/final-bot.png new file mode 100644 index 0000000000..547a2ad80e Binary files /dev/null and b/docs/static/img/widgets/chat/final-bot.png differ diff --git a/docs/static/img/widgets/chat/query-eh.png b/docs/static/img/widgets/chat/query-eh.png new file mode 100644 index 0000000000..8a8e33b6ad Binary files /dev/null and b/docs/static/img/widgets/chat/query-eh.png differ diff --git a/docs/static/img/widgets/chat/query.png b/docs/static/img/widgets/chat/query.png new file mode 100644 index 0000000000..a25bd620c5 Binary files /dev/null and b/docs/static/img/widgets/chat/query.png differ diff --git a/docs/static/img/widgets/chat/response-loading.png b/docs/static/img/widgets/chat/response-loading.png new file mode 100644 index 0000000000..cf72242420 Binary files /dev/null and b/docs/static/img/widgets/chat/response-loading.png differ diff --git a/docs/static/img/widgets/chat/set-component.png b/docs/static/img/widgets/chat/set-component.png new file mode 100644 index 0000000000..a146dd6c0c Binary files /dev/null and b/docs/static/img/widgets/chat/set-component.png differ diff --git a/docs/static/img/widgets/table/serverside-operations/sort-query.png b/docs/static/img/widgets/table/serverside-operations/sort-query.png index a2c5db8014..4b73250297 100644 Binary files a/docs/static/img/widgets/table/serverside-operations/sort-query.png and b/docs/static/img/widgets/table/serverside-operations/sort-query.png differ diff --git a/docs/static/img/workflows/scheduler/cron-job.png b/docs/static/img/workflows/scheduler/cron-job.png new file mode 100644 index 0000000000..e2b28c6ead Binary files /dev/null and b/docs/static/img/workflows/scheduler/cron-job.png differ diff --git a/docs/static/img/workflows/scheduler/interval-mode.png b/docs/static/img/workflows/scheduler/interval-mode.png new file mode 100644 index 0000000000..47dae2b89b Binary files /dev/null and b/docs/static/img/workflows/scheduler/interval-mode.png differ diff --git a/docs/static/img/workflows/trigger-from-app/app-section.png b/docs/static/img/workflows/trigger-from-app/app-section.png new file mode 100644 index 0000000000..e84b4fbccd Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/app-section.png differ diff --git a/docs/static/img/workflows/trigger-from-app/app.png b/docs/static/img/workflows/trigger-from-app/app.png new file mode 100644 index 0000000000..531e1c3be6 Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/app.png differ diff --git a/docs/static/img/workflows/trigger-from-app/configure-wf.png b/docs/static/img/workflows/trigger-from-app/configure-wf.png new file mode 100644 index 0000000000..64a1c592ed Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/configure-wf.png differ diff --git a/docs/static/img/workflows/trigger-from-app/new-app.png b/docs/static/img/workflows/trigger-from-app/new-app.png new file mode 100644 index 0000000000..dcea1711c3 Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/new-app.png differ diff --git a/docs/static/img/workflows/trigger-from-app/new-wf.png b/docs/static/img/workflows/trigger-from-app/new-wf.png new file mode 100644 index 0000000000..7b3bf1125e Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/new-wf.png differ diff --git a/docs/static/img/workflows/trigger-from-app/run-wf.png b/docs/static/img/workflows/trigger-from-app/run-wf.png new file mode 100644 index 0000000000..90c22dcbce Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/run-wf.png differ diff --git a/docs/static/img/workflows/trigger-from-app/wf-eh.png b/docs/static/img/workflows/trigger-from-app/wf-eh.png new file mode 100644 index 0000000000..b23594f319 Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/wf-eh.png differ diff --git a/docs/static/img/workflows/trigger-from-app/wf-query.png b/docs/static/img/workflows/trigger-from-app/wf-query.png new file mode 100644 index 0000000000..fbf1190d71 Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/wf-query.png differ diff --git a/docs/static/img/workflows/trigger-from-app/workflow-section.png b/docs/static/img/workflows/trigger-from-app/workflow-section.png new file mode 100644 index 0000000000..f657250f8d Binary files /dev/null and b/docs/static/img/workflows/trigger-from-app/workflow-section.png differ diff --git a/docs/static/img/workflows/trigger-schedule/activate-cron-schedule.png b/docs/static/img/workflows/trigger-schedule/activate-cron-schedule.png new file mode 100644 index 0000000000..b2eb5d7ab7 Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/activate-cron-schedule.png differ diff --git a/docs/static/img/workflows/trigger-schedule/activate-schedule.png b/docs/static/img/workflows/trigger-schedule/activate-schedule.png new file mode 100644 index 0000000000..70e9fd4432 Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/activate-schedule.png differ diff --git a/docs/static/img/workflows/trigger-schedule/create-schedule.png b/docs/static/img/workflows/trigger-schedule/create-schedule.png new file mode 100644 index 0000000000..cd53c026dd Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/create-schedule.png differ diff --git a/docs/static/img/workflows/trigger-schedule/create-workflow.png b/docs/static/img/workflows/trigger-schedule/create-workflow.png new file mode 100644 index 0000000000..80c704412b Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/create-workflow.png differ diff --git a/docs/static/img/workflows/trigger-schedule/cron-schedule.png b/docs/static/img/workflows/trigger-schedule/cron-schedule.png new file mode 100644 index 0000000000..6350bf4f16 Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/cron-schedule.png differ diff --git a/docs/static/img/workflows/trigger-schedule/cron.png b/docs/static/img/workflows/trigger-schedule/cron.png new file mode 100644 index 0000000000..d33ba486ee Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/cron.png differ diff --git a/docs/static/img/workflows/trigger-schedule/interval.png b/docs/static/img/workflows/trigger-schedule/interval.png new file mode 100644 index 0000000000..17b9bad418 Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/interval.png differ diff --git a/docs/static/img/workflows/trigger-schedule/left-panel.png b/docs/static/img/workflows/trigger-schedule/left-panel.png new file mode 100644 index 0000000000..2eadd1079c Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/left-panel.png differ diff --git a/docs/static/img/workflows/trigger-schedule/new-schedule.png b/docs/static/img/workflows/trigger-schedule/new-schedule.png new file mode 100644 index 0000000000..b400330b43 Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/new-schedule.png differ diff --git a/docs/static/img/workflows/trigger-schedule/saved-cron-schedule.png b/docs/static/img/workflows/trigger-schedule/saved-cron-schedule.png new file mode 100644 index 0000000000..c89f6464d3 Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/saved-cron-schedule.png differ diff --git a/docs/static/img/workflows/trigger-schedule/set-interval.png b/docs/static/img/workflows/trigger-schedule/set-interval.png new file mode 100644 index 0000000000..2ced0c21de Binary files /dev/null and b/docs/static/img/workflows/trigger-schedule/set-interval.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/api-token.png b/docs/static/img/workflows/trigger-using-webhook/api-token.png new file mode 100644 index 0000000000..a81be03cf5 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/api-token.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/configure-wf.png b/docs/static/img/workflows/trigger-using-webhook/configure-wf.png new file mode 100644 index 0000000000..2aaa24b130 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/configure-wf.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/copy-url.png b/docs/static/img/workflows/trigger-using-webhook/copy-url.png new file mode 100644 index 0000000000..73b11b43b7 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/copy-url.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/enable-webhook.png b/docs/static/img/workflows/trigger-using-webhook/enable-webhook.png new file mode 100644 index 0000000000..798980cd40 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/enable-webhook.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/new-wf.png b/docs/static/img/workflows/trigger-using-webhook/new-wf.png new file mode 100644 index 0000000000..9947d59c54 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/new-wf.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/parameters-postman.png b/docs/static/img/workflows/trigger-using-webhook/parameters-postman.png new file mode 100644 index 0000000000..4e8091876b Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/parameters-postman.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/parameters.png b/docs/static/img/workflows/trigger-using-webhook/parameters.png new file mode 100644 index 0000000000..3ae7081034 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/parameters.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/postman-url.png b/docs/static/img/workflows/trigger-using-webhook/postman-url.png new file mode 100644 index 0000000000..f890d489fa Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/postman-url.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/postman.png b/docs/static/img/workflows/trigger-using-webhook/postman.png new file mode 100644 index 0000000000..f8320c5920 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/postman.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/response.png b/docs/static/img/workflows/trigger-using-webhook/response.png new file mode 100644 index 0000000000..31a1913b32 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/response.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/trigger-section.png b/docs/static/img/workflows/trigger-using-webhook/trigger-section.png new file mode 100644 index 0000000000..a5218a3d52 Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/trigger-section.png differ diff --git a/docs/static/img/workflows/trigger-using-webhook/workflow-section.png b/docs/static/img/workflows/trigger-using-webhook/workflow-section.png new file mode 100644 index 0000000000..f657250f8d Binary files /dev/null and b/docs/static/img/workflows/trigger-using-webhook/workflow-section.png differ diff --git a/docs/static/img/workspace-const/const-mapping.png b/docs/static/img/workspace-const/const-mapping.png new file mode 100644 index 0000000000..59325ad541 Binary files /dev/null and b/docs/static/img/workspace-const/const-mapping.png differ diff --git a/docs/tailwind.config.js b/docs/tailwind.config.js new file mode 100644 index 0000000000..a456ec5fb6 --- /dev/null +++ b/docs/tailwind.config.js @@ -0,0 +1,16 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: [ + "./versioned_docs/version-2.50.0-LTS/doc-home-page.mdx", + "./versioned_docs/version-3.0.0-LTS/doc-home-page.mdx", + "./docs/doc-home-page.mdx", + ], + darkMode: ['class', '[data-theme="dark"]'], + theme: { + extend: {}, + }, + plugins: [], + corePlugins: { + preflight: false, // This prevents Tailwind from resetting global styles + }, +} \ No newline at end of file diff --git a/docs/versioned_docs/version-1.x.x/data-sources/appwrite.md b/docs/versioned_docs/version-1.x.x/data-sources/appwrite.md index d3c7b42d41..e26f3869a4 100644 --- a/docs/versioned_docs/version-1.x.x/data-sources/appwrite.md +++ b/docs/versioned_docs/version-1.x.x/data-sources/appwrite.md @@ -43,7 +43,7 @@ Query results can be transformed using Transformations. Read our **Transformatio 1. **[List documents](#list-documents)** 2. **[Get document](#get-document)** -3. **[Create document](#create-document)** +3. **[Create document](#add-document-to-collection)** 4. **[Update document](#update-document)** 5. **[Delete document](#delete-document)** 6. **[Bulk update using document id](#bulk-update-using-document-id)** diff --git a/docs/versioned_docs/version-1.x.x/data-sources/bigquery.md b/docs/versioned_docs/version-1.x.x/data-sources/bigquery.md index e3e29b8d4c..4cbd4dd27b 100644 --- a/docs/versioned_docs/version-1.x.x/data-sources/bigquery.md +++ b/docs/versioned_docs/version-1.x.x/data-sources/bigquery.md @@ -58,7 +58,7 @@ Query results can be transformed using transformations. Read our transformations ## Supported operations -- [List Datasets](#list-datatsets) +- [List Datasets](#list-datasets) - [List Tables](#list-tables) diff --git a/docs/versioned_docs/version-1.x.x/data-sources/google.sheets.md b/docs/versioned_docs/version-1.x.x/data-sources/google.sheets.md index 2f8edae304..db2acf7e10 100644 --- a/docs/versioned_docs/version-1.x.x/data-sources/google.sheets.md +++ b/docs/versioned_docs/version-1.x.x/data-sources/google.sheets.md @@ -36,11 +36,11 @@ You can create a Google Sheets data source with one of either of the two permiss Using Google sheets data source you can perform several operations from your applications like: - 1. **[Read data from a sheet](/docs/data-sources/google.sheets#read-data-from-a-sheet)** - 2. **[Append data to a sheet](/docs/data-sources/google.sheets#append-data-to-a-sheet)** - 3. **[Update single row of a sheet](/docs/data-sources/google.sheets#update-single-row-of-a-sheet)** - 4. **[Delete row from a sheet](/docs/data-sources/google.sheets#delete-row-from-a-sheet)** - 5. **[Get spreadsheet info](/docs/data-sources/google.sheets#get-spreadsheet-info)** + 1. **[Read data from a sheet](#read-data-from-a-sheet)** + 2. **[Append data to a sheet](#append-data-to-a-sheet)** + 3. **[Update single row of a sheet](#update-single-row-of-a-sheet)** + 4. **[Delete row from a sheet](#delete-row-from-a-sheet)** + 5. **[Get spreadsheet info](#get-spreadsheet-info)** ### Read data from a sheet diff --git a/docs/versioned_docs/version-1.x.x/widgets/kanban-board.md b/docs/versioned_docs/version-1.x.x/widgets/kanban-board.md index 5489b4330d..c5cf7b23ab 100644 --- a/docs/versioned_docs/version-1.x.x/widgets/kanban-board.md +++ b/docs/versioned_docs/version-1.x.x/widgets/kanban-board.md @@ -17,11 +17,11 @@ Kanban widget allows you to visually organize and prioritize your tasks with a t To add an event, click on the widget handle to open the widget properties on the right sidebar. Go to the **Events** section and click on **Add handler**. -- **[Card added](#card-added)** -- **[Card removed](#card-removed)** -- **[Card moved](#card-moved)** -- **[Card selected](#card-selected)** -- **[Card updated](#card-updated)** +- **Card added** +- **Card removed** +- **Card moved** +- **Card selected** +- **Card updated** Just like any other event on ToolJet, you can set multiple handlers for any of the above mentioned events. diff --git a/docs/versioned_docs/version-2.0.0/setup/env-vars.md b/docs/versioned_docs/version-2.0.0/setup/env-vars.md index aef0a178ef..00a975ebe2 100644 --- a/docs/versioned_docs/version-2.0.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.0.0/setup/env-vars.md @@ -285,9 +285,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.0.0/setup/heroku.md b/docs/versioned_docs/version-2.0.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.0.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.0.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.0.0/tooljet_database.md b/docs/versioned_docs/version-2.0.0/tooljet_database.md index f01bca7d59..b743a3e601 100644 --- a/docs/versioned_docs/version-2.0.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.0.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars/#enab 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.1.0/setup/env-vars.md b/docs/versioned_docs/version-2.1.0/setup/env-vars.md index aef0a178ef..00a975ebe2 100644 --- a/docs/versioned_docs/version-2.1.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.1.0/setup/env-vars.md @@ -285,9 +285,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.1.0/setup/heroku.md b/docs/versioned_docs/version-2.1.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.1.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.1.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.1.0/tooljet_database.md b/docs/versioned_docs/version-2.1.0/tooljet_database.md index f01bca7d59..b743a3e601 100644 --- a/docs/versioned_docs/version-2.1.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.1.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars/#enab 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.10.0/setup/env-vars.md b/docs/versioned_docs/version-2.10.0/setup/env-vars.md index d1f15113f2..151ac8143a 100644 --- a/docs/versioned_docs/version-2.10.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.10.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.10.0/setup/heroku.md b/docs/versioned_docs/version-2.10.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.10.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.10.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.10.0/tooljet_database.md b/docs/versioned_docs/version-2.10.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.10.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.10.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.11.0/setup/env-vars.md b/docs/versioned_docs/version-2.11.0/setup/env-vars.md index d1f15113f2..151ac8143a 100644 --- a/docs/versioned_docs/version-2.11.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.11.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.11.0/setup/heroku.md b/docs/versioned_docs/version-2.11.0/setup/heroku.md index 4a2636907a..f01fbde75a 100644 --- a/docs/versioned_docs/version-2.11.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.11.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.11.0/tooljet_database.md b/docs/versioned_docs/version-2.11.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.11.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.11.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.12.0/setup/env-vars.md b/docs/versioned_docs/version-2.12.0/setup/env-vars.md index d1f15113f2..151ac8143a 100644 --- a/docs/versioned_docs/version-2.12.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.12.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.12.0/setup/heroku.md b/docs/versioned_docs/version-2.12.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.12.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.12.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.12.0/tooljet_database.md b/docs/versioned_docs/version-2.12.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.12.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.12.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.13.0/setup/env-vars.md b/docs/versioned_docs/version-2.13.0/setup/env-vars.md index d1f15113f2..151ac8143a 100644 --- a/docs/versioned_docs/version-2.13.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.13.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.13.0/setup/heroku.md b/docs/versioned_docs/version-2.13.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.13.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.13.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.13.0/tooljet_database.md b/docs/versioned_docs/version-2.13.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.13.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.13.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.14.0/setup/env-vars.md b/docs/versioned_docs/version-2.14.0/setup/env-vars.md index d1f15113f2..151ac8143a 100644 --- a/docs/versioned_docs/version-2.14.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.14.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.14.0/setup/heroku.md b/docs/versioned_docs/version-2.14.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.14.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.14.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.14.0/tooljet_database.md b/docs/versioned_docs/version-2.14.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.14.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.14.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.15.0/setup/env-vars.md b/docs/versioned_docs/version-2.15.0/setup/env-vars.md index 0299608bff..8506ce5cce 100644 --- a/docs/versioned_docs/version-2.15.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.15.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.15.0/tooljet_database.md b/docs/versioned_docs/version-2.15.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.15.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.15.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.16.0/setup/env-vars.md b/docs/versioned_docs/version-2.16.0/setup/env-vars.md index 0299608bff..8506ce5cce 100644 --- a/docs/versioned_docs/version-2.16.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.16.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.16.0/tooljet_database.md b/docs/versioned_docs/version-2.16.0/tooljet_database.md index 287f45257e..567d3efec6 100644 --- a/docs/versioned_docs/version-2.16.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.16.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.17.0/setup/env-vars.md b/docs/versioned_docs/version-2.17.0/setup/env-vars.md index 0299608bff..8506ce5cce 100644 --- a/docs/versioned_docs/version-2.17.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.17.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.17.0/tooljet_database.md b/docs/versioned_docs/version-2.17.0/tooljet_database.md index 287f45257e..567d3efec6 100644 --- a/docs/versioned_docs/version-2.17.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.17.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.18.0/setup/env-vars.md b/docs/versioned_docs/version-2.18.0/setup/env-vars.md index 18f69d14e5..c05378aea4 100644 --- a/docs/versioned_docs/version-2.18.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.18.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.18.0/tooljet_database.md b/docs/versioned_docs/version-2.18.0/tooljet_database.md index 287f45257e..567d3efec6 100644 --- a/docs/versioned_docs/version-2.18.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.18.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.19.0/setup/env-vars.md b/docs/versioned_docs/version-2.19.0/setup/env-vars.md index 18f69d14e5..c05378aea4 100644 --- a/docs/versioned_docs/version-2.19.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.19.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.19.0/tooljet_database.md b/docs/versioned_docs/version-2.19.0/tooljet_database.md index 3be2c78d43..ecc3144915 100644 --- a/docs/versioned_docs/version-2.19.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.19.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.2.0/setup/env-vars.md b/docs/versioned_docs/version-2.2.0/setup/env-vars.md index ede5e62727..7a5b33dee9 100644 --- a/docs/versioned_docs/version-2.2.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.2.0/setup/env-vars.md @@ -293,9 +293,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.2.0/setup/heroku.md b/docs/versioned_docs/version-2.2.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.2.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.2.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.2.0/tooljet_database.md b/docs/versioned_docs/version-2.2.0/tooljet_database.md index 274c202c13..8e7bee4976 100644 --- a/docs/versioned_docs/version-2.2.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.2.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars/#enab 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.22.0/setup/env-vars.md b/docs/versioned_docs/version-2.22.0/setup/env-vars.md index 18f69d14e5..c05378aea4 100644 --- a/docs/versioned_docs/version-2.22.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.22.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.22.0/tooljet_database.md b/docs/versioned_docs/version-2.22.0/tooljet_database.md index 3be2c78d43..ecc3144915 100644 --- a/docs/versioned_docs/version-2.22.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.22.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.23.0/setup/env-vars.md b/docs/versioned_docs/version-2.23.0/setup/env-vars.md index 714b7984c1..12bd16a60e 100644 --- a/docs/versioned_docs/version-2.23.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.23.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.23.0/tooljet_database.md b/docs/versioned_docs/version-2.23.0/tooljet_database.md index 3be2c78d43..ecc3144915 100644 --- a/docs/versioned_docs/version-2.23.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.23.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.24.0/setup/env-vars.md b/docs/versioned_docs/version-2.24.0/setup/env-vars.md index 030d910da1..efa4475169 100644 --- a/docs/versioned_docs/version-2.24.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.24.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.24.0/tooljet_database.md b/docs/versioned_docs/version-2.24.0/tooljet_database.md index 3be2c78d43..ecc3144915 100644 --- a/docs/versioned_docs/version-2.24.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.24.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.25.0/setup/env-vars.md b/docs/versioned_docs/version-2.25.0/setup/env-vars.md index 030d910da1..efa4475169 100644 --- a/docs/versioned_docs/version-2.25.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.25.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.25.0/tooljet_database.md b/docs/versioned_docs/version-2.25.0/tooljet_database.md index 3be2c78d43..ecc3144915 100644 --- a/docs/versioned_docs/version-2.25.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.25.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.27.0/setup/env-vars.md b/docs/versioned_docs/version-2.27.0/setup/env-vars.md index 030d910da1..efa4475169 100644 --- a/docs/versioned_docs/version-2.27.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.27.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.27.0/tooljet_database.md b/docs/versioned_docs/version-2.27.0/tooljet_database.md index 3be2c78d43..ecc3144915 100644 --- a/docs/versioned_docs/version-2.27.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.27.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.29.0/setup/env-vars.md b/docs/versioned_docs/version-2.29.0/setup/env-vars.md index 030d910da1..efa4475169 100644 --- a/docs/versioned_docs/version-2.29.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.29.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.29.0/tooljet_database.md b/docs/versioned_docs/version-2.29.0/tooljet_database.md index 3be2c78d43..ecc3144915 100644 --- a/docs/versioned_docs/version-2.29.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.29.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.3.0/setup/env-vars.md b/docs/versioned_docs/version-2.3.0/setup/env-vars.md index 5bf5bc6c6b..5a06e21d4e 100644 --- a/docs/versioned_docs/version-2.3.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.3.0/setup/env-vars.md @@ -308,9 +308,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.3.0/setup/heroku.md b/docs/versioned_docs/version-2.3.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.3.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.3.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.3.0/tooljet_database.md b/docs/versioned_docs/version-2.3.0/tooljet_database.md index 274c202c13..8e7bee4976 100644 --- a/docs/versioned_docs/version-2.3.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.3.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars/#enab 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.30.0/setup/env-vars.md b/docs/versioned_docs/version-2.30.0/setup/env-vars.md index 030d910da1..efa4475169 100644 --- a/docs/versioned_docs/version-2.30.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.30.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.30.0/tooljet_database.md b/docs/versioned_docs/version-2.30.0/tooljet_database.md index 0b3e3adcac..cc04f6b284 100644 --- a/docs/versioned_docs/version-2.30.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.30.0/tooljet_database.md @@ -26,9 +26,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.33.0/setup/env-vars.md b/docs/versioned_docs/version-2.33.0/setup/env-vars.md index 4a305bc0c8..e570030a57 100644 --- a/docs/versioned_docs/version-2.33.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.33.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.33.0/tooljet_database.md b/docs/versioned_docs/version-2.33.0/tooljet_database.md index da0b9e71c9..decf3ff278 100644 --- a/docs/versioned_docs/version-2.33.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.33.0/tooljet_database.md @@ -26,9 +26,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.34.0/setup/env-vars.md b/docs/versioned_docs/version-2.34.0/setup/env-vars.md index 282f781c13..436ad94091 100644 --- a/docs/versioned_docs/version-2.34.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.34.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.34.0/tooljet_database.md b/docs/versioned_docs/version-2.34.0/tooljet_database.md index d513bf5692..4d109e66dd 100644 --- a/docs/versioned_docs/version-2.34.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.34.0/tooljet_database.md @@ -26,9 +26,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: |
    Variable
    |
    Description
    | diff --git a/docs/versioned_docs/version-2.35.0/setup/env-vars.md b/docs/versioned_docs/version-2.35.0/setup/env-vars.md index d533105eed..3eae772ff6 100644 --- a/docs/versioned_docs/version-2.35.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.35.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.35.0/tooljet_database.md b/docs/versioned_docs/version-2.35.0/tooljet_database.md index d513bf5692..4d109e66dd 100644 --- a/docs/versioned_docs/version-2.35.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.35.0/tooljet_database.md @@ -26,9 +26,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: |
    Variable
    |
    Description
    | diff --git a/docs/versioned_docs/version-2.36.0/setup/env-vars.md b/docs/versioned_docs/version-2.36.0/setup/env-vars.md index d533105eed..3eae772ff6 100644 --- a/docs/versioned_docs/version-2.36.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.36.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.36.0/tooljet_database.md b/docs/versioned_docs/version-2.36.0/tooljet_database.md index d513bf5692..4d109e66dd 100644 --- a/docs/versioned_docs/version-2.36.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.36.0/tooljet_database.md @@ -26,9 +26,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: |
    Variable
    |
    Description
    | diff --git a/docs/versioned_docs/version-2.39.0/setup/env-vars.md b/docs/versioned_docs/version-2.39.0/setup/env-vars.md index d533105eed..3eae772ff6 100644 --- a/docs/versioned_docs/version-2.39.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.39.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.39.0/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-2.39.0/tooljet-db/tooljet-database.md index a1592008e9..24107ff081 100644 --- a/docs/versioned_docs/version-2.39.0/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-2.39.0/tooljet-db/tooljet-database.md @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: diff --git a/docs/versioned_docs/version-2.4.0/setup/env-vars.md b/docs/versioned_docs/version-2.4.0/setup/env-vars.md index 581afe3c57..aa706b7ebb 100644 --- a/docs/versioned_docs/version-2.4.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.4.0/setup/env-vars.md @@ -308,9 +308,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.4.0/setup/heroku.md b/docs/versioned_docs/version-2.4.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.4.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.4.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.4.0/tooljet_database.md b/docs/versioned_docs/version-2.4.0/tooljet_database.md index 274c202c13..8e7bee4976 100644 --- a/docs/versioned_docs/version-2.4.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.4.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars/#enab 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.43.0/setup/env-vars.md b/docs/versioned_docs/version-2.43.0/setup/env-vars.md index d533105eed..3eae772ff6 100644 --- a/docs/versioned_docs/version-2.43.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.43.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.43.0/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-2.43.0/tooljet-db/tooljet-database.md index 882018aba8..eb7fc9fb4e 100644 --- a/docs/versioned_docs/version-2.43.0/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-2.43.0/tooljet-db/tooljet-database.md @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: diff --git a/docs/versioned_docs/version-2.5.0/setup/env-vars.md b/docs/versioned_docs/version-2.5.0/setup/env-vars.md index fa42dfbfd9..476b252b32 100644 --- a/docs/versioned_docs/version-2.5.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.5.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.5.0/setup/heroku.md b/docs/versioned_docs/version-2.5.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.5.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.5.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.5.0/tooljet_database.md b/docs/versioned_docs/version-2.5.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.5.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.5.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.50.0-LTS/Enterprise/audit_logs.md b/docs/versioned_docs/version-2.50.0-LTS/Enterprise/audit_logs.md index e4e55bde46..ce8942d664 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/Enterprise/audit_logs.md +++ b/docs/versioned_docs/version-2.50.0-LTS/Enterprise/audit_logs.md @@ -3,7 +3,15 @@ id: audit_logs title: Audit logs --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    The audit log is the report of all the activities done in your ToolJet account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address. @@ -152,7 +160,7 @@ Here, `{process_id}` is a placeholder for the unique process identifier, and `{d | -------- | --------------------------------------------------------------------------- | | LOG_FILE_PATH | the path where the log file will be created ( eg: tooljet/log/tooljet-audit.log) | -
    +
    Example Log file data ```bash diff --git a/docs/versioned_docs/version-2.50.0-LTS/Enterprise/superadmin.md b/docs/versioned_docs/version-2.50.0-LTS/Enterprise/superadmin.md index aa6da283a5..bb2b64ef62 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/Enterprise/superadmin.md +++ b/docs/versioned_docs/version-2.50.0-LTS/Enterprise/superadmin.md @@ -3,7 +3,15 @@ id: superadmin title: Super Admin --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    A Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance. An instance can have more than one Super Admin. A Super Admin has full control over other users' workspaces and can create users, groups, and other super admins. diff --git a/docs/versioned_docs/version-2.50.0-LTS/Enterprise/white-label.md b/docs/versioned_docs/version-2.50.0-LTS/Enterprise/white-label.md index b4277bdc40..fccf7a19ac 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/Enterprise/white-label.md +++ b/docs/versioned_docs/version-2.50.0-LTS/Enterprise/white-label.md @@ -3,7 +3,15 @@ id: white-label title: White Label --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    The White Label feature allows you to completely remove ToolJet's branding from the ToolJet platform, allowing you to replace it with your own customized logo, favicon and page title. This feature grants you full control over the visual identity of your ToolJet-powered application, ensuring a seamless and personalized user experience. diff --git a/docs/versioned_docs/version-2.50.0-LTS/actions/control-component.md b/docs/versioned_docs/version-2.50.0-LTS/actions/control-component.md index 61f653d21e..bab10a66bb 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/actions/control-component.md +++ b/docs/versioned_docs/version-2.50.0-LTS/actions/control-component.md @@ -7,7 +7,7 @@ Control component action invokes the component specific actions. Component speci You can find the component specific actions for the specific component in their respective documentation. For example, you can find the component specific actions for the **Bounded Box** component in the [Bounded Box](/docs/widgets/bounded-box) documentation. -
    +
    Currently, Component specific actions are supported only by the below listed components.
      diff --git a/docs/versioned_docs/version-2.50.0-LTS/app-builder/customcss.md b/docs/versioned_docs/version-2.50.0-LTS/app-builder/customcss.md index 4356343249..73f8e1dece 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/app-builder/customcss.md +++ b/docs/versioned_docs/version-2.50.0-LTS/app-builder/customcss.md @@ -3,7 +3,15 @@ id: customstyles title: Custom Styles --- -
      Available on: Paid plans
      +
      + 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 diff --git a/docs/versioned_docs/version-2.50.0-LTS/app-builder/walkthrough/create-queries.md b/docs/versioned_docs/version-2.50.0-LTS/app-builder/walkthrough/create-queries.md index b6fa13f03a..866044639c 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/app-builder/walkthrough/create-queries.md +++ b/docs/versioned_docs/version-2.50.0-LTS/app-builder/walkthrough/create-queries.md @@ -87,7 +87,7 @@ You can insert values from the components in queries. For instance, the above co ```sql INSERT INTO feature_requests (id, title, description, votes, priority) -VALUES (10, `{{components.textinput1.value}}`, `{{components.textinput2.value}}`, 0, 2); +VALUES (10, '{{components.textinput1.value}}', '{{components.textinput2.value}}', 0, 2); ``` You can apply the same principles to upcoming examples. @@ -105,7 +105,7 @@ SET description = 'Updated Feature Description', votes = 15, priority = 2 -WHERE id = `{{components.table1.selectedRow.id}}`; +WHERE id = '{{components.table1.selectedRow.id}}'; ```
      diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/introduction.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/introduction.md index 5d98751925..e574a4f7b8 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/introduction.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/introduction.md @@ -35,6 +35,6 @@ The quality of our documentation isn't just determined by how well it's written ## Next Steps... -Once you've set up your local environment, take some time to explore our [Style Guide](style-guide.md), understand our page structures, and learn how to work with Docusaurus, the framework we use for our documentation. +Once you've set up your local environment, take some time to explore our [Style Guide](/docs/contributing-guide/documentation-guidelines/style-guide), understand our page structures, and learn how to work with Docusaurus, the framework we use for our documentation. We look forward to your contributions and are excited to see how you'll help make ToolJet documentation even better! diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/style-guide.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/style-guide.md index cc9438e21c..65f70547da 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/style-guide.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/documentation-guidelines/style-guide.md @@ -215,7 +215,7 @@ ORDER BY name ASC; `[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. +`ToolJet supports [multiple environments,](https://docs.tooljet.ai/docs/#multiple-environments)` takes the user directly to the specific section. --- diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/architecture.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/architecture.md index 8ae8b32726..c61fd8b0f3 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/architecture.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/architecture.md @@ -13,7 +13,7 @@ ToolJet server is a Node.js API application. Server is responsible for authentic **Dependencies:** - **PostgreSQL** - ToolJet server persists data to a postgres database. - **Email service** (SMTP/Sendgrid/Mailgun/etc) - Required to send user invitations and password reset emails. -- **PostgREST (Optional)** - Standalone web server that converts PostgreSQL database into queryable RESTful APIs for ToolJet Database. +- **PostgREST** - Standalone web server that converts PostgreSQL database into queryable RESTful APIs for ToolJet Database. ### 2. ToolJet Client diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/codespaces.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/codespaces.md index 9529f78b98..c64aacb24a 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/codespaces.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/codespaces.md @@ -3,7 +3,7 @@ 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.com/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.ai/docs/contributing-guide/setup/architecture) of ToolJet before proceeding. Open the terminal and run the commands below. @@ -51,7 +51,7 @@ sudo -u postgres psql ### 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.com/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.ai/docs/setup/env-vars) **For basic set-up you add the below env variables:** diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/docker.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/docker.md index 1330cc11ce..96dcdcfc12 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/docker.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/docker.md @@ -9,7 +9,7 @@ The following guide is intended for contributors to set up ToolJet locally. If y Docker Compose is the easiest way to set up the ToolJet server and client locally. -*If you just want to try out ToolJet locally with docker, you can follow the steps [here](https://docs.tooljet.com/docs/setup/try-tooljet).* +*If you just want to try out ToolJet locally with docker, you can follow the steps [here](/docs/setup/try-tooljet).* ## Prerequisites diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/macos.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/macos.md index b9c14500ea..74e94c7ad2 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/macos.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/macos.md @@ -36,33 +36,14 @@ To set up and run ToolJet on macOS for development, begin by opening your termin brew install postgresql@13 ``` - 1.4 Install PostgREST(optional) + 1.4 Install PostgREST - :::info - Required only if ToolJet Database is being used. + :::info + Please use PostgREST version 12.2.0 ::: - To install a specific version of PostgRest using Homebrew: - ```bash - brew install postgrest@ - ``` - To find out which versions are available, you can search with: - - ```bash - brew search postgrest - ``` - - Once PostgREST is installed, you can start the PostgREST service using Homebrew services: - - ``` - brew services start postgrest - ``` - - Run the following command to check the status of the PostgREST service and other Homebrew-managed services: - - ``` - brew services list + brew install postgrest ``` 1.5 Fork the repository: @@ -77,14 +58,14 @@ To set up and run ToolJet on macOS for development, begin by opening your termin git clone https://github.com//ToolJet.git ``` -3. Set up environment variables +2. Set up environment variables Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) ```bash cp .env.example .env ``` -4. Populate the keys in the env file +3. Populate the keys in the env file :::info `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) @@ -104,10 +85,14 @@ To set up and run ToolJet on macOS for development, begin by opening your termin PG_USER=postgres PG_PASS=postgres PG_DB=tooljet_development + TOOLJET_DB=tooljet_db + TOOLJET_DB_USER=postgres + TOOLJET_DB_HOST=localhost + TOOLJET_DB_PASS=postgres ORM_LOGGING=all ``` -5. Install and build dependencies +4. Install and build dependencies ```bash npm install npm install --prefix server @@ -115,7 +100,7 @@ To set up and run ToolJet on macOS for development, begin by opening your termin npm run build:plugins ``` -6. Set up database +5. Set up database ```bash npm run --prefix server db:create npm run --prefix server db:reset @@ -124,24 +109,24 @@ To set up and run ToolJet on macOS for development, begin by opening your termin If at any point you need to reset the database, use this command `npm run --prefix server db:reset` ::: -7. Run plugins compilation in watch mode +6. Run plugins compilation in watch mode ```bash cd ./plugins && npm start ``` -8. Run the server +7. Run the server ```bash cd ./server && npm run start:dev ``` -9. Run the client +8. Run the client ```bash cd ./frontend && npm start ``` The client will start on the port 8082, you can access the client by visiting: [http://localhost:8082](http://localhost:8082) -10. Create login credentials +9. Create login credentials Visiting [http://localhost:8082](http://localhost:8082) should redirect you to the login page, click on the signup link and enter your email. The emails sent by the server in development environment are captured and are opened in your default browser. Click the invitation link in the email preview to setup the account. diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/system-requirements.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/system-requirements.md index 910b471b6e..7ee71bf0d1 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/system-requirements.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/system-requirements.md @@ -19,6 +19,6 @@ For Docker setups on Mac systems, it's advisable to use a machine with 16GB RAM ## Bare-Metal Setup -For those who prefer a [bare-metal](https://docs.tooljet.com/docs/contributing-guide/setup/docker) setup over Docker, a minimum of 8GB RAM is recommended for smooth operation. +For those who prefer a [bare-metal](/docs/contributing-guide/setup/docker) setup over Docker, a minimum of 8GB RAM is recommended for smooth operation. Before initiating the installation process, please verify that your system meets these specified requirements. It's essential to customize server specifications based on the unique demands of your deployment scenario. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/ubuntu.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/ubuntu.md index e817257969..02ca21f42d 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/ubuntu.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/setup/ubuntu.md @@ -39,12 +39,10 @@ Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the sudo apt-get install libpq-dev ``` - 1.3 Install PostgREST (optional) + 1.3 Install PostgREST - :::info - Required only if ToolJet Database is being used. - - Please use PostgREST version 10.1.1.x + :::info + Please use PostgREST version 12.2.0 ::: Please follow the installation [PostgREST](https://postgrest.org/en/stable/install.html) guide @@ -83,6 +81,17 @@ Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the TOOLJET_HOST=http://localhost:8082 LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=localhost + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + TOOLJET_DB=tooljet_db + TOOLJET_DB_USER=postgres + TOOLJET_DB_HOST=localhost + TOOLJET_DB_PASS=postgres ``` 5. Install and build dependencies @@ -92,11 +101,11 @@ Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the npm install --prefix frontend npm run build:plugins ``` - > **_NOTE:_** > If the `npm run build:plugins` command fails due to some packages are missing, try running the following command to install the necessary packages: `sudo apt install build-essential` > then proceed to `npm run build:plugins` step again + 6. Set up database ```bash diff --git a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/testing.md b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/testing.md index d50589d75e..0439d61a9d 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/testing.md +++ b/docs/versioned_docs/version-2.50.0-LTS/contributing-guide/testing.md @@ -13,45 +13,50 @@ Follow the steps below to setup and run the test specifications using Cypress. W ``` ## Running Tests + #### Headed mode + - To run cypress in **headed** mode, run the following command: ```bash npm run cy:open ``` - In **headed** mode, the user will be able to choose the test specs from the test runner:
      - + Cypress headed mode - +
      #### Headless mode - To run cypress in **headless** mode, run the following command: - ```bash - npm run cy:run - ``` -- For running specific spec in headless mode, run for specific spec + ```bash + npm run cy:run + ``` + +- To run a specific spec in headless mode, run the following command: + ```bash npm run cy:run -- --spec "cypress/e2e/dashboard/multi-workspace/manageSSO.cy.js ```
      - + Cypress headless mode - +
      :::caution If some test specs need the environment variables, the user can pass them similar to the following command: + ```bash npm run cy:open -- --env='{"pg_host":"localhost","pg_user":"postgres", "pg_password":"postgres"}' ``` + or the user can add env-vars in the **cypress.config.js** file ::: - :::info Check all the Cypress commands [here](https://docs.cypress.io/guides/guides/command-line#Commands) -::: \ No newline at end of file +::: diff --git a/docs/versioned_docs/version-2.50.0-LTS/copilot.md b/docs/versioned_docs/version-2.50.0-LTS/copilot.md index 1026f3d5d4..4ca47b6b2e 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/copilot.md +++ b/docs/versioned_docs/version-2.50.0-LTS/copilot.md @@ -3,7 +3,15 @@ id: tooljet-copilot title: Copilot --- -
      Available on: Paid plans
      +
      + Icon + Paid feature +
      :::info BETA ToolJet Copilot is currently in private beta for **Business** and **Enterprise** users only. diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/airtable.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/airtable.md index 847a9d4f05..42ee234a6f 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/airtable.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/airtable.md @@ -70,7 +70,7 @@ This operation retrieves a list of records from the specified table. Airtable List Records Query -
      +
      **Response Example** ```json @@ -119,7 +119,7 @@ This operation fetches a specific record from the specified table. Airtable Retrieve Record Query -
      +
      **Response Example** ```json { @@ -155,7 +155,7 @@ This operation creates a new record in the specified table. } }] ``` -
      +
      **Response Example** ```json { @@ -194,7 +194,7 @@ Update a specific record by providing new data. "Email": "katrina.petersions2@example.com" } ``` -
      +
      **Response Example** ```json { @@ -225,7 +225,7 @@ This operation removes a record from the specified table. Airtable Delete Record Query -
      +
      **Response Example** ```json { diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/athena.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/athena.md index b2910b7ba5..215d334494 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/athena.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/athena.md @@ -9,7 +9,7 @@ ToolJet can connect to **Amazon Athena** which is an interactive query service t ## Connection -To establish a connection with the **Amazon Athena** data source, you can either click on the **+ Add new Data source** button located on the query panel or navigate to the **[Data Sources](https://docs.tooljet.com/docs/data-sources/overview)** page from the ToolJet dashboard and choose **Amazon Athena** as the data source. +To establish a connection with the **Amazon Athena** 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 **Amazon Athena** as the data source. ToolJet requires the following to connect to your Athena. diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/azureblob.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/azureblob.md index b8ad543bfe..56f63d25f0 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/azureblob.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/azureblob.md @@ -1,5 +1,5 @@ --- -id: azureblob +id: azureblobstorage title: Azure Blob --- diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/baserow.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/baserow.md index 4ba5fa9c7b..28af4a4327 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/baserow.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/baserow.md @@ -60,7 +60,7 @@ This query lists all the fields in a table. Baserow list fields -
      +
      **Response Example** ```yaml @@ -114,7 +114,7 @@ This query lists all the rows in a table. Baserow list -
      +
      **Response Example** ```json @@ -162,7 +162,7 @@ This query lists all the rows in a table. Baserow get -
      +
      **Response Example** ```json @@ -197,7 +197,7 @@ This query lists all the rows in a table. } ``` -
      +
      **Response Example** ```json @@ -234,7 +234,7 @@ This query lists all the rows in a table. } ``` -
      +
      **Response Example** ```json @@ -263,7 +263,7 @@ This query lists all the rows in a table. Baserow move row -
      +
      **Response Example** ```json diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/couchdb.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/couchdb.md index b31873a3f1..ef7a46561d 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/couchdb.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/couchdb.md @@ -57,7 +57,7 @@ This query lists all the records in a database. Couch listing -
      +
      **Response Example** ```json { @@ -101,7 +101,7 @@ This operation fetches a single record by its record ID. Couch retrieve view -
      +
      **Response Example** ```json { @@ -131,7 +131,7 @@ Inserts a new record into the database. [{"name":"tooljet"}] ``` -
      +
      **Response Example** ```json { @@ -161,7 +161,7 @@ You get the document as JSON in the response. For each update to the document, t [{"name":"tooljet"}] ``` -
      +
      **Response Example** ```json { @@ -183,7 +183,7 @@ Removes a record from the database by its record ID. Couch delete view -
      +
      **Response Example** ```json { @@ -241,7 +241,7 @@ Views are the primary tool used for querying and reporting on CouchDB documents. Couch get view -
      +
      **Response Example** ```json { diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/custom-js.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/custom-js.md index 71220a4de8..07cd2824fc 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/custom-js.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/custom-js.md @@ -138,9 +138,9 @@ 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.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. +- 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. - [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. +- [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-2.50.0-LTS/data-sources/google.sheets.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/google.sheets.md index c6946f4148..3cb8c82a9e 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/google.sheets.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/google.sheets.md @@ -1,5 +1,5 @@ --- -id: google.sheets +id: googlesheets title: Google Sheets --- diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/mailgun.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/mailgun.md index a646b43a54..8c966906c7 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/mailgun.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/mailgun.md @@ -13,7 +13,7 @@ The Mailgun API Datasource supports for interaction with the mail endpoint of th ## Connection -To establish a connection with the **Mailgun** data source, click on the **+ Add new data source** button located on the query panel or navigate to the [Data Sources](https://docs.tooljet.com/docs/data-sources/overview) page from the ToolJet dashboard. +To establish a connection with the **Mailgun** data source, 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 requires the following to connect to your Mailgun: - **API key** diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/n8n.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/n8n.md index e30f64e51b..efdc669060 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/n8n.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/n8n.md @@ -9,7 +9,7 @@ ToolJet can trigger n8n workflows using webhook URLs. Please refer [this](https: ## Connection -To establish a connection with the n8n data source, click on the **+ Add new Data source** button located on the query panel or navigate to the [Data Sources](https://docs.tooljet.com/docs/data-sources/overview) page from the ToolJet dashboard. +To establish a connection with the n8n data source, 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. Webhooks in n8n can be configured to operate with or without **Authentication**. If no authentication is required, select `None` as the **Authentication type**. For webhooks that require authentication, choose the appropriate method from the dropdown and provide the corresponding credentials. diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/notion.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/notion.md index cabd0aa77d..37359882cc 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/notion.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/notion.md @@ -9,7 +9,7 @@ ToolJet can connect to a Notion workspace to do operations on notion pages, data ## Connection -To establish a connection with the Notion data source, click on the **+ Add new Data source** button located on the query panel or navigate to the [Data Sources](https://docs.tooljet.com/docs/data-sources/overview) page from the ToolJet dashboard. +To establish a connection with the Notion data source, 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. For integrating Notion with ToolJet we will need the API token. The API token can be generated from your Notion workspace settings. Read the official Notion docs for [Creating an internal integration with notion API](https://www.notion.so/help/create-integrations-with-the-notion-api). diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/restapi.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/restapi.md index a6715e28a4..bb097d868f 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/restapi.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/restapi.md @@ -41,7 +41,7 @@ Once you have connected to the REST API data source, follow these steps to write 4. Click **Preview** to view the data returned from the query or click **Run** to execute the query. :::tip -Query results can be transformed using the **[Transformations](/docs/how-to/transformations)** feature. +Query results can be transformed using the **[Transformations](/docs/tutorial/transformations)** feature. ::: ToolJet supports the following REST HTTP methods @@ -90,7 +90,7 @@ Content-Type: multipart/form-data; REST APIs can return data in a variety of formats, including **JSON** and **Base64**. JSON is a common format used for data exchange in REST APIs, while Base64 is often used for encoding binary data, such as images or video, within a JSON response. When the response **content-type** is **image**, the response will be a **base64** string. -
      +
      **Example JSON Response** ```json @@ -154,7 +154,7 @@ You can also use JS methods like **map** to load data on components like **dropd ToolJet - Data source - REST API -
      +
      **Example base64 Response** ```base64 diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/s3.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/s3.md index 47fa13f442..6517794bf4 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/s3.md +++ b/docs/versioned_docs/version-2.50.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.com/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.ai/build-an-aws-s3-broswer-with-tooljet/)**. :::
      \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/sample-data-sources.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/sample-data-sources.md index 0d03117a45..1189754cdb 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/sample-data-sources.md +++ b/docs/versioned_docs/version-2.50.0-LTS/data-sources/sample-data-sources.md @@ -29,7 +29,7 @@ This method allows you to add a sample data source to an existing application th
      - Connect via Canvas + Connect via Canvas
      @@ -44,7 +44,7 @@ This method allows you to connect the sample data source to an existing applicat
      - Connect via query manager + Connect via query manager
      @@ -59,7 +59,7 @@ This method enables the creation of a sample application with a pre-configured c 5. By default, this application will feature a table component with tabs. These tabs will visually display the data retrieved from your sample data source.
      - Create Sample App + Create Sample App
      ## Sample Data Source Schema @@ -68,8 +68,8 @@ The sample data source contains various tables with different data types. | Table Name | Column Names| Number of Rows | |:-------|:---------|:---------------| -| `sampledataxlsx_organizations` | `index`, `organization_id`, `name`, `website`, `country`, `description`, `founded`, `industry`, `number_of_employees` | 100 | -| `sampledataxlsx_countrygdp` | `country`, `area_sq_km, population`, `exports`, `imports, gdp`, `gdp_per_capita`, `gdp_real_growth_rate`, `inflation_rate_consumer_prices`, `investment_gross_fixed_of_gdp`, `labor_force`, `unemployment_rate` | 263 | -| `sampledataxlsx_users` | `first_name`, `last_name`, `company_name`, `address`, `city`, `county`, `state`, `zip`, `phone1`, `phone2`, `email`, `web` | 500 | -| `sampledataxlsx_orders` | `row_id`, `order_id`, `order_date`, `ship_date`, `ship_mode`, `customer_id`, `customer_name`, `segment`, `country`, `city`, `state`, `postal_code`, `region`, `product_id`, `category`, `sub_category`, `product_name`, `sales`, `quantity`, `discount`, `profit` | 500 | -| `sampledataxlsx_productlistcars` | `car`, `mpg`, `cylinders`, `displacement`, `horsepower`, `weight`, `acceleration`, `model`, `origin` | 406 | +| `public.sample_data_organizations` | `index`, `organization_id`, `name`, `website`, `country`, `description`, `founded`, `industry`, `number_of_employees` | 100 | +| `public.sample_data_country_gdp` | `country`, `area_sq_km, population`, `exports`, `imports, gdp`, `gdp_per_capita`, `gdp_real_growth_rate`, `inflation_rate_consumer_prices`, `investment_gross_fixed_of_gdp`, `labor_force`, `unemployment_rate` | 263 | +| `public.sample_data_users` | `first_name`, `last_name`, `company_name`, `address`, `city`, `county`, `state`, `zip`, `phone1`, `phone2`, `email`, `web` | 499 | +| `public.sample_data_orders` | `row_id`, `order_id`, `order_date`, `ship_date`, `ship_mode`, `customer_id`, `customer_name`, `segment`, `country`, `city`, `state`, `postal_code`, `region`, `product_id`, `category`, `sub_category`, `product_name`, `sales`, `quantity`, `discount`, `profit` | 500 | +| `public.sample_data_product_cars` | `car`, `mpg`, `cylinders`, `displacement`, `horsepower`, `weight`, `acceleration`, `model`, `origin` | 406 | diff --git a/docs/versioned_docs/version-2.50.0-LTS/data-sources/stripe.md b/docs/versioned_docs/version-2.50.0-LTS/data-sources/stripe.md index f7d0568083..a7b7ca3a13 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/data-sources/stripe.md +++ b/docs/versioned_docs/version-2.50.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.com/build-a-stripe-refund-tool-using-low-code/)** +Check out the **[Stripe Refund App tutorial](https://blog.tooljet.ai/build-a-stripe-refund-tool-using-low-code/)** :::
      diff --git a/docs/versioned_docs/version-2.50.0-LTS/doc-home-page.mdx b/docs/versioned_docs/version-2.50.0-LTS/doc-home-page.mdx new file mode 100644 index 0000000000..27704b4f98 --- /dev/null +++ b/docs/versioned_docs/version-2.50.0-LTS/doc-home-page.mdx @@ -0,0 +1,343 @@ +--- +description: Home Page +hide_table_of_contents: true +sidebar_label: Home +title: Home +slug: / +--- + +import './homepage.css'; +import { ArrowRight } from 'lucide-react'; +import gettingStartedImage from '../../src/pages/getting-started.png'; +import { + textLabels, + featureCards, + setupCards, + deployOptions, + dataCards, + organizationCards, + releaseCards, + resourceCards, + sectionCards +} from './homePageData'; +import Link from '@docusaurus/Link'; + +{/* // Reusable components */} +export const Card = ({ className = '', href, children }) => { + const cardContent = ( +
      +
      +
      +
      + {children} +
      +
      + ); + + return href ? ( + + {cardContent} + + ) : cardContent; +}; + +export const CardHeader = ({ className = '', children }) => ( +
      + {children} +
      +); + +export const CardContent = ({ className = '', children }) => ( +
      + {children} +
      +); + +export const CardTitle = ({ className = '', children }) => ( +

      + {children} +

      +); + +export const Button = ({ + variant = "default", + className = '', + children, +}) => { + const baseStyles = "cursor-pointer inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background"; + const variantStyles = { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + outline: "border border-input hover:bg-accent hover:text-accent-foreground", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary border-none", + }; + + return ( +
      + +
      + ); +}; + +export const IconCard = ({ icon: Icon, title, content, color, href }) => ( + +
      + +
      + +
      + {title} +
      + +

      {content}

      +
      +
      +
      +); + +export const SmallCard = ({ icon: Icon, title, href }) => ( + +
      +
      +
      + +
      + {title} +
      +
      +
      +); + +export const SectionContainer = ({ title, description, children }) => ( +
      +

      {title}

      +

      {description}

      + {children} +
      +); + +{/* // Main component */} + +# +
      +
      +
      +
      + + {/* Background shapes */} +
      + {/* Child component 1 */} +
      + {/* Child component 2 */} +
      + {/* Child component 3 */} +
      +
      +{/* ToolJet Documentation Section */} +
      +
      +

      + {textLabels.title.prefix} {textLabels.title.highlight} +

      +

      + {textLabels.subtitle} +

      +
      + +
      + {featureCards.map((card, index) => ( + + ))} +
      + + {/* Getting Started Section */} + +
      + {/* Hover Gradient Overlay */} +
      + + {/* Image Container */} +
      + Getting Started +
      + + {/* Text Container */} +
      +

      + {sectionCards.gettingStarted.title} +

      +

      + {sectionCards.gettingStarted.description} +

      +
      +
      + + + +
      +
      + +
      + {/* Setup ToolJet Section */} + +
      + {setupCards.map((card, index) => ( + + ))} +
      +
      + + {/* Deploy on Section */} + +
      + {deployOptions.map((option, index) => ( + + ))} +
      +
      + + {/* Explore more details link */} +
      + + + +
      + + {/* Bring your data to ToolJet section */} + +
      + {dataCards.map((card, index) => ( + + ))} +
      +
      + + {/* Manage your organization section */} + + +
      + {organizationCards.map((card, index) => ( + + ))} +
      +
      + + {/* Manage releases section */} + + +
      + {releaseCards.map((card, index) => ( + + ))} +
      +
      + + {/* Additional resources section */} + + +
      + {resourceCards.map((card, index) => ( + + ))} +
      +
      +
      +
      +
      \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/getting-started/platform-overview.md b/docs/versioned_docs/version-2.50.0-LTS/getting-started/platform-overview.md index 574ee4b397..2853270463 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/getting-started/platform-overview.md +++ b/docs/versioned_docs/version-2.50.0-LTS/getting-started/platform-overview.md @@ -1,7 +1,6 @@ --- id: platform-overview title: Platform Overview -slug: / ---
      diff --git a/docs/versioned_docs/version-2.50.0-LTS/getting-started/quickstart-guide.md b/docs/versioned_docs/version-2.50.0-LTS/getting-started/quickstart-guide.md index 75fd7560b4..134845be9f 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/getting-started/quickstart-guide.md +++ b/docs/versioned_docs/version-2.50.0-LTS/getting-started/quickstart-guide.md @@ -21,7 +21,7 @@ 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.com/signup)** account and follow the steps below. +To begin, create a free **[ToolJet](https://www.tooljet.ai/signup)** account and follow the steps below.
      diff --git a/docs/versioned_docs/version-2.50.0-LTS/gitsync.md b/docs/versioned_docs/version-2.50.0-LTS/gitsync.md index ef25dd3315..5647001049 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/gitsync.md +++ b/docs/versioned_docs/version-2.50.0-LTS/gitsync.md @@ -6,7 +6,15 @@ title: GitSync import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; -
      Available on: Paid plans
      +
      + Icon + Paid feature +
      The GitSync feature enables synchronization of workspace applications with a git repository, streamlining application management and version control on ToolJet. diff --git a/docs/versioned_docs/version-2.50.0-LTS/homePageData.js b/docs/versioned_docs/version-2.50.0-LTS/homePageData.js new file mode 100644 index 0000000000..8543d27cad --- /dev/null +++ b/docs/versioned_docs/version-2.50.0-LTS/homePageData.js @@ -0,0 +1,220 @@ +import { + Grid3x3, Database, Workflow, Cog, Target, Scale, + Layers, FileSpreadsheet, Folder, Wand2, LayoutDashboard, Users, UserCheck, + Lock, UserPlus, ScrollText, Megaphone, Gem, Mail, GitBranch, + Box, GitMerge, ShoppingBag, Wand, Flag, ShieldCheck, Cloud, Container, Boxes, Server, Telescope, Globe +} from 'lucide-react'; + +export const featureCards = [ + { + icon: Grid3x3, + title: "App Builder", + color: "text-blue-500", + content: "Design and create applications with ToolJet's intuitive app builder, featuring a drag-and-drop interface and powerful pre-built components to streamline development.", + href: "/docs/2.50.0-LTS/app-builder/overview" + }, + { + icon: Database, + title: "ToolJet Database", + color: "text-blue-500", + content: "Powered by PostgreSQL, offering a user-friendly UI editor. ToolJet Database allows you to manage, edit, and interact with your data directly within the platform.", + href: "/docs/2.50.0-LTS/tooljet-db/tooljet-database" + }, + { + icon: Workflow, + title: "Workflows", + color: "text-blue-500", + content: "Automate processes and define workflows with precision, allowing your apps to handle tasks intelligently.", + href: "/docs/2.50.0-LTS/workflows/overview" + } +]; + +export const setupCards = [ + { + icon: Cog, + title: "Try ToolJet", + color: "text-blue-500", + content: "Get started with ToolJet in under 2 minutes by running it with Docker. Experience a seamless setup and explore the full capabilities of ToolJet.", + href: "/docs/2.50.0-LTS/setup/try-tooljet" + }, + { + icon: Cog, + title: "System Requirements", + color: "text-blue-500", + content: "Ensure your system meets the requirements for running ToolJet. Check hardware and software specifications to get the best performance.", + href: "/docs/2.50.0-LTS/setup/system-requirements" + }, + { + icon: Target, + title: "Choose Your ToolJet", + color: "text-blue-500", + content: "Discover the ideal ToolJet version for your development needs. Choose between our LTS versions or explore Pre-Release versions.", + href: "/docs/2.50.0-LTS/setup/choose-your-tooljet/" + }, + { + icon: Scale, + title: "Upgrade to LTS", + color: "text-blue-500", + content: "Upgrade to the Long Term Support (LTS) version of ToolJet for extended support, stability, and access to critical updates.", + href: "/docs/2.50.0-LTS/setup/upgrade-to-lts" + } +]; + +export const deployOptions = [ + { icon: Cloud, title: "DigitalOcean", href: "/docs/2.50.0-LTS/setup/digitalocean" }, + { icon: Container, title: "Docker", href: "/docs/2.50.0-LTS/setup/docker" }, + { icon: Server, title: "AWS EC2", href: "/docs/2.50.0-LTS/setup/ec2" }, + { icon: Server, title: "AWS ECS", href: "/docs/2.50.0-LTS/setup/ecs" }, + { icon: Server, title: "Openshift", href: "/docs/2.50.0-LTS/setup/openshift" }, + { icon: Telescope, title: "Helm", href: "/docs/2.50.0-LTS/setup/helm" }, + { icon: Boxes, title: "Kubernetes", href: "/docs/2.50.0-LTS/setup/kubernetes" }, + { icon: Globe, title: "Kubernetes (GKE)", href: "/docs/2.50.0-LTS/setup/kubernetes-gke" }, + { icon: Globe, title: "Kubernetes (AKS)", href: "/docs/2.50.0-LTS/setup/kubernetes-aks" }, + { icon: Globe, title: "Kubernetes (EKS)", href: "/docs/2.50.0-LTS/setup/kubernetes-eks" }, + { icon: Globe, title: "Azure Container Apps", href: "/docs/2.50.0-LTS/setup/azure-container" }, + { icon: Globe, title: "Google Cloud Run", href: "/docs/2.50.0-LTS/setup/google-cloud-run" }, + + +]; + +export const dataCards = [ + { + icon: Layers, + title: "Overview", + color: "text-blue-500", + content: "Gain a broad understanding on connecting various data sources to ToolJet.", + href: "/docs/2.50.0-LTS/data-sources/overview" + }, + { + icon: FileSpreadsheet, + title: "Sample Data Source", + color: "text-blue-500", + content: "Explore sample data sources to quickly integrate with ToolJet. Test features and workflows using predefined datasets.", + href: "/docs/2.50.0-LTS/data-sources/sample-data-sources" + }, + { + icon: Folder, + title: "Data Source Library", + color: "text-blue-500", + content: "Browse ToolJet's data source library to connect with databases, APIs, and external services seamlessly.", + href: "/docs/2.50.0-LTS/tooljet-concepts/what-are-datasources/" + }, + { + icon: Wand2, + title: "Transformation", + color: "text-blue-500", + content: "Leverage ToolJet's transformation capabilities to manipulate and format data from various sources with ease.", + href: "/docs/2.50.0-LTS/tutorial/transformations/" + } +]; + +export const organizationCards = [ + { icon: LayoutDashboard, title: "Dashboard", href: "/docs/2.50.0-LTS/dashboard" }, + { icon: Users, title: "Workspaces", href: "/docs/2.50.0-LTS/org-management/workspaces/workspace_overview" }, + { icon: UserCheck, title: "User authentication", href: "/docs/2.50.0-LTS/user-authentication/workspace-login" }, + { icon: Lock, title: "Permissions", href: "/docs/2.50.0-LTS/org-management/permissions" }, + { icon: UserPlus, title: "Users and groups", href: "/docs/2.50.0-LTS/tutorial/manage-users-groups" }, + { icon: ScrollText, title: "Audit logs", href: "/docs/2.50.0-LTS/Enterprise/audit_logs" }, + { icon: Megaphone, title: "White label", href: "/docs/2.50.0-LTS/Enterprise/white-label" }, + { icon: Gem, title: "Super admin", href: "/docs/2.50.0-LTS/Enterprise/superadmin" }, + { icon: Mail, title: "Licensing", href: "/docs/2.50.0-LTS/org-management/licensing/self-hosted" } +]; + +export const releaseCards = [ + { + icon: GitBranch, + title: "Git Sync", + color: "text-blue-500", + content: "Sync your ToolJet projects with Git repositories, enabling version control and collaboration across teams.", + href: "/docs/2.50.0-LTS/gitsync" + }, + { + icon: Box, + title: "Multi-Environment", + color: "text-blue-500", + content: "Easily manage and deploy applications across multiple environments, ensuring smooth transitions between development, staging, and production.", + href: "/docs/2.50.0-LTS/release-management/multi-environment" + }, + { + icon: GitMerge, + title: "Versioning and Release", + color: "text-blue-500", + content: "Implement version control and release management to track changes, roll back updates, and maintain stable app deployments.", + href: "/docs/2.50.0-LTS/tutorial/versioning-and-release" + } +]; + +export const resourceCards = [ + { + icon: ShoppingBag, + title: "Marketplace", + color: "text-blue-500", + content: "Discover a variety of plugins, extensions and integrations in ToolJet's marketplace to enhance your app-building experience.", + href: "/docs/2.50.0-LTS/marketplace/marketplace-overview" + }, + { + icon: Wand, + title: "Copilot", + color: "text-blue-500", + content: "Boost productivity with ToolJet Copilot. Get AI-powered suggestions and assistance while building your applications.", + href: "/docs/2.50.0-LTS/tooljet-copilot" + }, + { + icon: Flag, + title: "Tracking", + color: "text-blue-5000", + content: "ToolJet ensures privacy by acting as a proxy, never storing data, and offers anonymous tracking with feature controls.", + href: "/docs/2.50.0-LTS/tracking" + }, + { + icon: ShieldCheck, + title: "Security", + color: "text-blue-500", + content: "ToolJet ensures data security with SOC 2 compliance, encryption, and secure credential handling, never storing your data.", + href: "/docs/2.50.0-LTS/security" + } +]; + +export const textLabels = { + title: { + prefix: "ToolJet", + highlight: "Documentation" + }, + subtitle: "Learn how to get up and running with ToolJet", + gettingStarted: { + title: "Getting Started", + description: "Discover how to create and publish apps within minutes" + }, + setupToolJet: { + title: "Setup ToolJet", + description: "Learn about the different methods you can use to deploy ToolJet" + }, + deployOn: { + title: "Deployment" + }, + exploreMore: "Explore more", + bringData: { + title: "Bring your data to ToolJet", + description: "Learn how to connect your data sources to ToolJet" + }, + manageOrganization: { + title: "Manage your organization", + description: "Learn how to secure your apps and manage user authentication in ToolJet." + }, + manageReleases: { + title: "Manage releases", + description: "Learn how you can efficiently control the release cycle in ToolJet" + }, + additionalResources: { + title: "Additional resources", + description: "Learn more about Marketplace Plugins, ToolJet Copilot, App Performance, and Security." + } +}; + +export const sectionCards = { + gettingStarted: { + title: "Getting Started", + description: "Discover how to create and publish apps within minutes", + link: "/docs/2.50.0-LTS/getting-started/quickstart-guide", + } +}; \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/homepage.css b/docs/versioned_docs/version-2.50.0-LTS/homepage.css new file mode 100644 index 0000000000..bd6213e1df --- /dev/null +++ b/docs/versioned_docs/version-2.50.0-LTS/homepage.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/how-to/access-users-location.md b/docs/versioned_docs/version-2.50.0-LTS/how-to/access-users-location.md index c97ecd5a1b..1341dea5ef 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/how-to/access-users-location.md +++ b/docs/versioned_docs/version-2.50.0-LTS/how-to/access-users-location.md @@ -17,7 +17,7 @@ To uphold user privacy, the Geolocation API requests permission before locating How to: Access User's Location
      -2. In the app editor, navigate to the query panel at the bottom and create a **[RunJS query](/docs/data-sources/run-js/#runjs-query-examples)** by selecting **Run JavaScript Code** as the datasource: +2. In the app editor, navigate to the query panel at the bottom and create a **[RunJS query](/docs/data-sources/run-js/#runjs-example-queries)** by selecting **Run JavaScript Code** as the datasource:
      How to: Access User's Location
      diff --git a/docs/versioned_docs/version-2.50.0-LTS/how-to/pass-values-in-rest-api.md b/docs/versioned_docs/version-2.50.0-LTS/how-to/pass-values-in-rest-api.md index bdc8b47f46..a371f9b3cd 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/how-to/pass-values-in-rest-api.md +++ b/docs/versioned_docs/version-2.50.0-LTS/how-to/pass-values-in-rest-api.md @@ -51,5 +51,5 @@ 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: -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/)** \ No newline at end of file +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 diff --git a/docs/versioned_docs/version-2.50.0-LTS/how-to/setup-syslog.md b/docs/versioned_docs/version-2.50.0-LTS/how-to/setup-syslog.md index 778c7623a1..6c6cdd3993 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/how-to/setup-syslog.md +++ b/docs/versioned_docs/version-2.50.0-LTS/how-to/setup-syslog.md @@ -63,7 +63,7 @@ The **log file** serves as a comprehensive record of audit logs, capturing cruci The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata. -
      +
      Example Log file data ```bash diff --git a/docs/versioned_docs/version-2.50.0-LTS/how-to/use-axios.md b/docs/versioned_docs/version-2.50.0-LTS/how-to/use-axios.md index 87efa06d47..4ac9556aae 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/how-to/use-axios.md +++ b/docs/versioned_docs/version-2.50.0-LTS/how-to/use-axios.md @@ -62,7 +62,7 @@ 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.com/build-github-stars-history-app-in-5-minutes-using-low-code/)**. +**[Build GitHub star history tracker](https://blog.tooljet.ai/build-github-stars-history-app-in-5-minutes-using-low-code/)**.
      \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/how-to/use-custom-parameters.md b/docs/versioned_docs/version-2.50.0-LTS/how-to/use-custom-parameters.md index a0b0bd9c20..369bb32ef4 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/how-to/use-custom-parameters.md +++ b/docs/versioned_docs/version-2.50.0-LTS/how-to/use-custom-parameters.md @@ -91,7 +91,7 @@ In this example, we will demonstrate how to use custom parameters in a query by 3. **Execute the REST API query and observe the new row created in the ToolJetDB table.** -**Note:** You can also use parameters in JavaScript queries. Learn more about [JS Query Parameter](/docs/data-sources/run-js/#js-parameters). +**Note:** You can also use parameters in JavaScript queries. Learn more about [JS Query Parameter](/docs/data-sources/run-js/#parameters-in-run-javascript-code).
      How to: use custom parameters diff --git a/docs/versioned_docs/version-2.50.0-LTS/marketplace/marketplace_overview.md b/docs/versioned_docs/version-2.50.0-LTS/marketplace/marketplace_overview.md index 760f7a3028..f4b821c111 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/marketplace/marketplace_overview.md +++ b/docs/versioned_docs/version-2.50.0-LTS/marketplace/marketplace_overview.md @@ -73,7 +73,7 @@ To remove a plugin, follow these steps: - On the `Installed` page, click on the `Remove` button of the related plugin that you wish to remove. ## Available Plugins -- **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-redshift)** +- **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-awsredshift)** - **[AWS Textract](/docs/marketplace/plugins/marketplace-plugin-textract)** - **[AWS Lambda](/docs/marketplace/plugins/marketplace-plugin-aws-lambda)** - **[Engagespot](/docs/marketplace/plugins/marketplace-plugin-engagespot)** @@ -83,8 +83,9 @@ To remove a plugin, follow these steps: - **[Plivo](/docs/marketplace/plugins/marketplace-plugin-plivo)** - **[Pocketbase](/docs/marketplace/plugins/marketplace-plugin-pocketbase)** - **[Portkey](/docs/marketplace/plugins/marketplace-plugin-portkey)** -- **[PrestoDB](/docs/marketplace/plugins/marketplace-plugin-prestodb)** +- **[PrestoDB](/docs/marketplace/plugins/marketplace-plugin-Presto)** - **[Salesforce](/docs/marketplace/plugins/marketplace-plugin-salesforce)** +- **[Sharepoint](/docs/marketplace/plugins/marketplace-plugin-sharepoint)** - **[Supabase](/docs/marketplace/plugins/marketplace-plugin-supabase)** :::info For Plugin Developers Refer to the **[Plugin Development guide](/docs/contributing-guide/marketplace/marketplace-setup)** to learn how to create plugins for the ToolJet Marketplace. diff --git a/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/amazon-redshift.md b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/amazon-redshift.md index 9d31d3ddcd..c3681fa367 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/amazon-redshift.md +++ b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/amazon-redshift.md @@ -1,5 +1,5 @@ --- -id: marketplace-plugin-redshift +id: marketplace-plugin-awsredshift title: Amazon Redshift --- diff --git a/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/portkey.md b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/portkey.md index 1a1bbd26b2..5f2624c0cd 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/portkey.md +++ b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/portkey.md @@ -53,7 +53,7 @@ This operation generates text completions based on a given prompt. Completion Operation for Portkey
      -
      +
      **Response Example** ```json { @@ -96,7 +96,7 @@ This operation generates chat completions based on a series of messages. Chat Operation for Portkey
    -
    +
    **Response Example** ```json { @@ -141,7 +141,7 @@ This operation generates completions based on a pre-defined prompt. Prompt Completion Operation for Portkey
    -
    +
    **Response Example** ```json { @@ -185,7 +185,7 @@ This operation creates embeddings for given input text. Create Embedding Operation for Portkey
    -
    +
    **Response Example** ```json { diff --git a/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/prestodb.md b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/prestodb.md index a3927a852e..4db59a764e 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/prestodb.md +++ b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/prestodb.md @@ -1,5 +1,5 @@ --- -id: marketplace-plugin-prestodb +id: marketplace-plugin-Presto title: PrestoDB --- diff --git a/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/sharepoint.md b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/sharepoint.md new file mode 100644 index 0000000000..ebb95dce8e --- /dev/null +++ b/docs/versioned_docs/version-2.50.0-LTS/marketplace/plugins/sharepoint.md @@ -0,0 +1,770 @@ +--- +id: marketplace-plugin-sharepoint +title: Sharepoint +--- + +ToolJet allows you to connect to Microsoft Sharepoint to perform various operations like managing sites, lists, and items using Microsoft Graph API. + +:::info +**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 + +To connect to a Sharepoint data source in ToolJet, you can either click the **+ Add new data source** button on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page in the ToolJet dashboard. + +:::info +You'll need to register your application in Azure Active Directory to get the required credentials. The application needs appropriate Microsoft Graph API permissions. +::: + +To connect to Sharepoint, you need the following details: +- **Client ID** +- **Client Secret** +- **Tenant ID** + +
    + Sharepoint Connect +
    + +## Querying Sharepoint + +1. Click the **+ Add** button in the query manager at the bottom of the editor and select the Sharepoint data source added earlier. +2. Choose the operation you want to perform on your Sharepoint instance. + +:::tip +Query results can be transformed using transformations. Refer to our transformations documentation for more details: **[link](/docs/tutorial/transformations)** +::: + +## Supported Operations + +ToolJet supports the following Sharepoint operations: + +- **[Get All Sites](#get-all-sites)** +- **[Get Site](#get-site)** +- **[Get Analytics](#get-analytics)** +- **[Get Pages Of a Site](#get-pages-of-a-site)** +- **[Get All Lists](#get-all-lists)** +- **[Get Metadata Of a List](#get-metadata-of-a-list)** +- **[Create a List](#create-a-list)** +- **[Get Items Of a List](#get-items-of-a-list)** +- **[Update Item Of a List](#update-item-of-a-list)** +- **[Delete Item Of a List](#delete-item-of-a-list)** +- **[Add Item To a List](#add-item-to-a-list)** + +### Get All Sites + +This operation retrieves all available Sharepoint sites. For more details, see the Microsoft Graph API documentation **[here](https://learn.microsoft.com/en-us/graph/api/site-search)**. + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get All Sites +
    + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites", + "value": [ + { + "createdDateTime": "2024-09-08T15:54:30Z", + "id": "tooljetxxxx.sharepoint.com,bcxxxx-4b3a-xxxxxx-dfe229c34311,2a4ac5da-xxx-xxxx-b047-18dece61fb95", + "lastModifiedDateTime": "2024-08-17T18:50:05Z", + "name": "appcatalog", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/appcatalog", + "displayName": "Apps", + "root": {}, + "siteCollection": { + "hostname": "tooljetxxxx.sharepoint.com" + } + } + ] +} +``` +
    + +### Get Site + +This operation retrieves information about a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site to retrieve + +
    + Get Site +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites/$entity", + "createdDateTime": "2024-10-22T13:21:10.623Z", + "description": "Internal DIA Guidelines", + "id": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb", + "lastModifiedDateTime": "2024-10-24T13:35:39Z", + "name": "NewStyle", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle", + "displayName": "NewStyle", + "root": {}, + "siteCollection": { + "hostname": "tooljetxxxx.sharepoint.com" + } +} +``` +
    + +### Get Analytics + +This operation retrieves analytics for a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site +- **Time Interval**: + - **Last 7 Days** + - **All Time** + +
    + Get Analytics +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Time Interval: Last 7 Days +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.itemActivityStat", + "aggregationInterval": "None", + "startDateTime": "2024-10-30T00:00:00Z", + "endDateTime": "2024-11-05T00:00:00Z", + "isTrending": false, + "access": { + "actionCount": 0, + "actorCount": 0, + "timeSpentInSeconds": 0 + }, + "incompleteData": { + "wasThrottled": false, + "resultsPending": false, + "notSupported": false + } +} +``` +
    + +### Get Pages Of a Site + +This operation retrieves all pages from a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get Pages +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/pages", + "@odata.nextLink": "https://graph.microsoft.com/v1.0/sites/tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb/pages?$top=1&$skiptoken=UGFnZWQ9VFJVRSZwX0ZpbGVMZWFmUmVmPUV2ZW50UGxhbkhvbWUuYXNweCZwX0lEPTc", + "value": [ + { + "@odata.type": "#microsoft.graph.sitePage", + "@odata.etag": ""{2095ED1D-AC76-4480-BBDC-8D63EBAAE2AF},6"", + "createdDateTime": "2024-10-22T13:21:33Z", + "eTag": ""{2095ED1D-AC76-4480-BBDC-8D63EBAAE2AF},6"", + "id": "2095ed1d-ac76-4480-bbdc-8d63ebaae2af", + "lastModifiedDateTime": "2024-10-22T13:21:35Z", + "name": "EventPlanHome.aspx", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/SitePages/EventPlanHome.aspx", + "title": "Home", + "pageLayout": "home", + "thumbnailWebUrl": "https://tooljetxxxx.sharepoint.com/_layouts/15/getpreview.ashx?guidSite=887cb371-e930-4e5b-a726-8d5769e6b946&guidWeb=6d653d09-1613-4663-99ab-1bb72ff6ceeb&guidFile=bb423735-7402-47df-ab2e-729bddfe6f23", + "promotionKind": "page", + "showComments": false, + "showRecommendedPages": false, + "contentType": { + "id": "0x0101009D1CB255DA76424F860D91F20E6C4118004CC245E37669F3438CDDEB01FCEAE890", + "name": "Site Page" + }, + "createdBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "lastModifiedBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "parentReference": { + "siteId": "887cb371-e930-4e5b-a726-8d5769e6b946" + }, + "publishingState": { + "level": "published", + "versionId": "1.0" + }, + "reactions": {} + } + ] +} +``` +
    + +### Get All Lists + +This operation retrieves all lists from a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site + +#### Optional Parameters +- **Page**: The page number to retrieve + +
    + Get All Lists +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Page: 1 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists", + "value": [ + { + "@odata.etag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "createdDateTime": "2024-10-24T11:11:10Z", + "description": "", + "eTag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "id": "1a64ae23-9cb6-4521-b489-61d558dde9f7", + "lastModifiedDateTime": "2024-10-24T11:11:17Z", + "name": "Test_table_query", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query", + "displayName": "Test_table_query", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + } + } + ] +} +``` +
    + +### Get Metadata Of a List + +This operation retrieves metadata for a specific list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List Name**: The name of the list, only used if List ID is not provided +- **List ID**: The ID of the list, required if List Name is not provided + +
    + Get List Metadata +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists/$entity", + "@odata.etag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "createdDateTime": "2024-10-24T11:11:10Z", + "description": "", + "eTag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "id": "1a64ae23-9cb6-4521-b489-61d558dde9f7", + "lastModifiedDateTime": "2024-11-05T10:27:04Z", + "name": "Test_table_query", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query", + "displayName": "Test_table_query", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + }, + "columns@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/columns", + "columns": [ + { + "columnGroup": "Custom Columns", + "description": "", + "displayName": "USER_NAME", + "enforceUniqueValues": false, + "hidden": false, + "id": "fa564e0f-0c70-4ab9-b863-0177e6ddd247", + "indexed": false, + "name": "Title", + "readOnly": false, + "required": false, + "text": { + "allowMultipleLines": false, + "appendChangesToExistingText": false, + "linesForEditing": 0, + "maxLength": 255 + } + } + ], + "items@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items", + "items": [ + { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "createdDateTime": "2024-10-24T11:11:11Z", + "eTag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "id": "1", + "lastModifiedDateTime": "2024-10-24T11:11:11Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/1_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('1')/fields/$entity", + "fields": { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "Title": "Null_test", + "id": "1", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Null_test", + "LinkTitle": "Null_test", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "" + } + } + ] +} +``` +
    + +### Create a List + +This operation creates a new list in a Sharepoint site. + +#### Required Parameters +- **Site ID**: The ID of the site +- **Body**: The list configuration in JSON format + +
    + Create List +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Body: +{ + "displayName": "Project Tasks", + "columns": [ + { + "name": "TaskName", + "text": { } + }, + { + "name": "DueDate", + "dateTime": { } + }, + { + "name": "Priority", + "choice": { + "choices": ["High", "Medium", "Low"] + } + } + ], + "list": { + "template": "genericList" + } +} +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists/$entity", + "@odata.etag": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b,10", + "createdDateTime": "2024-11-05T10:48:51Z", + "description": "", + "eTag": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b,10", + "id": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b", + "lastModifiedDateTime": "2024-11-05T10:48:52Z", + "name": "Project Tasks", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Project%20Tasks", + "displayName": "Project Tasks", + "createdBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + } +} +``` +
    + +### Get Items Of a List + +This operation retrieves items from a specific list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get List Items +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Top: 1 +Page: 1 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items(fields())", + "@odata.nextLink": "https://graph.microsoft.com/v1.0/sites/tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb/lists/1a64ae23-9cb6-4521-b489-61d558dde9f7/items?$expand=fields&$top=1&$skiptoken=UGFnZWQ9VFJVRSZwX0lEPTE", + "value": [ + { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "createdDateTime": "2024-10-24T11:11:11Z", + "eTag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "id": "1", + "lastModifiedDateTime": "2024-10-24T11:11:11Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/1_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('1')/fields/$entity", + "fields": { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "Title": "Null_test", + "field_2": 10, + "field_3": 123.32, + "field_4": 1, + "id": "1", + "ContentType": "Item", + "Modified": "2024-10-24T11:11:11Z", + "Created": "2024-10-24T11:11:11Z", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Null_test", + "LinkTitle": "Null_test", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "" + } + } + ] +} +``` +
    + +### Update Item Of a List + +This operation updates an existing item in a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Item ID**: The ID of the item to update +- **Body**: The updated values in JSON format + +
    + Update Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 1a64ae23-9cb6-4521-b489-61d558dde9f7 +Item ID: 1 +Body: +{ + "TaskName": "Update Documentation", + "Priority": "Medium", + "DueDate": "2023-11-15T00:00:00Z" +} +``` + +
    +**Response Example** + +```json +{ + "id": "1", + "fields": { + "TaskName": "Update Documentation", + "Priority": "Medium", + "DueDate": "2023-11-15T00:00:00Z" + } +} +``` +
    + +### Delete Item Of a List + +This operation removes an item from a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Item ID**: The ID of the item to delete + +
    + Delete Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,da60e844-ba1d-49bc-b4d4-d5e36bae9019 +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Item ID: 1 +``` + +
    +**Response Example** + +```json +{ + "code": 204, + "status": "No Content", + "message": "Item having id '1' in List '1a64ae23-9cb6-4521-b489-61d558dde9f7' has been deleted." +} +``` +
    + +### Add Item To a List + +This operation adds a new item to a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Body**: The new item's data in JSON format + +
    + Add Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,da60e844-ba1d-49bc-b4d4-d5e36bae9019 +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Body: +{ + "fields": { + "Title": "Prepare Presentation" + } +} +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items/$entity", + "@odata.etag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "createdDateTime": "2024-11-05T11:40:52Z", + "eTag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "id": "69", + "lastModifiedDateTime": "2024-11-05T11:40:52Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/69_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "application": { + "id": "0dc94ee2-9788-443c-8e67-ce714f0fe579", + "displayName": "Microsoft Graph" + }, + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('69')/fields/$entity", + "fields": { + "@odata.etag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "Title": "Prepare Presentation", + "id": "69", + "ContentType": "Item", + "Modified": "2024-11-05T11:40:52Z", + "Created": "2024-11-05T11:40:52Z", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Prepare Presentation", + "LinkTitle": "Prepare Presentation", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "", + "AppAuthorLookupId": "3", + "AppEditorLookupId": "3" + } +} +``` +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/cloud.md b/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/cloud.md index dcc1d67a0a..1ae33456fb 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/cloud.md +++ b/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/cloud.md @@ -3,7 +3,15 @@ id: tooljet-cloud title: ToolJet Cloud --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    ## Choosing Your ToolJet Cloud Subscription @@ -131,4 +139,4 @@ If you have an active subscription, you can find its validity period in the Sett ### 3) What happens if my subscription expires? -If your business or enterprise subscription expires, your instance will revert to operating as a free plan. While you can still create unlimited apps, workspaces, and add users, premium features such as OpenID and Audit logs will no longer be accessible. For further information, please refer to the relevant **[plans](https://www.tooljet.com/pricing)**. +If your business or enterprise subscription expires, your instance will revert to operating as a free plan. While you can still create unlimited apps, workspaces, and add users, premium features such as OpenID and Audit logs will no longer be accessible. For further information, please refer to the relevant **[plans](https://www.tooljet.ai/pricing)**. diff --git a/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/self-hosted.md b/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/self-hosted.md index cf19d3b556..1641b76acc 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/self-hosted.md +++ b/docs/versioned_docs/version-2.50.0-LTS/org-management/licensing/self-hosted.md @@ -3,7 +3,15 @@ id: self-hosted title: Self-Hosted --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    ## Setting up for Licensing @@ -14,7 +22,7 @@ Let's look into three types of licenses: 1. **Trial License**: This is a free license that grants access to premium features for a 14-day trial period. - **New Users**: Choose the 14-day trial during onboarding. - **Existing Users**: Request a trial license key from our sales or support team. -2. **Business License**: This is a paid license that you can purchase **[directly](https://www.tooljet.com/pricing)**. +2. **Business License**: This is a paid license that you can purchase **[directly](https://www.tooljet.ai/pricing)**. 3. **Enterprise License**: This is a paid license with customizable options. To obtain this license, you have to contact our sales team. @@ -109,13 +117,13 @@ If you have an active license, you can find its validity period in the Settings. - Enterprise licenses can be customized to suit your needs. ### 3) What happens if my license expires? -If your business or enterprise license key expires, your instance will revert to operating as a free plan. While you can still create unlimited apps, workspaces, and add users, premium features such as OpenID and Audit logs will no longer be accessible. For further information, please refer to the relevant **[plans](https://www.tooljet.com/pricing)**. +If your business or enterprise license key expires, your instance will revert to operating as a free plan. While you can still create unlimited apps, workspaces, and add users, premium features such as OpenID and Audit logs will no longer be accessible. For further information, please refer to the relevant **[plans](https://www.tooljet.ai/pricing)**. ### 4) How can I add more users? There are different methods to do this: -**a)** You can renew directly using the **[business plan](https://www.tooljet.com/pricing)**. (Note: Please do check the list of premium features available with this plan) +**a)** You can renew directly using the **[business plan](https://www.tooljet.ai/pricing)**. (Note: Please do check the list of premium features available with this plan) **b)** You can directly reach out to us via **[Slack](https://tooljet.com/slack)** or **[email](mailto:hello@tooljet.com)** and we will be happy to provide you the support. diff --git a/docs/versioned_docs/version-2.50.0-LTS/release-management/multi-env.md b/docs/versioned_docs/version-2.50.0-LTS/release-management/multi-env.md index 2739aac27c..5a838ed370 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/release-management/multi-env.md +++ b/docs/versioned_docs/version-2.50.0-LTS/release-management/multi-env.md @@ -3,7 +3,15 @@ id: multi-environment title: Multi-Environment --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    ToolJet's **multi-environment** helps in streamlining workflows, thereby minimizing the chances of errors, and enables effective application management. Using multi-environment ensures that your ToolJet application is rigorously tested before it is made available to users. diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/azure-container.md b/docs/versioned_docs/version-2.50.0-LTS/setup/azure-container.md index 4c08ce2d05..d9c85fe382 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/azure-container.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/azure-container.md @@ -9,8 +9,6 @@ title: Azure container apps Please note that you need to set up a PostgreSQL database manually to be used by ToolJet. Additionally, you must set up a Redis service through Azure Cache for Redis. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - ## Deploying ToolJet application 1. Open the Azure dashboard at https://portal.azure.com, navigate to Container Apps, and click on "Create container app". @@ -37,7 +35,17 @@ Please note that you need to set up a PostgreSQL database manually to be used by - Make sure to provide the image tag, and then enter `server/entrypoint.sh, npm, run, start:prod` in the "Command override" field. - Add the following ToolJet application variables under the "Environmental variable" section. You can refer to this [**documentation**](/docs/setup/env-vars) for more information on environment variables. - **Note: For the minimal setup, ToolJet requires: `TOOLJET_HOST`, `PG_HOST`, `PG_DB`, `PG_USER`, `PG_PASSWORD`, `SECRET_KEY_BASE` & `LOCKBOX_MASTER_KEY` keys in the secret.** + **Note**: ToolJet requires: + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY**
    @@ -119,5 +127,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/choose-your-tooljet.md b/docs/versioned_docs/version-2.50.0-LTS/setup/choose-your-tooljet.md index 2afcf0d9c2..6a6db91ace 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/choose-your-tooljet.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/choose-your-tooljet.md @@ -5,6 +5,10 @@ title: Choose Your ToolJet ToolJet versions are categorized into three main types: **Long-Term Support (LTS)**, **Pre-Release**, and **Past versions**. Understanding these categories helps users choose the most suitable version for their needs. +:::info +ToolJet 3.0 LTS is now live! We encourage all users to upgrade to take advantage of the latest features and improvements. You can find more details about these changes in the 3.0 LTS [release notes](/docs/project-overview/release-notes). +::: + ## Long-Term Support (LTS) Versions We highly recommend using LTS versions for most users. These versions are prioritized for bug fixes, updates, and overall stability, ensuring a reliable experience. LTS versions are ideal for production environments where stability and consistent performance are crucial. @@ -15,6 +19,16 @@ Please find the latest LTS version here:
    | Version | Release Date | Docker Pull Command | |---------|--------------|----------------------| | Latest EE-LTS | N/A | `docker pull tooljet/tooljet:EE-LTS-latest` | +| [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` | +| [v3.0.21-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.21-ee-lts/images/sha256-88de45e3e32df48c7451a9f6ae505f985ca7a32d2b59c3a4ba9f9da992e8cafe?context=explore) | December 20, 2024 | `docker pull tooljet/tooljet:v3.0.21-ee-lts` | +| [v3.0.20-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.20-ee-lts/images/sha256-898f75a8c6a879014b890a47fa8fd6d2be41ea7f77d549bc2616e0db84788fd2?context=explore) | December 20, 2024 | `docker pull tooljet/tooljet:v3.0.20-ee-lts` | +| [v3.0.19-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.19-ee-lts/images/sha256-eb873525f3fe3a5838fcf72d38d1b9d4ffcb661f59e9af4c466f0041de882a0e?context=explore) | December 17, 2024 | `docker pull tooljet/tooljet:v3.0.19-ee-lts` | +| [v3.0.18-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.18-ee-lts/images/sha256-89e309a8a3a40c967e3bddfbb82adff9332d6b72322cf5ad40f575c03bf7dab1?context=explore) | December 12, 2024 | `docker pull tooljet/tooljet:v3.0.18-ee-lts` | +| [EE-LTS-2.50.9.48](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.48/images/sha256-42f834d196fd993eb2ec24dfe38aa850a8b49cdf89916dc42550169b3a5f0966?context=explore) | December 9, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.48` | +| [EE-LTS-2.50.9.47](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.47/images/sha256-88f7ac041f847a4a37421b48b837aeac375017473650ec14b62c9bd4f6aa18e1?context=explore) | November 27, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.47` | +| [EE-LTS-2.50.9.46](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.46/images/sha256-153dbe13c0a0c2803d80eda5ddb5c9c7f918da065495f76a875c8d3986e0b1a1?context=explore) | November 26, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.46` | | [EE-LTS-2.50.9.45](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.45/images/sha256-cb0030d66415ac52d156608fee2de8ce400cd4b2a7b3f865be331d13d939c883?context=explore) | October 24, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.45` | | [EE-LTS-2.50.9.44](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.44/images/sha256-739781626ba3b7a61890d5e6b633099fee12e0e14aa3d176ceafe102f4b4ca98?context=explore) | October 9, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.44` | | [EE-LTS-2.50.9.43](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.43/images/sha256-5d1cdd349872279ff23da9332dc0ec71c4ad637b35b728c44211f21fd206fa1c?context=explore) | October 3, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.43` | @@ -28,13 +42,6 @@ Please find the latest LTS version here:
    | [EE-LTS-2.50.9.35](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.35/images/sha256-8a1b0014d470aff108ad75fd6982e01696740f2154a3bb49f08671b93d55485b?context=explore) | September 3, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.35` | | [EE-LTS-2.50.9.34](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.34/images/sha256-95af52997ec5b42fd5435bfef2f8996d0acc8234ae0541e155705ea4c689b272?context=explore) | August 30, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.34` | | [EE-LTS-2.50.9.33](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.33/images/sha256-e231b959a7e5e1455235d344ceffeaa34b482d925d9676e5169f58e966c59fbb?context=explore) | August 26, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.33` | -| [EE-LTS-2.50.9.32](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.32/images/sha256-e231b959a7e5e1455235d344ceffeaa34b482d925d9676e5169f58e966c59fbb?context=explore) | August 26, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.32` | -| [EE-LTS-2.50.9.31](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.31/images/sha256-9610b8a125ea622a4b07c17657c44e04e1b582df8a18c228bab3a876cdc49407?context=explore) | August 26, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.31` | -| [EE-LTS-2.50.9.30](https://hub.docker.com/layers/tooljet/tooljet/EE-LTS-2.50.9.30/images/sha256-a7b0967aca4c4d29e423a78e91a7084073e2750d0a67fa2a8926d0da5eaf4ad4?context=explore) | August 21, 2024 | `docker pull tooljet/tooljet:EE-LTS-2.50.9.30` | - -:::info -Users are encouraged to upgrade to the latest LTS version to ensure they benefit from the latest improvements and maintain a secure and efficient environment. -::: ## Pre-Release Versions diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/client.md b/docs/versioned_docs/version-2.50.0-LTS/setup/client.md deleted file mode 100644 index 375ec45aee..0000000000 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/client.md +++ /dev/null @@ -1,112 +0,0 @@ ---- -id: client -title: Deploying ToolJet client ---- - -# Deploying ToolJet client - -ToolJet client is a standalone application and can be deployed on static website hosting services such as Netlify, Firebase, S3/Cloudfront, etc. - -You can build standalone client with the below command: -```bash -SERVE_CLIENT=false npm run build -``` - -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - -## Deploying ToolJet client on Firebase - -:::tip -You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend and also set `SERVE_CLIENT` to `false`` for standalone client build. - -For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.com npm run build && firebase deploy` -::: - -1. Initialize firebase project - ```bash - firebase init - ``` - Select Firebase Hosting and set build as the static file directory -2. Deploy client to Firebase - ```bash - firebase deploy - ``` - -## Deploying ToolJet client with Google Cloud Storage - -:::tip -You should set the environment variable `TOOLJET_SERVER_URL` ( URL of the server ) while building the frontend. - - -For example: `SERVE_CLIENT=false TOOLJET_SERVER_URL=https://server.tooljet.io npm run build` -::: - -#### Using Load balancer - -ToolJet client can be hosted from Cloud Storage bucket just like hosting any other static website. -Follow the instructions from google documentation [here](https://cloud.google.com/storage/docs/hosting-static-website). - -Summarizing the steps below: -1. Create a bucket and upload files within the build folder such that the `index.html` is at the bucket root. - -2. Edit permissions for the bucket to assign *New principal* as `allUsers` with role as `Storage Object Viewer` and permit for public access for the bucket. - -3. Click on *Edit website configuration* from the [buckets browser](https://console.cloud.google.com/storage/browser?_ga=2.180838119.1530169400.1637242882-657891227.1637242882) and specify the main page as `index.html` - -4. Follow the [instructions](https://cloud.google.com/storage/docs/hosting-static-website#lb-ssl) on creating a load balancer for hosting a static website. - -5. Optionally, create Cloud CDN to use with the backend bucket assigned to the load balancer. - -6. After the load balancer is created there will be an IP assigned to it. Try hitting it to check the website is being loaded. - -7. Use the load balancer IP as the static IP for the A record of your domain. - -#### Using Google App Engine - -1. Upload the build folder onto a bucket - -2. Upload `app.yaml` file onto bucket with the following config - - ```yaml - runtime: python27 - api_version: 1 - threadsafe: true - - handlers: - - url: / - static_files: build/index.html - upload: build/index.html - - - url: /(.*) - static_files: build/\1 - upload: build/(.*) - ``` - -3. Activate cloud shell on your browser and create build folder - ```bash - mkdir tooljet-assets - ``` - -4. Copy the uploaded files onto an assets folder which is to be served - ```bash - gsutil rsync -r gs://your-bucket-name/path-to-assets ./tooljet-assets - ``` - -5. Deploy static assets to be served - ```bash - cd tooljet-assets && gcloud app deploy - ``` - -## 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`. - -If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. - -#### Prerequisites for Upgrading to the Latest LTS Version: - -- 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. - -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/cloud-v3-migration.md b/docs/versioned_docs/version-2.50.0-LTS/setup/cloud-v3-migration.md index f7b2b824de..171e7f1539 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/cloud-v3-migration.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/cloud-v3-migration.md @@ -163,6 +163,10 @@ After November 11th, applications with the old Kanban Board component will crash - Update all queries and components using these data sources - Test all affected components and queries after migration +#### Action Required After Upgrade + +If you haven't migrated your local data sources to global data sources, you will encounter an error message indicating that local data sources are no longer supported. For detailed instructions on migrating from Local Data Sources to the new Data Sources, please refer to our [Local Data Sources Migration Guide](/docs/data-sources/local-data-sources-migration). + ### Workspace Variables #### Action Required @@ -174,7 +178,7 @@ After November 11th, applications with the old Kanban Board component will crash Workspace Constants are designed to be resolved on the server-side only, ensuring a high level of security. You can assign users to a specific role and provide create, update, and delete access to Workspace Constants. -For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](https://docs.tooljet.com/docs/beta/org-management/workspaces/workspace-variables-migration). +For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](/docs/org-management/workspaces/workspace-variables-migration). ## Response Headers and Metadata @@ -196,7 +200,7 @@ Now, you should use: {{queries..metadata}} ``` -The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/beta/data-sources/restapi/metadata-and-cookies/#metadata). +The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/data-sources/restapi/metadata-and-cookies/#metadata). ## Help and Support diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/digitalocean.md b/docs/versioned_docs/version-2.50.0-LTS/setup/digitalocean.md index a85e9c0d56..72f985114f 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/digitalocean.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/digitalocean.md @@ -3,114 +3,76 @@ id: digitalocean title: DigitalOcean --- -# Deploying ToolJet on DigitalOcean - -Now you can quickly deploy ToolJet using the Deploy to DigitalOcean button. - -If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. - -### Redis setup - -:::info -ToolJet requires configuring Redis which is used for enabling multiplayer editing and for background jobs. -::: - -Follow the steps below to configure Redis database: - -1. Navigate to **Database** and create a database cluster. +Follow the steps below to deploy ToolJet on a DigitalOcean Droplet. +**1. Navigate to the Droplets section in DigitalOcean.** +
    - ToolJet - Deploy on DigitalOcean + create a Droplet
    -2. Select `Redis` from the database engine and add a unique name to the cluster and click on **Create Database cluster**. +**2. Configure the **Droplet** with the following options:** + + - **Image**: Ubuntu + - **Plan**: Choose a plan (e.g., Basic, 4GB RAM, 2 vCPU)
    - - ToolJet - Deploy on DigitalOcean - + use a droplet plan
    + + - **Auth**: For authentication, use password or ssh + - Click **Create Droplet** and note the assigned public IP -3. Once the set-up is complete, add the Redis connection string in the environmental variable of `tooliet-app`. +**3. Create a Firewall for the **Droplets** to allow required ports.** + + protocol | port | allowed_cidr| + :---| :---------- | :---------- | + tcp | 22 | your IP | + tcp | 80 | 0.0.0.0/0 | + tcp | 443 | 0.0.0.0/0 | -## Deploying +**4. Connect to the **Droplets** via SSH.** + +**5. Install Docker and Docker Compose using the following commands:** -#### Follow the steps below to deploy ToolJet on DigitalOcean: +```bash +apt update && apt upgrade -y +apt install -y docker.io +``` -1. Click on the button below to start one click deployment +Enable and start Docker: -
    +```bash +systemctl enable docker +systemctl start docker +``` - [![Deploy to DigitalOcean](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/ToolJet/ToolJet/tree/main) +Install Docker Compose: -
    +```bash +apt install -y curl +curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose +chmod +x /usr/local/bin/docker-compose +``` -2. A new tab will open up, sign-in to your DigitalOCean account. Once signed-in, the **Create App** page will open up and **Resources** will be already selected. Click on **Next** button. +Verify installation: -
    +```bash +docker --version +docker-compose --version +``` - ToolJet - Deploy on DigitalOcean - Resources +**6. Update the `TOOLJET_HOST` in the `.env` file:** -
    +`TOOLJET_HOST=http://:80` -3. Now, on **Environment Variables** page you can add new variables or edit the existing ones. Check the [environment variables here](/docs/setup/env-vars). - - Also, please add the redis url in the environment variable `REDIS_URL= #connection string` - -
    - - ToolJet - Deploy on DigitalOcean - Environment Variables - -
    - -4. On the next page, you can change the **App name**, **Project**, and the **Region**. - -
    - - ToolJet - Deploy on DigitalOcean - Launch - -
    - -5. On the last page, you'll be asked to **Review** all the app details such that we entered before such as **Resources**, **Environment Variables**, **Region**, and there will also be **Billing** section at the end. Review all the details and click the **Create Resource** button. - -
    - - ToolJet - Deploy on DigitalOcean - Launch - -
    - -6. Once you click the **Create Resource** button, the build will begin. Once the build is complete, you'll see the resource and a **URL** next to it. Click on the URL to open the deployed **ToolJet**. - -:::tip -ToolJet server and client can be deployed as standalone applications. If you do not want to deploy the client on DigitalOcean, modify `package.json` accordingly. We have a [guide](/docs/setup/client) on deploying ToolJet client using services such as Firebase. -::: - -## Deploying ToolJet Database - -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. -You can learn more about this feature [here](/docs/tooljet-database). - -Follow the steps below to deploy ToolJet Database on DigitalOcean: - -1. If you are using dev database within ToolJet deployment, upgrade it to managed database. You could also add a separate database, if you intent use a different database, please refer the [environment variables](/docs/setup/env-vars#enable-tooljet-database--optional-) for additional env variables. - -2. Create a new app for PostgREST server. You can opt for docker hub to deploy PostgREST image of version `10.1.x`. - - ToolJet - Deploy on DigitalOcean - PostgREST resource - -3. Update the [environment variables](/docs/setup/env-vars#postgrest-server-optional) for PostgREST and expose the HTTP port `3000`. - - ToolJet - Deploy on DigitalOcean - PostgREST environment variables - -4. Add your newly created PostgREST app to the trusted sources of your managed or separate database. - -5. Update your existing ToolJet application deployment with [environment variables](/docs/setup/env-vars#enable-tooljet-database--optional-) required for PostgREST. +**7. Use the [Docker Documentation](https://docs.tooljet.ai/docs/2.50.0-LTS/setup/docker) to deploy ToolJet.** ## 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`. +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`. If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. @@ -120,4 +82,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com. diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/docker.md b/docs/versioned_docs/version-2.50.0-LTS/setup/docker.md index 7adc581aa1..4a72cb3413 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/docker.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/docker.md @@ -14,8 +14,6 @@ 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/). ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - ### Installing Docker and Docker Compose Install docker and docker-compose on the server. - Docs for [Docker Installation](https://docs.docker.com/engine/install/) @@ -164,9 +162,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - - - - - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/ec2.md b/docs/versioned_docs/version-2.50.0-LTS/setup/ec2.md index 008ef3162f..54999ce9fb 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/ec2.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/ec2.md @@ -9,8 +9,6 @@ title: AWS EC2 You should setup a PostgreSQL database manually to be used by the ToolJet server. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - 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 EC2 instances. To deploy all the services at once, simply employ the following template: @@ -21,15 +19,10 @@ curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/cloudformation/E Follow the steps below to deploy ToolJet on AWS EC2 instances. 1. Setup a PostgreSQL database and make sure that the database is accessible from the EC2 instance. - 2. Login to your AWS management console and go to the EC2 management page. - -3. Under the `Images` section, click on the `AMIs` button. - +3. Under the **Images** section, click on the **AMIs** button. 4. Find the [ToolJet version](https://github.com/ToolJet/ToolJet/releases) you want to deploy. Now, from the AMI search page, select the search type as "Public Images" and input the version you'd want `AMI Name : tooljet_EE-LTS-x.xx.ubuntu_focal` in the search bar. - -5. Select ToolJet's AMI and bootup an EC2 instance. - +5. Select ToolJet's AMI and bootup an EC2 instance.
    Creating a new security group is recommended. For example, if the installation should receive traffic from the internet, the inbound rules of the security group should look like this: protocol| port | allowed_cidr| @@ -39,19 +32,22 @@ Follow the steps below to deploy ToolJet on AWS EC2 instances. tcp | 443 | 0.0.0.0/0 | -6. Once the instance boots up, SSH into the instance by running `ssh -i ubuntu@` +6. Once the instance boots up, SSH into the instance by running `ssh -i ubuntu@`. -7. Switch to the app directory by running `cd ~/app`. Modify the contents of the `.env` file. ( Eg: `vim .env` ) +7. Switch to the app directory by running `cd ~/app`.
    Modify the contents of the `.env` file. ( Eg: `vim .env` ) The default `.env` file looks like this: ```bash - TOOLJET_HOST=http:// - LOCKBOX_MASTER_KEY= - SECRET_KEY_BASE= - PG_DB=tooljet_prod - PG_USER= - PG_HOST= - PG_PASS= + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + PG_DB= + PG_USER= + PG_HOST= + PG_PASS= + TOOLJET_DB= + TOOLJET_DB_HOST= + TOOLJET_DB_USER= + TOOLJET_DB_PASS= ``` Read **[environment variables reference](/docs/setup/env-vars)** @@ -59,32 +55,30 @@ Follow the steps below to deploy ToolJet on AWS EC2 instances. 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. ::: -8. `TOOLJET_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. +8. `TOOLJET_DB_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. Examples: - `TOOLJET_HOST=http://12.34.56.78` or - `TOOLJET_HOST=https://yourdomain.com` or - `TOOLJET_HOST=https://tooljet.yourdomain.com` + `TOOLJET_DB_HOST=http://12.34.56.78` or + `TOOLJET_DB_HOST=https://yourdomain.com` or + `TOOLJET_DB_HOST=https://tooljet.yourdomain.com` :::info We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. ::: :::info - Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + Please make sure that `TOOLJET_DB_HOST` starts with either `http://` or `https://` ::: 9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. - 10. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the EC2 instance. - 12. You're all done, ToolJet client would now be served at the value you've set in `TOOLJET_HOST`. #### Deploying ToolJet Database ToolJet AMI comes inbuilt with PostgREST. If you intend to use this feature, you'd only have to setup the environment variables in `~/app/.env` file and run `./setup_app` script. -You can learn more about this feature [here](/docs/tooljet-database). +You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). ## Upgrading to the Latest LTS Version @@ -98,10 +92,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - - - - - - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/ecs.md b/docs/versioned_docs/version-2.50.0-LTS/setup/ecs.md index 4b75185004..3c154d5fd4 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/ecs.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/ecs.md @@ -34,34 +34,16 @@ To deploy Redis on an ECS cluster, please follow the steps outlined below. Please note that if you already have an existing Redis setup, you can continue using it. However, if you need to create a new Redis service, you can follow the steps provided below. - Create a new take definition - -
    - ECS Setup - -
    - - -- Please add container and image tag as shown below: +- Please add container and image tag as shown below:
    **Make sure that you are using redis version 6.x.x** - -
    - ECS Setup -
    - -- Ensure that when creating a service, Redis is integrated into the same cluster where your ToolJet app will be deployed. - +- Ensure that when creating a service, Redis is integrated into the same cluster where your ToolJet app will be deployed.
    **Note: Please enable public IP** - -
    - ECS Setup -
    - ## ToolJet Follow the steps below to deploy ToolJet on a ECS cluster. @@ -70,108 +52,68 @@ Follow the steps below to deploy ToolJet on a ECS cluster. 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 + 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 - i. Select Fargate as launch type compatibility - - ii. Configure IAM roles and set operating system family as Linux. - - iii. Select task size to have 3GB of memory and 1vCpu + 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 -
    + :::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_MASTER_KEY** +
    +
    + Read **[environment variables reference](/docs/setup/env-vars)** + ::: - ECS Setup - -
    - - iv. 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 - -
    - - 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 - -
    - - :::info - For the minimal setup, ToolJet requires: `TOOLJET_HOST`, `PG_HOST`, `PG_DB`, `PG_USER`, `PG_PASSWORD`, `SECRET_KEY_BASE` & `LOCKBOX_MASTER_KEY` keys in the secret. - - Read **[environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)** - ::: - - Additionally, include the Redis environment variables within the ToolJet container mentioned above if you have followed the previous steps to create Redis. - - ``` - REDIS_HOST= - REDIS_PORT=6379 - REDIS_USER=default - REDIS_PASSWORD= - ``` - - v. Make sure `Use log collection checked` and `Docker configuration` with the command `npm run start:dev` - -
    - - ECS Setup - -
    + Additionally, include the Redis environment variables within the ToolJet container mentioned above if you have followed the previous steps to create Redis. + ``` + REDIS_HOST= + REDIS_PORT=6379 + REDIS_USER=default + REDIS_PASSWORD= + ``` + 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 - -
    - + 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 - -
    - + 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 - -
    - + 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. ::: - ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. You can learn more about this feature [here](https://docs.tooljet.com/docs/tooljet-database). +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). Follow the steps below to deploy PostgREST on a ECS cluster. @@ -191,7 +133,7 @@ Follow the steps below to deploy PostgREST on a ECS cluster.
    - Under environmental variable please add corresponding PostgREST env variables. You can also refer [env variable](https://docs.tooljet.com/docs/setup/env-vars/#postgrest-server-optional). + Under environmental variable please add corresponding PostgREST env variables. You can also refer [env variable](/docs/setup/env-vars).
    @@ -225,7 +167,7 @@ Follow the steps below to deploy PostgREST on a ECS cluster.
    -Update ToolJet deployment with the appropriate env variables [here](https://docs.tooljet.com/docs/setup/env-vars/#enable-tooljet-database--optional-) and apply the changes. +Update ToolJet deployment with the appropriate env variables [here](/docs/setup/env-vars/#enable-tooljet-database-required) and apply the changes. ## Upgrading to the Latest LTS Version @@ -239,5 +181,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/env-vars.md b/docs/versioned_docs/version-2.50.0-LTS/setup/env-vars.md index dfdb6df514..145fb53468 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/env-vars.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/env-vars.md @@ -213,7 +213,7 @@ This is used to set up for CSP headers and put trace info to be used with APM ve | variable | description | | ------------------ | ------------------------------------------------------------ | -| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: `https://server.tooljet.com` ) | ### RELEASE VERSION ( optional) @@ -254,6 +254,14 @@ Configurations for instance level SSO. | SSO_DISABLE_SIGNUPS | Disable user sign up if authenticated user does not exist | | SSO_SKIP_LOGIN_SCREEN | Set to `true` to enable automatic SSO login. Only works when a single SSO method is configured and password login is disabled | +### Enable Cookie Forwarding to REST API (Optional) + +By default, the ToolJet server does not forward cookies along with the REST API requests. You can enable this functionality by setting the `FORWARD_RESTAPI_COOKIES` environment variable to `true`. This option is available only in the self-hosted version of ToolJet. + +| variable | description | +| ----------------------- | ------------------------------------------------------------ | +| FORWARD_RESTAPI_COOKIES | `true` or `false` + ## ToolJet client ### Server URL ( optionally required ) @@ -262,7 +270,7 @@ This is required when client is built separately. | variable | description | | ------------------ | ------------------------------------------------------------ | -| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: https://server.tooljet.com ) | +| TOOLJET_SERVER_URL | the URL of ToolJet server ( eg: `https://server.tooljet.com` ) | ### Server Port ( optional) @@ -297,9 +305,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/google-cloud-run.md b/docs/versioned_docs/version-2.50.0-LTS/setup/google-cloud-run.md index 5469502651..a2985f2e3d 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/google-cloud-run.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/google-cloud-run.md @@ -9,11 +9,8 @@ title: Google Cloud Run You should setup a PostgreSQL database manually to be used by ToolJet. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - Follow the steps below to deploy ToolJet on Cloud run with `gcloud` CLI. - ## Deploying ToolJet application 1. Create a new Google Cloud Run Service: @@ -72,13 +69,9 @@ Click on deploy once the above parameters are set. 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. ::: +## Deploying ToolJet Database - - - -### Deploying ToolJet Database - -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. #### PostgREST server @@ -120,7 +113,7 @@ If you intend to use this feature, you'd have to set up and deploy PostgREST ser port-and-capacity-postgrest
    -5. Under environmental variable please add corresponding ToolJet database env variables. You can also refer [env variable](/docs/setup/env-vars/#enable-tooljet-database--optional-). +5. Under environmental variable please add corresponding ToolJet database env variables. You can also refer [env variable](/docs/setup/env-vars). 6. Please go to connection tab. Under Cloud SQL instance please select the PostgreSQL database which you have set-up for ToolJet application or the separate PostgreSQL database created respective to ToolJet Database from the drop-down option. @@ -138,7 +131,7 @@ Once the Service is created and live, to make the Cloud Service URL public. Ple -7. Additional Environmental variable to be added to ToolJet application or ToolJet Server connect to PostgREST server. You can also refer env variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-) +7. Additional Environmental variable to be added to ToolJet application or ToolJet Server connect to PostgREST server. You can also refer env variable [**here**](/docs/setup/env-vars)
    @@ -158,4 +151,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. \ No newline at end of file +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/helm.md b/docs/versioned_docs/version-2.50.0-LTS/setup/helm.md index 3ed47dac3a..da51035a13 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/helm.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/helm.md @@ -7,8 +7,6 @@ title: Helm This repository contains Helm charts for deploying [ToolJet](https://github.com/ToolJet/helm-charts) on a Kubernetes Cluster using Helm v3. The charts include an integrated PostgreSQL server that is enabled by default. However, you have the option to disable it and configure a different PostgreSQL server by updating the `values.yml` file. -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - ## Installation ### From Helm repo @@ -17,21 +15,21 @@ helm repo add tooljet https://github.com/ToolJet/helm-charts.git helm install tooljet tooljet/tooljet ``` -### From the source +### From the Source 1. Clone the repository and navigate to this directory -2. Run `helm dependency update +2. Run `helm dependency update` 3. It is recommended but optional to modify the values in the `values.yaml` file, such as usernames, passwords, persistence settings, etc. 4. Run `helm install -n $NAMESPACE --create-namespace $RELEASE .` Remember to replace the variables with your specific configuration values. -**ToolJet Database** +## ToolJet Database ToolJet offers a hosted database solution that allows you to build applications quickly and manage your data effortlessly. The ToolJet database requires no setup and provides a user-friendly interface for data management. -For more information about the ToolJet database, you can visit [here](/docs/tooljet-database). +For more information about the ToolJet database, you can visit [here](/docs/tooljet-db/tooljet-database). -If you plan to use this feature, you need to set up and deploy the PostgREST server, which facilitates querying the ToolJet Database. +You need to set up and deploy the PostgREST server, which facilitates querying the ToolJet Database. To enable the ToolJet database, please set the environment variable `ENABLE_TOOLJET_DB` to true in the `values.yaml` file. @@ -47,4 +45,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. \ No newline at end of file +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-aks.md b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-aks.md index 6d8ea82abb..493b5fa77b 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-aks.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-aks.md @@ -9,8 +9,6 @@ title: Kubernetes (AKS) 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. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - 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). @@ -21,7 +19,25 @@ Follow the steps below to deploy ToolJet on a AKS Kubernetes cluster. curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/AKS/deployment.yaml ``` -Make sure to edit the environment variables in the `deployment.yaml`. We advise to use secrets to setup sensitive information. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). +:::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** +
    +
    + Read **[environment variables reference](/docs/setup/env-vars)** +::: + +Make sure to edit the environment variables in the `deployment.yaml`. We advise to use secrets to setup sensitive information. 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. @@ -40,11 +56,9 @@ If there are self signed HTTPS endpoints that ToolJet needs to connect to, pleas You will be able to access your ToolJet installation once the pods and services running. - - ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required). 1. Setup PostgREST server @@ -66,4 +80,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-eks.md b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-eks.md index 8d4882ea60..e98093d919 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-eks.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-eks.md @@ -6,7 +6,7 @@ title: Kubernetes (EKS) Follow the steps below to deploy ToolJet on an EKS Kubernetes cluster. :::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](https://docs.tooljet.com/docs/setup/system-requirements#database-software) +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/setup/system-requirements#database-software) ::: 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). @@ -19,7 +19,25 @@ _The file below is just a template and might not suit production environments. Y 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](https://docs.tooljet.com/docs/setup/env-vars). +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). + +:::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** +
    +
    + Read **[environment variables reference](/docs/setup/env-vars)** +::: 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. @@ -28,7 +46,7 @@ Make sure to edit the environment variables in the `deployment.yaml`. We advise ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy a PostgREST server, which helps in querying the ToolJet Database. Please [follow the instructions here](https://docs.tooljet.com/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration. +To use ToolJet Database, you'd have to set up and deploy a PostgREST server, which helps in querying the ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required). 1. Set up PostgREST server @@ -50,4 +68,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. \ No newline at end of file +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-gke.md b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-gke.md index 51c81d2515..ddc86dc290 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-gke.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes-gke.md @@ -9,8 +9,6 @@ title: Kubernetes (GKE) You should setup a PostgreSQL database manually to be used by ToolJet. We recommend using Cloud SQL since this guide is for deploying using GKE. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - Follow the steps below to deploy ToolJet on a GKE Kubernetes cluster. 1. Create an SSL certificate. @@ -33,7 +31,24 @@ gcloud compute addresses create tj-static-ip --global curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/GKE/deployment.yaml ``` -Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](https://docs.tooljet.com/docs/setup/env-vars). +Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). + +:::info + For the setup, ToolJet requires: +
      + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** +
    + Read **[environment variables reference](/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. @@ -65,12 +80,9 @@ It might take a few minutes to provision the managed certificates. [Managed cert You will be able to access your ToolJet installation once the pods, service and the ingress is running. - - - ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required). 1. Setup PostgREST server @@ -92,4 +104,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes.md b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes.md index f9735e3d04..97258cf566 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/kubernetes.md @@ -9,17 +9,25 @@ title: Kubernetes You should setup a PostgreSQL database manually to be used by ToolJet. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - Follow the steps below to deploy ToolJet on a Kubernetes cluster. -1. Setup a PostgreSQL database +1. **Setup a PostgreSQL database**
    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 minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. +2. **Create a Kubernetes secret with name `server`.**
    + For the setup, ToolJet requires: + + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** Read **[environment variables reference](/docs/setup/env-vars)** - 3. Create a Kubernetes deployment ```bash @@ -53,7 +61,7 @@ If you want to serve ToolJet client from services such as Firebase or Netlify, p ## ToolJet Database -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required) for additional environment variables configuration to be done. 1. Setup PostgREST server @@ -75,4 +83,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/openshift.md b/docs/versioned_docs/version-2.50.0-LTS/setup/openshift.md index 6e5630a311..453fe45944 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/openshift.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/openshift.md @@ -9,15 +9,23 @@ title: Openshift You should setup a PostgreSQL database manually to be used by ToolJet. ::: -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - 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. We do not have plans to support other databases such as MySQL. -2. Create a Kubernetes secret with name `server`. For the minimal setup, ToolJet requires `pg_host`, `pg_db`, `pg_user`, `pg_password`, `secret_key_base` & `lockbox_key` keys in the secret. +2. Create a Kubernetes secret with name `server`. For the setup, ToolJet requires: + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** -Read **[environment variables reference](https://docs.tooljet.com/docs/setup/env-vars)** +Read **[environment variables reference](/docs/setup/env-vars)** 3. Once you have logged into the Openshift developer dashboard click on `+Add` tab. Select import YAML from the local machine. @@ -31,7 +39,6 @@ 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 ``` @@ -46,7 +53,7 @@ curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/servic Once you have added the files click on create. -:info +:::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. ::: @@ -61,9 +68,9 @@ If there are self signed HTTPS endpoints that ToolJet needs to connect to, pleas ## ToolJet Database -You can know more about tooljet database [here](https://docs.tooljet.com/docs/tooljet-database) +You can know more about tooljet database [here](/docs/tooljet-db/tooljet-database) -If you intend to use this feature, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](https://docs.tooljet.com/docs/setup/env-vars/#enable-tooljet-database--optional-) for additional environment variables configuration to be done. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database. Please [follow the instructions here](/docs/setup/env-vars/#enable-tooljet-database-required). ``` https://tooljet-deployments.s3.us-west-1.amazonaws.com/openshift/postgrest.yaml @@ -81,4 +88,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/tooljet-subpath.md b/docs/versioned_docs/version-2.50.0-LTS/setup/tooljet-subpath.md index a869af9559..2f1f63fb80 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/tooljet-subpath.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/tooljet-subpath.md @@ -5,8 +5,6 @@ title: Deploying ToolJet on a subpath ToolJet can now be deployed at a subpath rather than the root (`/`) of a public domain. Example subpath installation URL: **`http://www.yourcompany.com/apps/tooljet`** -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - You'll need to setup the following environment variables if ToolJet installation is on a domain subpath: | variable | value | @@ -33,6 +31,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. -For specific issues or questions, refer to our **[Slack](https://tooljet.slack.com/join/shared_invite/zt-25438diev-mJ6LIZpJevG0LXCEcL0NhQ#)**. - - +*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/try-tooljet.md b/docs/versioned_docs/version-2.50.0-LTS/setup/try-tooljet.md index 06b6b4e373..bc74a47674 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/try-tooljet.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/try-tooljet.md @@ -18,14 +18,12 @@ docker run \ -v tooljet_data:/var/lib/postgresql/13/main \ tooljet/try:EE-LTS-latest ``` -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* - #### Setup information - Runs the ToolJet server on the port 80 on your machine. - Container has postgres already configured within. All the data will be available in the docker volume `tooljet_data`. -- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](https://docs.tooljet.com/docs/setup/env-vars). +- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](/docs/setup/env-vars). - Use `docker stop tooljet` to stop the container and `docker start tooljet` to start the container thereafter. #### Dynamic Port Setup @@ -47,5 +45,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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-lts.md b/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-lts.md index 63dc13f61c..1ffadd0edf 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-lts.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-lts.md @@ -20,16 +20,14 @@ ToolJet will be releasing new LTS versions every 3-5 months with an end-of-life The upgrade process depends on your deployment method. You can follow the upgrade process under the respective setup guides: -- [Upgrade ToolJet on DigitalOcean](/docs/setup/digitalocean#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on Docker](/docs/setup/docker#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on AWS EC2](/docs/setup/ec2#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on AWS ECS](/docs/setup/ecs#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on OpenShift](/docs/setup/openshift#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on Helm](/docs/setup/helm#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on Kubernetes](/docs/setup/kubernetes#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on Kubernetes(GKE)](/docs/setup/kubernetes-gke#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on Kubernetes(AKS)](/docs/setup/kubernetes-aks#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on Azure Container Apps](/docs/setup/azure-container#upgrading-to-the-latest-lts-version) -- [Upgrade ToolJet on Google Cloud Run](/docs/setup/google-cloud-run#upgrading-to-the-latest-lts-version) - - +- [Upgrade ToolJet on DigitalOcean](/docs/2.50.0-lts/setup/digitalocean#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Docker](/docs/2.50.0-lts/setup/docker#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on AWS EC2](/docs/2.50.0-lts/setup/ec2#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on AWS ECS](/docs/2.50.0-lts/setup/ecs#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on OpenShift](/docs/2.50.0-lts/setup/openshift#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Helm](/docs/2.50.0-lts/setup/helm#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Kubernetes](/docs/2.50.0-lts/setup/kubernetes#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Kubernetes(GKE)](/docs/2.50.0-lts/setup/kubernetes-gke#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Kubernetes(AKS)](/docs/2.50.0-lts/setup/kubernetes-aks#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Azure Container Apps](/docs/2.50.0-lts/setup/azure-container#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Google Cloud Run](/docs/2.50.0-lts/setup/google-cloud-run#upgrading-to-the-latest-lts-version) diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-v3.md b/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-v3.md index 035016d193..6509158313 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-v3.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/upgrade-to-v3.md @@ -1,8 +1,7 @@ --- id: upgrade-to-v3 -title: ToolJet 3.0 (Beta) Migration Guide Self-Hosted +title: ToolJet 3.0 Migration Guide Self-Hosted --- -# ToolJet 3.0 (Beta) Migration Guide Self-Hosted This documentation will help you upgrade your application from ToolJet v2.50.0-LTS to the pre-release/beta version of ToolJet 3.0. @@ -14,11 +13,11 @@ Before upgrading, we recommend reviewing your existing applications for any usag For complex applications, we also recommend setting up thorough testing procedures to ensure your apps function correctly after the upgrade. ::: -## Upgrading to 3.0 Beta Preview +## Upgrading to ToolJet 3.0 ### Prerequisites ⚠️ -Before attempting to upgrade to the 3.0 Beta Preview: +Before attempting to upgrade to the ToolJet 3.0: - **Database Backup**: Create a complete backup of your database - **Application Review**: Check your apps for breaking and deprecated features listed in this guide. @@ -27,7 +26,7 @@ Before attempting to upgrade to the 3.0 Beta Preview: To upgrade, update your Docker image to: ```bash -tooljet/tooljet:v3.0.0-ee-beta.1 +tooljet/tooljet:v3.0.0-ee-lts ``` :::warning This is a beta release. Test thoroughly in a non-production environment first. @@ -186,6 +185,10 @@ After the 3.0 upgrade, applications with the old Kanban Board component will cra - Update all queries and components using these data sources - Test all affected components and queries after migration +#### Action Required After Upgrade + +If you haven't migrated your local data sources to global data sources, you will encounter an error message indicating that local data sources are no longer supported. For detailed instructions on migrating from Local Data Sources to the new Data Sources, please refer to our [Local Data Sources Migration Guide](/docs/data-sources/local-data-sources-migration). + ### Workspace Variables #### Action Required @@ -197,7 +200,7 @@ After the 3.0 upgrade, applications with the old Kanban Board component will cra Workspace Constants are designed to be resolved on the server-side only, ensuring a high level of security. You can assign users to a specific role and provide create, update, and delete access to Workspace Constants. -For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](https://docs.tooljet.com/docs/beta/org-management/workspaces/workspace-variables-migration). +For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](/docs/org-management/workspaces/workspace-variables-migration). ## Response Headers and Metadata @@ -219,21 +222,20 @@ Now, you should use: {{queries..metadata}} ``` -The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/beta/data-sources/restapi/metadata-and-cookies/#metadata). +The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/data-sources/restapi/metadata-and-cookies/#metadata). ## System Changes ### ToolJet Database -ToolJet Database is now a core requirement for the 3.0 beta. You'll need to manually enable the ToolJet Database feature at the instance level. This is a temporary requirement - in the final 3.0.0 LTS release, the ToolJet Database will be automatically enabled and configured by default. +ToolJet Database is now a core requirement for the ToolJet 3.0. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database.
    +Please check the environment variables that you need to configure to set up: +- [PostgREST](/docs/setup/env-vars#postgrest-server-required) +- [ToolJet Database](/docs/setup/env-vars#enable-tooljet-database-required) -#### Beta Testing Requirements + -- Enable ToolJet Database for your instance (see required environment variables [here](/docs/beta/setup/env-vars/#enable-tooljet-database--optional-)) - -:::note -This manual configuration is only needed during the beta testing phase. When 3.0.0 LTS is released, the ToolJet Database will be automatically enabled and ready to use out of the box. -::: ## Help and Support diff --git a/docs/versioned_docs/version-2.50.0-LTS/setup/v2-migration.md b/docs/versioned_docs/version-2.50.0-LTS/setup/v2-migration.md index 00b3499668..317a5f2135 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/setup/v2-migration.md +++ b/docs/versioned_docs/version-2.50.0-LTS/setup/v2-migration.md @@ -8,12 +8,11 @@ ToolJet version 2 comes with a bunch of exciting features, with the major ones b 1. Multi page 2. Multi env 3. Forms widget -4. [Database](/docs/tooljet-database) (Requires opt-in) -5. [Marketplace](/docs/marketplace) (Requires opt-in) +4. [Database](/docs/tooljet-db/tooljet-database) (Requires opt-in) +5. [Marketplace](/docs/marketplace/marketplace-overview) (Requires opt-in) Checkout the latest changelog for v2 [here](https://github.com/ToolJet/ToolJet/releases). -*If you have any questions feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* ## Deployment Based on your opted deployment method from our [setup doc](/docs/setup/), you can directly deploy v2 without any additional configuration for the default setup. diff --git a/docs/versioned_docs/version-2.50.0-LTS/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-2.50.0-LTS/tooljet-db/tooljet-database.md index d0860f5db6..4f6d9b7a05 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-2.50.0-LTS/tooljet-db/tooljet-database.md @@ -17,7 +17,7 @@ Requires: - PostgREST server - Additional configuration for ToolJet server -This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enable-tooljet-database--optional-) is set to `true`. +This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars) is set to `true`.
    @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: @@ -88,7 +89,7 @@ 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.com)**, **[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.ai)**, **[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-2.50.0-LTS/tutorial/creating-app.md b/docs/versioned_docs/version-2.50.0-LTS/tutorial/creating-app.md index 08d97e2496..425ef29e39 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/tutorial/creating-app.md +++ b/docs/versioned_docs/version-2.50.0-LTS/tutorial/creating-app.md @@ -25,7 +25,8 @@ You will be redirected to the visual app editor once the app has been created. C
    The main components of an app: +an app: -- **[Widgets](https://docs.tooljet.com/docs/tutorial/adding-widget)** - UI components such as tables, buttons, dropdowns. -- **[Data sources](https://docs.tooljet.com/docs/tutorial/adding-a-datasource)** - ToolJet can connect to databases, APIs and external services to fetch and modify data. -- **[Queries](https://docs.tooljet.com/docs/tutorial/building-queries)** - Queries are used to access the connected data sources. \ No newline at end of file +- **[Widgets](/docs/tutorial/adding-widget)** - UI components such as tables, buttons, dropdowns. +- **[Data sources](/docs/tutorial/adding-a-datasource)** - ToolJet can connect to databases, APIs and external services to fetch and modify data. +- **[Queries](/docs/tutorial/building-queries)** - Queries are used to access the connected data sources. \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/auto-sso-login.md b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/auto-sso-login.md index b9f38425b3..c8d0dd64e2 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/auto-sso-login.md +++ b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/auto-sso-login.md @@ -3,7 +3,15 @@ id: auto-sso-login title: Automatic SSO Login --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    ToolJet supports automatic SSO login for your workspace, allowing users to bypass the login screen and directly access the application when only one SSO method is configured. diff --git a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/ldap.md b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/ldap.md index 5b5071bf42..cc20f53541 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/ldap.md +++ b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/ldap.md @@ -6,20 +6,12 @@ title: LDAP To set up LDAP as Single Sign-On (SSO) for ToolJet, follow these steps: 1. Access the ToolJet dashboard and click on the ⚙️ icon to open **Workspace Settings** from the left sidebar. + SSO :LDAP -
    - SSO :LDAP +2. In the Workspace Settings, navigate to the **Workspace login** section and choose **LDAP**. By default, LDAP login will be **disabled**. + SSO :LDAP -
    - -2. In the Workspace Settings, navigate to the **SSO** section and choose **LDAP**. By default, LDAP login will be **disabled**. - -
    - - SSO :LDAP - -
    3. To **enable** LDAP, toggle the switch. Then, add the configuration: @@ -28,39 +20,20 @@ To set up LDAP as Single Sign-On (SSO) for ToolJet, follow these steps: - **Port**: Enter the Port number of LDAP server. - **Base DN**: Enter the base distinguished name. - **SSL**: Toggle this option to enable the SSL. After enabling you can select the type of SSL: **None** or **Certificates**. If you choose Certificates, you'll need to provide the **Client Key**, **Client Certificate**, and **Server Certificate**. +
    + SSO :LDAP -
    - - SSO :LDAP - -
    4. After making the necessary configurations, click the Save Changes button located at the bottom. - -5. Next, proceed to the **[General Settings](/docs/user-authentication/general-settings)** and copy the **Login URL** provided. Furthermore, you have the flexibility to choose whether to turn on 'Enable Signups,' allowing users to signup without an invite. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. Conversely, with this option disabled, only invited users can log in, provided SSO authentication is successful. - -
    - - SSO :LDAP - -
    +5. Next, proceed to the **Workspace login** and copy the **Login URL** provided. Furthermore, you have the flexibility to choose whether to turn on 'Enable Signups' allowing users to signup without an invite. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. Conversely, with this option disabled, only invited users can log in, provided SSO authentication is successful. + SSO :LDAP 6. The **Login URL** obtained can be utilized for accessing the workspace. Please note that ToolJet supports LDAP login at the workspace level and not at the instance level. Thus, users will be logged in specifically to the chosen workspace. - -
    - - SSO :LDAP - -
    + SSO :LDAP 7. Click on the **Sign in with ``** button, and provide your username and password to log in to the workspace. For signing in, ToolJet uses the **common name (cn)** associated with each LDAP server user as the **Username**. Upon the initial login, users will be redirected to the **Workspace Invite** page, while subsequent logins will lead them directly to the ToolJet dashboard. - -
    - - SSO :LDAP - -
    + SSO :LDAP :::info 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. diff --git a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/openid/setup.md b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/openid/setup.md index 709a6eeeac..cbf3fcf70e 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/openid/setup.md +++ b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/openid/setup.md @@ -3,7 +3,15 @@ id: setup title: OpenID Setup --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    # Configure OpenId Connect Single Sign-on diff --git a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/saml.md b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/saml.md index 39b78fbb10..8abebf192c 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/saml.md +++ b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/sso/saml.md @@ -5,83 +5,77 @@ title: SAML ToolJet supports SAML authentication for your workspace. The supported SAML providers are: Okta, Active Directory Federation Services, Azure AD, Auth0 and other SAML SSO providers. -
    +
    -### Configuring SAML +## Configuring SAML To enable SAML authentication, you need to configure the following workspace settings: -1. Go to **Workspace Settings** > **SSO** > **SAML**. - -
    - - SSO :SAMP - -
    +1. Go to **Workspace Settings** > **Workspace login**. + SSO :SAMP 2. By default, SAML is disabled. Toggle it on to enable SAML authentication. - -
    - - SSO :SAMP - -
    + SSO :SAMP 3. Enter the following configuration details: + - **SAML Provider Name**: Enter the name of your SAML provider. This name will be displayed on the login page. + - **Identity provider metadata**: Upload the data from the metadata file provided by your SAML provider. This file contains the SAML configuration details. + - **Group Attribute**: Enter the name of the attribute that contains the group information of the user. This attribute is used to map the user to the appropriate group. + - **Redirect URL**: Copy the redirect URL provided and paste it in the SAML provider's configuration page. - - **SAML Provider Name**: Enter the name of your SAML provider. This name will be displayed on the login page. - - **Identity provider metadata**: Upload the data from the metadata file provided by your SAML provider. This file contains the SAML configuration details. - - **Group Attribute**: Enter the name of the attribute that contains the group information of the user. This attribute is used to map the user to the appropriate group. - - **Redirect URL**: Copy the redirect URL provided and paste it in the SAML provider's configuration page. +
    - :::tip Downloading the metadata from your identity provider - Generally, the metadata is available in the form of an XML file which can be downloaded from your identity provider's dashboard. +:::tip Downloading the metadata from your identity provider + Generally, the metadata is available in the form of an XML file which can be downloaded from your identity provider's dashboard. - Copy the metadata from the XML file and paste it into the ToolJet's SAML SSO configuration settings. Please ensure that the metadata is pasted in the correct format, as it contains essential configuration details from the identity provider necessary for authentication. + Copy the metadata from the XML file and paste it into the ToolJet's SAML SSO configuration settings. Please ensure that the metadata is pasted in the correct format, as it contains essential configuration details from the identity provider necessary for authentication. - Additionally, you can often find this data by navigating to https://<your-identity-provider>/federationmetadata/2007-06/federationmetadata.xml - ::: + Additionally, you can often find this data by navigating to https://<your-identity-provider>/federationmetadata/2007-06/federationmetadata.xml +::: -
    - - SSO :SAMP - -
    + SSO :SAMP 4. Once configured, click **Save Changes**.
    + :::tip SAML for multiple workspaces -
    +- The multiple workspaces feature is available only in versions **v2.50.9.46-lts** and later. +- Configure the required environment variables as below: -### Logging in with SAML +| variable | value | +| ---------------------- | ----------------- | +| SAML_SET_ENTITY_ID_REDIRECT_URL | `true` | +| TOOLJET_SERVER_URL | `` | + ::: -1. Go to the **[General Settings](/docs/user-authentication/general-settings)** and copy the **Login URL** provided. Furthermore, you have the flexibility to choose whether to turn on 'Enable Signups,' allowing users to signup without an invite. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. Conversely, with this option disabled, only invited users can log in, provided SSO authentication is successful. - -
    + :::tip SAML for Google and Azure +Configure the required environment variable as follows: - SSO :SAML +| variable | value | +| ---------------------- | ----------------- | +| SAML_SET_ENTITY_ID_SERVER_URL | `true` | +| TOOLJET_SERVER_URL | `` | -
    +Note: If you are using the multiple workspaces setting, you do not need to configure the `SAML_SET_ENTITY_ID_SERVER_URL` variable. + ::: +
    -2. The **Login URL** obtained can be used to access the workspace. Please note that ToolJet supports SAML login at the workspace level, ensuring users are logged in specifically to the selected workspace. +## Logging in with SAML - As a result, users can now log in to your workspace using the provided Login URL. The login page will prominently feature the name of the SAML provider configured in your workspace settings. +1. Go to the **Workspace login** and copy the **Login URL** provided. Furthermore, you have the flexibility to choose whether to turn on 'Enable Signups' allowing users to signup without an invite. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. Conversely, with this option disabled, only invited users can log in, provided SSO authentication is successful. + SSO :SAML -
    - SSO :SAMP +2. The **Login URL** obtained can be used to access the workspace. Please note that ToolJet supports SAML login at the workspace level, ensuring users are logged in specifically to the selected workspace.
    + As a result, users can now log in to your workspace using the provided Login URL. The login page will prominently feature the name of the SAML provider configured in your workspace settings. + SSO :SAMP -
    3. Click on **Sign in with `SAML Name`** button and you will be redirected to the SAML provider's login page. + SSO :SAMP -
    - - SSO :SAMP - -
    4. Enter your credentials and click **Login**. If the user is signing in for the first time, they will be redirected to the ToolJet's onboarding page. -
    \ No newline at end of file +
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/user-lifecycle.md b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/user-lifecycle.md index ddebcf9ae0..8ea4786fd3 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/user-authentication/user-lifecycle.md +++ b/docs/versioned_docs/version-2.50.0-LTS/user-authentication/user-lifecycle.md @@ -6,7 +6,7 @@ title: User Lifecycle # User Lifecycle :::info -Check Workspace docs [here](/docs/tutorial/workspace_overview). +Check Workspace docs [here](/docs/org-management/workspaces/workspace_overview). :::
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/versions.md b/docs/versioned_docs/version-2.50.0-LTS/versions.md index df360e1dd6..59c6b277e7 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/versions.md +++ b/docs/versioned_docs/version-2.50.0-LTS/versions.md @@ -3,46 +3,47 @@ id: versions title: ToolJet Documentation Versions --- -**Current LTS Version (Stable)** +## Current LTS Versions (Stable) -| Version | Documentation | -|-------------|-------------------------------------------| -| 2.50.0-LTS | [Documentation](https://docs.tooljet.com/docs/) | +| Version | Documentation | +|------------|-------------------------------------------------| +| 3.0.0-LTS | [Documentation](https://docs.tooljet.ai/docs/) | +| 2.50.0-LTS | [Documentation](https://docs.tooljet.ai/docs/2.50.0-LTS/) | -**Beta Version (Pre-Release)** +## Beta Version (Pre-Release) | Version | Documentation | |-------------|-------------------------------------------| -| 2.68.0-Beta 🚧 | [Documentation](https://docs.tooljet.com/docs/2.68.0) | +| 3.1.0-Beta 🚧 | [Documentation](https://docs.tooljet.ai/docs/beta/) | -**Past Versions (Not Maintained Anymore)** +## 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) | +| 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) | diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/button-group.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/button-group.md index 48dbffee3e..e8e4eface3 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/button-group.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/button-group.md @@ -12,29 +12,27 @@ The **Button Group** component is used to group a series of buttons together in
    -
    +
    ## Properties |
    Properties
    |
    Description
    |
    Expected Value
    | |:----------- |:----------- |:-------------- | -| label | Sets the title of the button-group. | Any **String** value: `Select the options` or `{{queries.queryname.data.text}}` | -| values | Sets the values of the Button Group items. | **Array** of strings and numbers: `{{[1,2,3]}}` | -| Labels | Sets the labels of the Button Group items. | **Array** of strings and numbers: `{{['A','B','C']}}` | +| label | Sets the title of the button-group. | Any **String** value: `Select the options` or `{{queries.queryname.data.text}}`. | +| values | Sets the values of the Button Group items. | **Array** of strings and numbers: `{{[1,2,3]}}`. | +| Labels | Sets the labels of the Button Group items. | **Array** of strings and numbers: `{{['A','B','C']}}`. | | Default selected | Sets the initial selected values. | **Array** of strings and numbers: `{{[1]}}` will select the first button by default. | -| Enable multiple selection | Toggle on or off to enable multiple selection. | **Boolean** value: `{{true}}` or `{{false}}` | +| Enable multiple selection | Toggle on or off to enable multiple selection. | **Boolean** value: `{{true}}` or `{{false}}`. |
    -
    +
    ## Events -Events are actions that can be triggered programmatically when the user interacts with the component. Click on the component handle to open its properties on the right. Go to the **Events** accordion and click on **+ Add handler**. - |
    Events
    |
    Description
    | |:----------- |:----------- | -| On click | This event is triggered when the user clicks on the button in the Button Group. | +| On click | Triggers whenever the user clicks on the button in the Button Group. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -42,7 +40,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
    -
    +
    ## Component Specific Actions (CSA) @@ -50,17 +48,17 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
    -
    +
    ## Exposed Variables |
    Variable
    |
    Description
    |
    How To Access
    | | :---------- | :---------- | :----------| -| selected | If the **enable multiple selection** option is turned off, then the variable is an array of objects, and the first object holds the value of the selected button. However, if it is turned on, the variable type changes from an array to an object, and the selected button values are stored as a string within that object. | Access the value using `{{components.buttongroup1.selected[0]}}` or `{{components.buttongroup1.selected}}` | +| selected | Holds the currently selected button value as an array of objects. | Accessible dynamically with JS (for e.g., `{{components.buttongroup1.selected[0]}} or {{components.buttongroup1.selected}}`). |
    -
    +
    ## General #### Tooltip @@ -75,30 +73,32 @@ A Tooltip is often used to display additional information when the user hovers t
    -
    +
    -## Layout +## Devices -|
    Layout
    |
    Description
    | -| :----------- | :----------- | -| Desktop | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**.| -| Mobile | Toggle to show or hide the component in the desktop view. Dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either true or false. Alternatively, the values can be set to **`{{true}}`** or **`{{false}}`**. | +|
    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 |
    Style
    |
    Description
    |
    Expected Value
    | | :---------- | :---------- | :-------------- | -| Background color | Set a background color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Text color | Set a text color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Visibility | Make the component visible or hidden. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{true}}` | -| Disable | Disable the component. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{false}}` | -| Border radius | Add a border radius to the buttons in the component using this property. | Any numerical value from `0` to `100` | -| Selected text color | Use this property to modify the text color of selected button | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Selected background color | Use this property to modify the background color of selected button | Choose a color from the picker or enter the Hex color code. ex: `#000000` | -| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent X, Y, blur, spread, and color. Example: `9px 11px 5px 5px #00000040`` | +| Background color | Set a background color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Text color | Set a text color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Visibility | Make the component visible or hidden. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{true}}`. | +| Disable | Disable the component. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{false}}`. | +| Border radius. | Add a border radius to the buttons in the component using this property. | Any numerical value from `0` to `100`. | +| Selected text color | Use this property to modify the text color of selected button. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Selected background color | Use this property to modify the background color of selected button. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent X, Y, blur, spread, and color. Example: `9px 11px 5px 5px #00000040`. | -
    \ No newline at end of file +
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/chart/chart.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/chart/chart.md index 7778bcb14e..6a115f8585 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/chart/chart.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/chart/chart.md @@ -71,13 +71,10 @@ Check [Action Reference](/docs/category/actions-reference) docs to get detailed ## Devices -**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 diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/checkbox.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/checkbox.md index 7db2ea0de4..b202170ea7 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/checkbox.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/checkbox.md @@ -6,7 +6,7 @@ title: Checkbox The **Checkbox** component allows users to make a binary choice, such as selecting or deselecting an option. -
    +
    ## Properties @@ -15,19 +15,19 @@ The **Checkbox** component allows users to make a binary choice, such as selecti | Property | Description | Expected Value | |:---------------|:---------------|:-----------------------| | Label | The text to be used as the label for the checkbox. | String (e.g., `Select payment preference`). | -| Default status | Sets the default status when the app is loaded. | Toggle the on/off switch or click on `fx` and dynamically set the value. | +| Default status | Sets the default status when the app is loaded. | Toggle the on/off switch or click on **fx** and dynamically set the value. |
    -
    +
    ## Events |
    Event
    |
    Description
    | |:----------- |:----------- | -| On change | On change event is triggered when checkbox input is changed. | -| On check (deprecated) | On check event is triggered when checkbox input is checked. | -| On uncheck (deprecated)| On uncheck event is triggered when checkbox input is unchecked. | +| On change | Triggers whenever the checkbox input is changed. | +| On check (deprecated) | Triggers whenever the checkbox input is checked. | +| On uncheck (deprecated)| Triggers whenever the checkbox input is unchecked. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -35,7 +35,7 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai
    -
    +
    ## Component Specific Actions (CSA) @@ -53,7 +53,7 @@ Following actions of Checkbox component can be controlled using the component sp
    -
    +
    ## Exposed Variables @@ -69,13 +69,13 @@ Following actions of Checkbox component can be controlled using the component sp
    -
    +
    ## Validation |
    Validation Option
    |
    Description
    |
    Expected Value
    | |:---------------|:-------------------------------------------------|:-----------------------------| -| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | | Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.checkbox1.value === false &&"Value needs to be checked"}}`). | To add regex inside `Custom Validation`, you can use the below format: @@ -88,20 +88,20 @@ To add regex inside `Custom Validation`, you can use the below format: |
    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. | +| 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 (e.g., `Are you a registered user?` ). | ## Devices **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. +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. +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. --- @@ -111,18 +111,18 @@ Makes the component visible in mobile view. You can set it with the toggle butto |
    Label Property
    |
    Description
    |
    Configuration Options
    | |:---------------|:------------|:---------------| -| Text color | Sets the color of the component's label. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on `fx` to input code that programmatically returns an alignment value - `left` or `right`. | +| Text color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `left` or `right`. | ## Switch |
    Label Property
    |
    Description
    |
    Configuration Options
    | |:---------------|:------------|:---------------| -| Border color | Sets the color of the checkbox. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Checked color | Sets the color of the checkbox when it is checked. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Unchecked color | Sets the color of the checkbox when it is not checked. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Handle color | Sets the color of the checked symbol inside the checkbox. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | -| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using `fx`. | +| Border color | Sets the color of the checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Checked color | Sets the color of the checkbox when it is checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Unchecked color | Sets the color of the checkbox when it is not checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Handle color | Sets the color of the checked symbol inside the checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. |
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md index 2108b6fb19..0744529967 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/code-editor.md @@ -21,12 +21,12 @@ Any property having **fx** button next to its field can be **programmatically co |
    Property
    |
    Description
    |
    Expected Value
    | |:----------- |:----------- |:----------------- | -| Placeholder | Specifies a hint that describes the expected value.| This field requires a `String` value | -| Mode | Specifies the language to be used for the code-editor.| See `info` below for the list of all supported languages | -| Show line number | Show or hides line numbers to the left of the editor.| This fields expects a boolean value `{{true}}` or `{{false}}` | +| Placeholder | Specifies a hint that describes the expected value.| This field requires a `String` value. | +| Mode | Specifies the language to be used for the code-editor.| See `info` below for the list of all supported languages. | +| Show line number | Show or hides line numbers to the left of the editor.| This fields expects a boolean value `{{true}}` or `{{false}}`. | :::info -
    +
    Supporting all commonly used languages.
    • APL
    • @@ -179,7 +179,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
      Variables
      |
      Description
      |
      How To Access
      | |:----------- |:----------- |:---------- | -| value | Holds the value of the user inputs in the code editor. | Access the value dynamically using JS (for e.g., `{{components.codeeditor1.value}}`). | +| value | Holds the current input value entered by the user in the code editor. | Accessible dynamically with JS (for e.g., `{{components.codeeditor1.value}}`). |
    @@ -196,12 +196,12 @@ Under the General accordion, you can set the value in the string format.
    -## Layout +## Devices -|
    Layout
    |
    Description
    | -|:----------- |:----------- | -| Show on desktop | Toggle on or off to display the component in desktop view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display the component in mobile view. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +|
    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.|
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md index 3086237b90..d9322541a1 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/date-range-picker.md @@ -23,7 +23,7 @@ The **Date-Range Picker** component allows users to select a range of dates. |
    Event
    |
    Description
    | |:----------- |:----------- | -| On select | Triggered when a start date and end date are selected. | +| On select | Triggers whenever a start date or end date is selected in the date range picker component. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -45,8 +45,8 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
    Variables
    |
    Description
    |
    How To Access
    | |:----------- |:----------- |:--------- | -| endDate | This variable holds the date of the endDate selected in the component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. | -| startDate | This variable holds the value assigned inside the `code` for the custom component. | Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`. | +| endDate | Holds the date selected as the end date in the component. | Accessible dynamically with JS (e.g., `{{components.daterangepicker1.endDate}}`). | +| startDate | Holds the date selected as the start date in the component. | Accessible dynamically with JS (e.g., `{{components.daterangepicker1.startDate}}`). |
    @@ -63,12 +63,12 @@ Under the General accordion, you can set the value in the string format.
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| 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. |
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/datepicker.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/datepicker.md index 2740da0915..ea808697b6 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/datepicker.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/datepicker.md @@ -35,7 +35,7 @@ To add an event to a date-picker component, click on the component handle to ope |
    Event
    |
    Description
    | |:----------- |:----------- | -| On select | On select event is triggered when an date is selected. | +| On select | Triggers whenever the user selects a date. | :::info Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. @@ -57,7 +57,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate |
    Variables
    |
    Description
    |
    How To Access
    | |:----------- |:----------- | :---------- | -| value | This variable holds the date selected on the component, the date value will be returned according to the format set in the Date Picker properties. | Access the value dynamically using JS: `{{components.datepicker1.value}}`.| +| value | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g.,`{{components.datepicker1.value}}`).|
    @@ -89,12 +89,12 @@ Under the General accordion, you can set the value in the string format.
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| 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. |
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/divider.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/divider.md index 7a079c8616..ade7cd22a9 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/divider.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/divider.md @@ -37,27 +37,23 @@ Under the General accordion, you can set the value in the string format. ## Layout -|
    Layout
    |
    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. | - +| Layout | 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 -|
    Style
    |
    Description
    | -| ------------------------------------------- | ----------------------------------------------------------------------------------------------- | -| Divider Color | It is used to set the color of the divider. Use hex code to set the background color. | -| Visibility | This property is used to set the visibility of the divider. The property accepts Boolean value. | - -:::info -Any property having **fx** button next to its field can be **programmatically configured**. -::: +| Property | Description | Configuration Options | +|:---------- |:------------ |:-----------------------| +| Divider Color | Sets the color of the divider. | Select the color or click on **fx** and input code that programmatically returns a HEX color code. | +| 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. | +| Box Shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust related properties or set it programmatically using **fx**. |
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/dropdown.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/dropdown.md index 0882bb0ddc..8e3d923d27 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/dropdown.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/dropdown.md @@ -62,10 +62,10 @@ Each object in the array should include the following key-value pairs: |
    Variable
    |
    Description
    |
    How To Access
    | |:-------- |:----------- |:--------- | -| Value | Holds the value of the currently selected item on the dropdown.| Value can be accesed using `{{components.dropdown1.value}}` | -| searchText | This variable is initially empty and will hold the value whenever the user searches on the dropdown. | searchText's value can be accesed using`{{components.dropdown1.searchText}}` | -| label | The variable label holds the label name of the dropdown. | label's value can be accesed using`{{components.dropdown1.searchText}}` | -| optionLabels | The optionLabels holds the option labels for the values of the dropdown. | optionLabels can be accesed using`{{components.dropdown1.optionLabels}}` for all the option labels in the array form or `{{components.dropdown1.optionLabels[0]}}` for particular option label | +| Value | Holds the value of the currently selected item on the dropdown.| Value can be accessed using `{{components.dropdown1.value}}` | +| searchText | This variable is initially empty and will hold the value whenever the user searches on the dropdown. | searchText's value can be accessed using`{{components.dropdown1.searchText}}` | +| label | The variable label holds the label name of the dropdown. | label's value can be accessed using`{{components.dropdown1.searchText}}` | +| optionLabels | The optionLabels holds the option labels for the values of the dropdown. | optionLabels can be accessed using`{{components.dropdown1.optionLabels}}` for all the option labels in the array form or `{{components.dropdown1.optionLabels[0]}}` for particular option label | | selectedOptionLabel | The variable holds the label of the selected option in the dropdown components. | The selected option label can be accessed dynamically using `{{components.dropdown1.selectedOptionLabel}}` |
    @@ -118,4 +118,4 @@ Under the General accordion, you can set the value in the string format. Any property having `Fx` button next to its field can be **programmatically configured**. ::: -
    \ No newline at end of file +
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/form.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/form.md index 1f8a2e265b..5b31be33d0 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/form.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/form.md @@ -75,94 +75,81 @@ To provide the form schema in JSON format, we'll pass a JavaScript object with * This **[list](/docs/widgets/form#custom-schema-examples)** provides examples of Custom Schema for all components that can be used in a Form component. -```js -{{ - { - title: '', // Provide title for Form - properties: { +```json +{{{ + "title": "", // Provide title for Form + "properties": { - }, // Provide schema of the components that will be inside the form - submitButton: { + }, // Provide schema of the components that will be inside the form + "submitButton": { - } // Provide schema of the submit button - } -}} + } // Provide schema of the submit button +}}} ``` Here's an example using the custom schema of **Text Input**, **Number Input** and **Dropdown** components: -```js +```json {{{ - "title":"Event Registration", - "properties":{ - "textinput1":{ - "type":"textinput", - "value":"", - "placeholder":"Enter Full Name", - "label":"Full Name", - "validation":{ - "maxLength":30, - "minLength":5 - }, - "styles":{ - "backgroundColor":"#00000000", - "borderRadius":5, - "borderColor":"#4299e1", - "errorTextColor":"#4299e1", - "disabled":false, - "visibility":"true", - "textColor":"#4299e1" - } + "title": "Event Registration", + "properties": { + "textinput1": { + "type": "textinput", + "value": "John", + "placeholder": "Enter First Name Here", + "label": "First Name", + "validation": { + "maxLength": 6 }, - "numberInput1":{ - "type":"number", - "styles":{ - "backgroundColor":"#f6f5ff", - "borderRadius":5, - "textColor":"#4299e1", - "borderColor":"#4299e1", - "disabled":false, - "visibility":"true" - }, - "value":22, - "maxValue":100, - "minValue":14, - "placeholder":"Enter your age", - "label":"Age" + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "borderColor": "black", + "errorTextColor": "#025aa3", + "disabled": false, + "visibility": true, + "textColor": "#025aa3" + } + }, + "numberInput1": { + "type": "number", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "textColor": "#025aa3", + "borderColor": "black", + "disabled": false, + "visibility": "true" }, - "dropdown1":{ - "type":"dropdown", - "values":[ - 1, - 2, - 3 - ], - "displayValues":[ - "Male", - "Female", - "Perfer not to Answer" - ], - "loading":false, - "value":3, - "label":"Gender", - "styles":{ - "disabled":false, - "visibility":"true", - "borderRadius":5, - "borderColor":"#4299e1", - "justifyContent":"center" - } + "value": 22, + "maxValue": 100, + "minValue": 14, + "placeholder": "Enter Your Age", + "label": "Age" + }, + "dropdown1": { + "type": "dropdown", + "displayValues": ["Male", "Female", "Prefer not to Answer"], + "values": [1, 2, 3], + "loading": false, + "value": "1", + "label": "Gender", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5, + "justifyContent": "start" } - }, - "submitButton":{ - "value":"Submit", - "styles":{ - "backgroundColor":"#3A433B", - "borderColor":"#595959" - } - } -} -}} + } + }, + "submitButton": { + "value": "Submit", + "styles": { + "backgroundColor": "#3A433B", + "borderColor": "#595959" + } + } +}}} ``` @@ -248,20 +235,20 @@ A Tooltip is often used to specify the extra information when the user hovers th Properties that can be used in Datepicker schema are: -```js -datepicker1: { - type: 'datepicker', - styles: { - borderRadius: 5, - disabled: false, - visibility: 'true' +```json + "datepicker1": { + "type": "datepicker", + "styles": { + "borderRadius": 5, + "disabled": false, + "visibility": "true" }, - value: '09/09/2023', - disabledDates: ['08/09/2023'], - enableTime: true, - format: 'DD/MM/YYYY', - label: 'Select a date' -} + "value": "09/09/2023", + "disabledDates": ["08/09/2023"], + "enableTime": true, + "format": "DD/MM/YYYY", + "label": "Select a Date" + } ``` |
    Key
    |
    Description
    |
    Expected Value
    | @@ -285,22 +272,22 @@ datepicker1: { **Properties** -```js -numberInput1: { - type: 'number', - styles: { - backgroundColor: '#f6f5ff', - borderRadius: 20, - textColor: 'red', - borderColor: 'blue', - disabled: false, - visibility: 'true' - }, - value: 10, - maxValue: 12, - minValue: 6, - placeholder: 'test', - label: 'Number Input' +```json +"numberInput1": { + "type": "number", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 3, + "textColor": "#025aa3", + "borderColor": "blue", + "disabled": false, + "visibility": "true" + }, + "value": 10, + "maxValue": 12, + "minValue": 6, + "placeholder": "Enter a Number", + "label": "Number Input" } ``` @@ -328,22 +315,22 @@ numberInput1: { **Properties** -```js -passwordInput1: { - type: 'password', - styles: { - backgroundColor: '#f6f5ff', - borderRadius: 10, - disabled: false, - visibility: 'true' - }, - validation: { - maxLength: 9, - minLength: 5, - regex: `'^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$'` - }, - placeholder: 'Enter a password', - label: '' +```json +"passwordInput1": { + "type": "password", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "disabled": false, + "visibility": "true" + }, + "validation": { + "maxLength": 9, + "minLength": 5, + "regex": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$" + }, + "placeholder": "Enter Password", + "label": "Password" } ``` @@ -370,17 +357,17 @@ passwordInput1: { **Properties** -```js -checkbox1: { - type: 'checkbox', - styles: { - checkboxColor: 'red', - disabled: false, - textColor: 'red', - visibility: 'true' - }, - value: false, - label: 'Checkbox' +```json +"checkbox1": { + "type": "checkbox", + "styles": { + "checkboxColor": "#025aa3", + "disabled": false, + "textColor": "#025aa3", + "visibility": "true" + }, + "value": false, + "label": "Checkbox" } ``` @@ -403,17 +390,17 @@ checkbox1: { **Properties** -```js -toggleswitch1: { - type: 'toggle', - styles: { - textColor: 'blue', - disabled: false, - visibility: 'true', - toggleSwitchColor: 'red' - }, - value: true, - label: 'Toggle switch' +```json +"toggleswitch1": { + "type": "toggle", + "styles": { + "textColor": "#025aa3", + "disabled": false, + "visibility": "true", + "toggleSwitchColor": "#025aa3" + }, + "value": true, + "label": "Toggle switch" } ``` @@ -436,17 +423,17 @@ toggleswitch1: { **Properties** -```js -textArea1: { - type: 'textarea', - styles: { - disabled: false, - visibility: 'true', - borderRadius: 20 - }, - value: 'This is a text area', - placeholder: 'Enter text here', - label: 'Text Area' +```json +"textArea1": { + "type": "textarea", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5 + }, + "value": "This is a text area", + "placeholder": "Enter Text Here", + "label": "Text Area" } ``` @@ -469,18 +456,18 @@ textArea1: { **Properties** -```js -daterangepicker1: { - type: 'daterangepicker', - styles: { - disabled: true, - visibility: 'true', - borderRadius: 5 - }, - defaultEndDate: '12/04/2022', - defaultStartDate: '1/04/2022', - format: 'DD/MM/YYYY', - label: 'Select a date range' +```json +"daterangepicker1": { + "type": "daterangepicker", + "styles": { + "disabled": true, + "visibility": "true", + "borderRadius": 5 + }, + "defaultEndDate": "12/04/2022", + "defaultStartDate": "1/04/2022", + "format": "DD/MM/YYYY", + "label": "Select a Date Range" } ``` @@ -504,19 +491,19 @@ daterangepicker1: { **Properties** -```js -multiselect1: { - type: 'multiselect', - styles: { - disabled: false, - visibility: 'true', - borderRadius: 5 - }, - displayValues: ["one", "two", "three"], - label: 'Select options of your choice', - value: [2, 3], - values: [1, 2, 3], - showAllOption: true +```json +"multiselect1": { + "type": "multiselect", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5 + }, + "displayValues": ["one", "two", "three"], + "label": "Select Options of Your Choice", + "value": [2, 3], + "values": [1, 2, 3], + "showAllOption": true } ``` @@ -541,20 +528,20 @@ multiselect1: { **Properties** -```js -starRating1: { - type: 'starrating', - styles: { - disabled: false, - visibility: 'true', - textColor: 'yellow', - labelColor: 'red' - }, - allowHalfStar: true, - defaultSelected: 4.5, - maxRating: 10, - tooltips: ['one', 'two', 'three', 'four'], - label: 'Select a rating' +```json +"starRating1": { + "type": "starrating", + "styles": { + "disabled": false, + "visibility": "true", + "textColor": "gold", + "labelColor": "#025aa3" + }, + "allowHalfStar": true, + "defaultSelected": 3.5, + "maxRating": 5, + "tooltips": ["one", "two", "three", "four"], + "label": "Select a Rating" } ``` @@ -580,22 +567,22 @@ starRating1: { **Properties** -```js -filepicker1: { - type: 'filepicker', - styles: { - visibility: 'true', - borderRadius: 10 - }, - enableMultiple: true, - fileType: '*/*', - instructionText: 'Click here to select files', - maxFileCount: 5, - maxSize: 6000000, - minSize: 25, - parseContent: true, - parseFileType: 'csv', - label: 'Select a file' +```json +"filepicker1": { + "type": "filepicker", + "styles": { + "visibility": "true", + "borderRadius": 10 + }, + "enableMultiple": true, + "fileType": "*/*", + "instructionText": "Click here to select files", + "maxFileCount": 5, + "maxSize": 6000000, + "minSize": 25, + "parseContent": true, + "parseFileType": "csv", + "label": "Select a File" } ``` @@ -623,23 +610,23 @@ filepicker1: { **Properties** -```js -textinput1: { - type: 'textinput', - value: 'Random text', - placeholder: 'enter first name here', - label: 'First name', - validation: { - maxLength: 6 - }, - styles: { - backgroundColor: 'red', - borderRadius: 20, - errorTextColor: 'green', - disabled: false, - visibility: false, - textColor: 'yellow' - } +```json +"textinput1": { + "type": "textinput", + "value": "John", + "placeholder": "Enter the Name Here", + "label": "First Name", + "validation": { + "maxLength": 6 + }, + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "errorTextColor": "#025aa3", + "disabled": false, + "visibility": false, + "textColor": "#025aa3" + } } ``` @@ -667,20 +654,20 @@ textinput1: { **Properties** -```js -dropdown1: { - type: 'dropdown', - displayValues: [1, 2, 3], - values: ['one', 'two', 'three'], - loading: false, - value: 'two', - label: 'Select a number', - styles: { - disabled: false, - visibility: 'true', - borderRadius: 5, - justifyContent: 'end' - } +```json +"dropdown1": { + "type": "dropdown", + "displayValues": ["One", "Two", "Three"], + "values": [1, 2, 3], + "loading": false, + "value": 2, + "label": "Select a Number", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5, + "justifyContent": "start" + } } ``` @@ -706,20 +693,20 @@ dropdown1: { **Properties** -```js -button1: { - type: 'button', - value: 'Submit', - label: '', - styles: { - backgroundColor: 'blue', - textColor: 'white', - borderRadius: 5, - borderColor: 'black', - loaderColor: 'gray', - visibility: 'true', - disabled: true - } +```json +"button1": { + "type": "button", + "value": "Submit", + "label": "", + "styles": { + "backgroundColor": "#3A433B", + "textColor": "white", + "borderRadius": 5, + "borderColor": "#595959", + "loaderColor": "gray", + "visibility": "true", + "disabled": true + } } ``` @@ -745,17 +732,17 @@ button1: { **Properties** -```js -text1: { - type: 'text', - value: 'This is a text component', - label: '', - styles: { - backgroundColor: '#f6f5ff', - textColor: 'red', - fontSize: 24, - fontWeight: 30 - } +```json +"text1": { + "type": "text", + "value": "This is a text component", + "label": "", + "styles": { + "backgroundColor": "#f6f5ff", + "textColor": "#025aa3", + "fontSize": 12, + "fontWeight": 500 + } } ``` @@ -778,18 +765,18 @@ text1: { **Properties** -```js -radioButton1: { - type: 'radio', - styles: { - textColor: 'black', - disabled: false, - visibility: 'true' - }, - displayValues: ['option 1', 'option 2', 'option 3'], - label: 'Radio Buttons', - value: 2, - values: [1, 2, 3] +```json +"radioButton1": { + "type": "radio", + "styles": { + "textColor": "black", + "disabled": false, + "visibility": "true" + }, + "displayValues": ["Yes", "No"], + "label": "Radio Buttons", + "value": 1, + "values": [1, 2] } ``` @@ -805,4 +792,4 @@ radioButton1: { | value | Specifies the default selected value of the radio button. | Any value from the `values` array, like 2 | | values | Specifies the values in an array. | Array of values like `[1, 2, 3]` | -
    \ No newline at end of file +
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/icon.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/icon.md index 1699f9cfd5..e768ebb036 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/icon.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/icon.md @@ -38,10 +38,10 @@ Check [Action Reference](/docs/category/actions-reference) docs to get the detai Following actions of the component can be controlled using the component specific actions(CSA): -|
    Actions
    |
    Description
    |
    How To Access
    | -| :-------------------------------------------- | :------------------------------------------------------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------- | -| setVisibility | You can toggle the visibility of the Icon component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.icon1.setVisibility(false)`. | -| click | You can trigger the click action on Icon component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.icon1.click()`. | +|
    Actions
    |
    Description
    |
    How To Access
    | +| :-------------------------------------------- | :------------------------------------------------ | :---------------------------------------------------- | +| setVisibility() | Sets the visibility of the component. | Employ a RunJS query (for e.g., `await components.icon1.setVisibility(false)`) or trigger it using an event. | +| click() | Regulate the click on the icon. | Employ a RunJS query (for e.g., `await components.icon1.click()`) or trigger it using an event. |
    @@ -63,12 +63,12 @@ There are currently no exposed variables for the component.
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | | :------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| 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. |
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/listview.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/listview.md index 7ef6afa4c9..d533706c5b 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/listview.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/listview.md @@ -11,7 +11,7 @@ The **List View** component allows to create a list of repeatable rows of data. Certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the List View component using drag-and-drop functionality. ::: -
    +
    ## Setting List Data @@ -41,7 +41,7 @@ Similarly, for an Image component inside List View, you can use the below code t
    -
    +
    ## Properties @@ -57,7 +57,7 @@ Similarly, for an Image component inside List View, you can use the below code t
    -
    +
    ## Events @@ -92,7 +92,7 @@ To get detailed information about all the **Actions**, please consult the [Actio
    -
    +
    ## Component Specific Actions (CSA) @@ -100,7 +100,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
    -
    +
    ## Exposed Variables @@ -115,7 +115,7 @@ There are currently no CSA (Component-Specific Actions) implemented to regulate
    -
    +
    ## General ### Tooltip @@ -126,18 +126,20 @@ Under the General accordion, you can set the value in the string format.
    -
    +
    -## Layout +## Devices -|
    Layout
    |
    Description
    |
    Expected Value
    | +|
    Property
    |
    Description
    |
    Expected Value
    | |:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | -| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | -| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| 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 @@ -150,12 +152,12 @@ Under the General accordion, you can set the value in the string format. | Border radius | Use this property to modify the border radius of the list view. The field expects only numerical value from `1` to `100`, default is `0`. | :::info -Any property having `Fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. :::
    -
    +
    ## Example: Displaying Data in the List View @@ -202,13 +204,13 @@ Use `{{listItem.key}}` to display data on the nested components. Example: For di
    -
    +
    ## Controlling Child Components All the child components of the List View component are exposed through the `children` variable. This variable is an array of objects, where each object represents a record in the listview and contains the data of the child components. -The components inside the list view can be controlled using the javascipt queries. For example, if you want to disable the `button1` component in the first record, you can use the following expression: +The components inside the list view can be controlled using the javascript queries. For example, if you want to disable the `button1` component in the first record, you can use the following expression: ```js components.listview1.children[0].button1.disable(true) // disables the button1 component in the first record @@ -220,4 +222,4 @@ components.listview1.children[0].button1.disable(true) // disables the button1 c Currently, only those child components can be controlled using the javascript queries that have component specific actions implemented. To check if a component has component specific actions implemented, refer to the document of that **[specific component](/docs/widgets/overview)**. ::: -
    \ No newline at end of file +
    diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/overview.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/overview.md index e87f15bf06..83e8375321 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/overview.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/overview.md @@ -132,7 +132,7 @@ Any arbitrary JavaScript code can be written inside **`{{}}`**: ``` :::tip -Check out the How-to guides like **[changing color of text in table column](/docs/how-to/access-cellvalue-rowdata)**, **[Enable/Disable a component using JavaScript](/docs/how-to/access-currentuser)**, and **[more](/docs/category/how-to)**. +Check out the How-to guides like **[changing color of text in table column](/docs/how-to/access-cellvalue-rowdata)**, **[Enable/Disable a component using JavaScript](/docs/how-to/access-currentuser)**, and more. :::
    \ No newline at end of file diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/pdf.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/pdf.md index 0acaf9be61..05dfb0aac4 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/pdf.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/pdf.md @@ -78,9 +78,9 @@ To display instructional text when a user hovers over the PDF component, add som ## Styles -|
    Style
    |
    Description
    |
    Default Value
    | -| :------------------------------------------ | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------- | -| Visibility | Toggle the `Visibility` condition on or off to control the visibility of the component. You can also programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | +|
    Property
    |
    Description
    |
    Configuration Options
    | +| :------------------------------------------ | :--------------------------------------------------- | :-------------------------------------------------- | +| 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. | :::info Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how to display images/PDFs using base64 string. diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/table.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/table.md index e17e584d16..e8f5ab618c 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/table.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/table.md @@ -25,11 +25,11 @@ The table data can be filtered using the Filter data option on its top-left. You - **less than** - **less than or equal to** -You also have the option to **[hide the filter button](/docs/widgets/table#show-filter-button)** in the table properties. +You also have the option to **[hide the filter button](/docs/widgets/table/table-properties#enable-filtering)** in the table properties. ### Search -At the top-right corner of the table component, there is a search box that allows users to input keywords and search for rows within the table data. You can also **[show/hide the search box](/docs/widgets/table#show-search-box)** from the table from the table properties. +At the top-right corner of the table component, there is a search box that allows users to input keywords and search for rows within the table data. You can also **[show/hide the search box](/docs/widgets/table/table-properties#show-search)** from the table from the table properties. :::tip You can use the `Tab` key to navigate through cells on the table. @@ -37,11 +37,11 @@ You can use the `Tab` key to navigate through cells on the table. ### Pagination -The table component supports both **[client-side pagination](/docs/widgets/table#client-side-pagination)** and **[server-side pagination](/docs/widgets/table#server-side-pagination)**. The `<<` and `>>` button skips to the first and last page respectively. The `<` and `>` button takes the user to the previous and next page respectively. You can also **[hide the pagination buttons](/docs/widgets/table#show-pagination-buttons)** in the table properties. +The table component supports both **[client-side pagination](/docs/widgets/table/table-properties#pagination)** and **[server-side pagination](/docs/widgets/table/serverside-operations/pagination)**. The `<<` and `>>` button skips to the first and last page respectively. The `<` and `>` button takes the user to the previous and next page respectively. You can also **[hide the pagination buttons](/docs/widgets/table/table-properties#pagination)** in the table properties. ### Add New Rows -Upon clicking this button, a popup modal will show, providing users with the ability to insert new rows. Initially, the modal will contain a single row, with columns mirroring those found in the table. If users input data into this row, it will be stored within the **[`newRows` variable](/docs/widgets/table#exposed-variables)** associated with the table. Clicking on the **Discard** button will clear the data within this variable. However, if the users close the popup without any action (neither saving nor discarding), the data will persist, accompanied by a green indicator on the **Add new row** button. The table incorporates an **[Add new rows event handler](/docs//widgets/table#add-new-rows)**, which can be employed to execute queries that store the data into the data source upon clicking the **Save** button. +Upon clicking this button, a popup modal will show, providing users with the ability to insert new rows. Initially, the modal will contain a single row, with columns mirroring those found in the table. If users input data into this row, it will be stored within the **[`newRows` variable](/docs/widgets/table/table-csa-and-variables#exposed-variables)** associated with the table. Clicking on the **Discard** button will clear the data within this variable. However, if the users close the popup without any action (neither saving nor discarding), the data will persist, accompanied by a green indicator on the **Add new row** button. The table incorporates an **[Add new rows event handler](/docs/widgets/table/table-properties#add-new-rows)**, which can be employed to execute queries that store the data into the data source upon clicking the **Save** button. :::info At present, it is not possible to include columns of type Image when adding a new row to the table. @@ -60,19 +60,19 @@ The name of the downloaded file will be in the following format:
    `Tablename_DD-MM-YYYY_HH-mm.filetype`

    Example: Customers_25-03-2022_16-10.csv -You have the option to **[hide the download button](/docs/widgets/table#show-download-button)** in the table properties. +You have the option to **[hide the download button](/docs/widgets/table/table-properties#show-download-button)** in the table properties. :::tip -You can utilize **[Component Specific Actions](#component-specific-actions-csa)** to retrieve the table data in the mentioned formats from the event handlers across the application. +You can utilize **[Component Specific Actions](/docs/widgets/table/table-csa-and-variables#component-specific-actions-csa)** to retrieve the table data in the mentioned formats from the event handlers across the application. ::: ### Hide Columns -You can choose which columns to show or hide in the table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table#show-column-selector-button)** in the table properties. +You can choose which columns to show or hide in the table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table/table-columns)** in the table properties. ### Sorting -You can sort the table data in ascending or descending order by clicking on the column header. You can also **[disable the sorting](/docs/widgets/table#disable-sorting)** from the table properties. +You can sort the table data in ascending or descending order by clicking on the column header. You can also **[disable the sorting](/docs/widgets/table/table-properties#enable-column-sorting)** from the table properties. ## Table Data @@ -373,7 +373,7 @@ To display email column, the key for the column should be `user.email`. Enable `editable` property of a column to make the cells editable. If a data type is not selected, `string` is selected as the data type. :::tip -You can programatically **enable**/**disable** the make **editable** field in the columns property by clicking on the **Fx** button. +You can programmatically **enable**/**disable** the make **editable** field in the columns property by clicking on the **Fx** button. ::: If the data in a cell is changed, `changeSet` property of the table object will have the index of the row and the field that changed. @@ -405,16 +405,16 @@ If the data of a cell is changed, "save changes" button will be shown at the bot ## Events -- **[Row hovered](#row-hovered)** -- **[Row clicked](#row-clicked)** -- **[Save changes](#save-changes)** -- **[Cancel changes](#cancel-changes)** -- **[Page changed](#page-changed)** -- **[Search](#search)** -- **[Sort applied](#sort-applied)** -- **[Cell value changed](#cell-value-changed)** -- **[Filter changed](#filter-changed)** -- **[Add new rows](#add-new-rows)** +- **[Row hovered](/docs/widgets/table/table-properties#row-hovered)** +- **[Row clicked](/docs/widgets/table/table-properties#row-clicked)** +- **[Save changes](/docs/widgets/table/table-properties#save-changes)** +- **[Cancel changes](/docs/widgets/table/table-properties#cancel-changes)** +- **[Page changed](/docs/widgets/table/table-properties#page-changed)** +- **[Search](/docs/widgets/table/table-properties#search)** +- **[Sort applied](/docs/widgets/table/table-properties#sort-applied)** +- **[Cell value changed](/docs/widgets/table/table-properties#cell-value-changed)** +- **[Filter changed](/docs/widgets/table/table-properties#filter-changed)** +- **[Add new rows](/docs/widgets/table/table-properties#add-new-rows)** ### Allow Selection diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/table/columns.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/table/columns.md index 347208e5f7..e19a5b9c0d 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/table/columns.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/table/columns.md @@ -464,7 +464,7 @@ On hovering on a column, you can see a delete icon on the right which can be use ### Hide columns -You can choose which columns to show or hide in the Table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table#show-column-selector-button)** in the Table properties. +You can choose which columns to show or hide in the Table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table/#hide-column-selector-button)** in the Table properties. ## Make all columns editable diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/table/properties.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/table/properties.md index bf5c542f88..b87b419371 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/table/properties.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/table/properties.md @@ -1,6 +1,7 @@ --- id: table-properties -title: Properties +title: Table Properties +slug: /widgets/table/ --- The Table component displays and manages data, connecting seamlessly with databases and APIs. It allows users to view and edit data directly within the table. This document goes through all the properties related to the Table component. @@ -34,7 +35,7 @@ Example - Passing a query data: Go to the **[columns](/docs/widgets/table/table-columns)** section to read more about columns. :::info -Any property having `fx` button next to its field can be **programmatically configured**. +Any property having **fx** button next to its field can be **programmatically configured**. ::: ## Action Buttons @@ -53,7 +54,7 @@ Below are the button text properties that you can set. | Button position | Sets the button position to left or right. | | Background color | Sets the background color of the action button. | | Text color | Sets the color of button-text of the action button. | -| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the `fx` button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | +| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the **fx** button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | | New event handler | The **New event handler** button lets you create an event handler to define behavior for action buttons based on the `On click` action. | @@ -204,7 +205,7 @@ When Server-side pagination is enabled, you'll be able to set three other Table Check this how-to guide to learn more about **[server-side pagination](/docs/how-to/use-server-side-pagination)**. ::: -## Addional actions +## Additional actions ### Show add new row button @@ -240,29 +241,29 @@ Disable condition allows you to control whether the Table is enabled or disabled ## Devices -| Option | Description | Expected value | +| Property | Description | Expected value | |:----------- |:----------- |:----------- | -| **Show on desktop** | Shows or hides the component on desktop devices. | Use the toggle switch or configure it dynamically using `fx`.| -| **Show on mobile** | Shows or hides the component on mobile devices. | Use the toggle switch or configure it dynamically using `fx`.| +| 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 ### Data | Style Property | Description | Configuration Options | |-----------------|------------------|--------------------| -| **Text color** | Change the text color of the component. | Provide a `hex color code`, choose from the picker, or set programmatically using `fx`. | -| **Row style** | Selects the style of the table rows. | Choose from dropdown: Bordered, Regular, or Striped. You can also set it programmatically using `fx`. | -| **Cell height** | Determines the size of the table cells. | Choose between `Condensed` or `Regular` size. You can also set it programmatically using `fx`. | -| **Max row height** | Controls the maximum height of rows when `Content wrap` is enabled. | Select `Auto` or define a `Custom` size. You can also set it programmatically using `fx`. | +| **Text color** | Change the text color of the component. | Provide a `hex color code`, choose from the picker, or set programmatically using **fx**. | +| **Row style** | Selects the style of the table rows. | Choose from dropdown: Bordered, Regular, or Striped. You can also set it programmatically using **fx**. | +| **Cell height** | Determines the size of the table cells. | Choose between `Condensed` or `Regular` size. You can also set it programmatically using **fx**. | +| **Max row height** | Controls the maximum height of rows when `Content wrap` is enabled. | Select `Auto` or define a `Custom` size. You can also set it programmatically using **fx**. | ## Action Button | Action | Description | Configuration Options | |:-------------------|:----------------|:-----------------------| -| **Button radius** | Sets the radius for all action buttons. | Enter a value (default is `0`) or dynamically configure using `fx`. | +| **Button radius** | Sets the radius for all action buttons. | Enter a value (default is `0`) or dynamically configure using **fx**. | ## Container | Style Property | Description | Configuration Options | |:---------------|:-----------|:----------------------| -| **Border radius** | Adds a radius to the borders of the Table. | Enter a value (default is `8`) or dynamically configure using `fx`. | -| **Border** | Defines the border color of the Table. | Change the color by providing a `hex color code`, choosing from the picker, or setting programmatically using `fx`. | -| **Box shadow** | Sets the box shadow properties of the component. | Select the box shadow color, adjust related properties, or set programmatically using `fx`. | +| **Border radius** | Adds a radius to the borders of the Table. | Enter a value (default is `8`) or dynamically configure using **fx**. | +| **Border** | Defines the border color of the Table. | Change the color by providing a `hex color code`, choosing from the picker, or setting programmatically using **fx**. | +| **Box shadow** | Sets the box shadow properties of the component. | Select the box shadow color, adjust related properties, or set programmatically using **fx**. | diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/text.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/text.md index fa98ea42f9..383c3745dc 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/text.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/text.md @@ -32,10 +32,10 @@ Following actions of the **Text** component can be controlled using Component-Sp |
    Action
    |
    Description
    |
    How To Access
    | | :------------ | :---------- | :------------ | | setText() | Sets the value of the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.setText('this is input text')`) or trigger it using an event.| -| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.clear()`) or trigger it using an event | -| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setVisibility(false)`) or trigger it using an event | -| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setLoading(true)`) or trigger it using an event | -| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setDisable(true)`) or trigger it using an event | +| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setDisable(true)`) or trigger it using an event. | :::info Check the **component specific actions** available for this component **[here](/docs/actions/control-component)**. @@ -45,29 +45,26 @@ Check the **component specific actions** available for this component **[here](/ | Variable | Description | How To Access | |:--------:|:-----------:|:------------:| -|
    text
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.text1.text}}`) | -|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.text1.isLoading}}`) | -|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.text1.isVisible}}`) | -|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.text1.isDisabled}}`) | +|
    text
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.text1.text}}`). | +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.text1.isLoading}}`). | +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.text1.isVisible}}`). | +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.text1.isDisabled}}`). | ## 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 (e.g., `Enter your name here.` ) | +| 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 (e.g., `Enter your name here.` ). | ## Devices -**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 @@ -76,19 +73,19 @@ Makes the component visible in mobile view. You can set it with the toggle butto | Text Property | Description | Configuration Options | |:--------------------|:--------------------------------------|:---------------| -| Size | Dimensions of the characters in a font. | Enter any number between `1-100` or dynamically configure it using `fx` | -| Weight | Determines how bold or light your text will appear. | Select from `light`, `regular`, `semi-bold` or `bold` or dynamically configure it using `fx` | -| Style | Allows you to apply styles like italic or normal, altering the overall look of the text content. | Select from `normal`, `italic` or `oblique` or dynamically configure it using `fx` | -| Color | Sets the color of the text. | Choose a color using the color picker or dynamically configure it using `fx` | -| Scroll | Creates a scroll bar if the text exceeds the component's dimensions. | Choose between `enable` or `disable` or dynamically configure it using `fx` | -| Line Height | Determines the vertical space between lines of text within an element. | Enter a number as the value (example: `1.5`) or dynamically configure it using `fx`| -| Text Indent | Commonly used to create an indentation effect. | Enter a number as the value (example: `10`) or dynamically configure it using `fx`| -| Alignment | Sets the alignment of the text. | Select the available options to align the text vertically or horizontally or dynamically configure it using `fx`| -| Text Decoration | Adds an underline, overline, line-through, or a combination of lines to selected text. | Select one of the available options - `none(default)`, `underline`, `overline`, and `strike-through` or dynamically configure it using `fx` | -| Transformation | Dictates the capitalization of text. | Select one of the available options - `none (default)`, `uppercase`, `lowercase`, `capitalize` or dynamically configure it using `fx`| -| Letter spacing | Determines the space between each letter. | Enter a number as the value (example: `15`) or dynamically configure it using `fx`| -| Word spacing | Determines the space between each word. | Enter a number as the value (example: `15`) or dynamically configure it using `fx`| -| Font variant | Adjusts the text appearance by applying font variations. | Select one of the available options - `normal`, `inherit`, `small-caps`, `initial` or dynamically configure it using `fx`| +| Size | Dimensions of the characters in a font. | Enter any number between `1-100` or dynamically configure it using **fx**. | +| Weight | Determines how bold or light your text will appear. | Select from `light`, `regular`, `semi-bold` or `bold` or dynamically configure it using **fx**. | +| Style | Allows you to apply styles like italic or normal, altering the overall look of the text content. | Select from `normal`, `italic` or `oblique` or dynamically configure it using **fx**. | +| Color | Sets the color of the text. | Choose a color using the color picker or dynamically configure it using **fx**. | +| Scroll | Creates a scroll bar if the text exceeds the component's dimensions. | Choose between `enable` or `disable` or dynamically configure it using **fx**. | +| Line Height | Determines the vertical space between lines of text within an element. | Enter a number as the value (example: `1.5`) or dynamically configure it using **fx**.| +| Text Indent | Commonly used to create an indentation effect. | Enter a number as the value (example: `10`) or dynamically configure it using **fx**.| +| Alignment | Sets the alignment of the text. | Select the available options to align the text vertically or horizontally or dynamically configure it using **fx**.| +| Text Decoration | Adds an underline, overline, line-through, or a combination of lines to selected text. | Select one of the available options - `none(default)`, `underline`, `overline`, and `strike-through` or dynamically configure it using **fx**. | +| Transformation | Dictates the capitalization of text. | Select one of the available options - `none (default)`, `uppercase`, `lowercase`, `capitalize` or dynamically configure it using **fx**.| +| Letter spacing | Determines the space between each letter. | Enter a number as the value (example: `15`) or dynamically configure it using **fx**.| +| Word spacing | Determines the space between each word. | Enter a number as the value (example: `15`) or dynamically configure it using **fx**.| +| Font variant | Adjusts the text appearance by applying font variations. | Select one of the available options - `normal`, `inherit`, `small-caps`, `initial` or dynamically configure it using **fx**.| @@ -96,9 +93,9 @@ Makes the component visible in mobile view. You can set it with the toggle butto |
    Field Property
    |
    Description
    |
    Configuration Options
    | |:----------------|:------------|:--------------| -| Background | Sets the background color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code | -| Border | Sets the border color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code | -| 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 | Adds padding to the component | Select `None` for no padding and `Default` for standard padding +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| 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 | Adds padding to the component. | Select `None` for no padding and `Default` for standard padding. | diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch-v2.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch-v2.md index 7df5842738..0a02516457 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch-v2.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch-v2.md @@ -8,7 +8,7 @@ The **Toggle Switch** component can be used for binary choices, such as turning
    :::info -To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/2.43.0/widgets/toggle-switch)** document. +To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/widgets/toggle-switch)** document. ::: ## Properties diff --git a/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch.md b/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch.md index dc4aeb5dd4..67b7bd9674 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch.md +++ b/docs/versioned_docs/version-2.50.0-LTS/widgets/toggle-switch.md @@ -8,7 +8,7 @@ The **Toggle Switch** component can be used for binary choices, such as turning
    :::info -To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/2.43.0/widgets/toggle-switch)** document. +To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/widgets/toggle-switch)** document. ::: ## Properties diff --git a/docs/versioned_docs/version-2.50.0-LTS/workflows/overview.md b/docs/versioned_docs/version-2.50.0-LTS/workflows/overview.md index d3498bc2eb..a4c8adc732 100644 --- a/docs/versioned_docs/version-2.50.0-LTS/workflows/overview.md +++ b/docs/versioned_docs/version-2.50.0-LTS/workflows/overview.md @@ -2,7 +2,17 @@ id: overview title: Overview --- -
    Available on: Paid plans
    + +
    + Icon + Paid feature +
    +
    ToolJet Workflows is a visual, node-based platform tailored for data-centric automation tasks. With its intuitive design, users can create detailed queries across diverse data sources, manage conditional flows, and execute custom JavaScript code while making the processes presentable and easy to manage. diff --git a/docs/versioned_docs/version-2.6.0/setup/env-vars.md b/docs/versioned_docs/version-2.6.0/setup/env-vars.md index fa42dfbfd9..476b252b32 100644 --- a/docs/versioned_docs/version-2.6.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.6.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.6.0/setup/heroku.md b/docs/versioned_docs/version-2.6.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.6.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.6.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.6.0/tooljet_database.md b/docs/versioned_docs/version-2.6.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.6.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.6.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.61.0/setup/env-vars.md b/docs/versioned_docs/version-2.61.0/setup/env-vars.md index e0f5050189..cf580a1c3d 100644 --- a/docs/versioned_docs/version-2.61.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.61.0/setup/env-vars.md @@ -296,9 +296,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.61.0/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-2.61.0/tooljet-db/tooljet-database.md index 882018aba8..eb7fc9fb4e 100644 --- a/docs/versioned_docs/version-2.61.0/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-2.61.0/tooljet-db/tooljet-database.md @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: diff --git a/docs/versioned_docs/version-2.62.0/setup/env-vars.md b/docs/versioned_docs/version-2.62.0/setup/env-vars.md index 1f187a1a24..7f73fd97d7 100644 --- a/docs/versioned_docs/version-2.62.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.62.0/setup/env-vars.md @@ -305,9 +305,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.62.0/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-2.62.0/tooljet-db/tooljet-database.md index 882018aba8..eb7fc9fb4e 100644 --- a/docs/versioned_docs/version-2.62.0/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-2.62.0/tooljet-db/tooljet-database.md @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: diff --git a/docs/versioned_docs/version-2.65.0/setup/env-vars.md b/docs/versioned_docs/version-2.65.0/setup/env-vars.md index 78e38608da..4f8ab55fd9 100644 --- a/docs/versioned_docs/version-2.65.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.65.0/setup/env-vars.md @@ -307,9 +307,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.65.0/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-2.65.0/tooljet-db/tooljet-database.md index 808ee95be2..848d442f5c 100644 --- a/docs/versioned_docs/version-2.65.0/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-2.65.0/tooljet-db/tooljet-database.md @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: diff --git a/docs/versioned_docs/version-2.68.0/setup/env-vars.md b/docs/versioned_docs/version-2.68.0/setup/env-vars.md index 78e38608da..4f8ab55fd9 100644 --- a/docs/versioned_docs/version-2.68.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.68.0/setup/env-vars.md @@ -307,9 +307,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.68.0/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-2.68.0/tooljet-db/tooljet-database.md index 6601e42844..ab9624dd9d 100644 --- a/docs/versioned_docs/version-2.68.0/tooljet-db/tooljet-database.md +++ b/docs/versioned_docs/version-2.68.0/tooljet-db/tooljet-database.md @@ -26,7 +26,8 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. ::: diff --git a/docs/versioned_docs/version-2.68.0/widgets/table.md b/docs/versioned_docs/version-2.68.0/widgets/table.md index e17e584d16..85ac21924d 100644 --- a/docs/versioned_docs/version-2.68.0/widgets/table.md +++ b/docs/versioned_docs/version-2.68.0/widgets/table.md @@ -25,11 +25,11 @@ The table data can be filtered using the Filter data option on its top-left. You - **less than** - **less than or equal to** -You also have the option to **[hide the filter button](/docs/widgets/table#show-filter-button)** in the table properties. +You also have the option to **hide the filter button** in the table properties. ### Search -At the top-right corner of the table component, there is a search box that allows users to input keywords and search for rows within the table data. You can also **[show/hide the search box](/docs/widgets/table#show-search-box)** from the table from the table properties. +At the top-right corner of the table component, there is a search box that allows users to input keywords and search for rows within the table data. You can also **show/hide the search box** from the table from the table properties. :::tip You can use the `Tab` key to navigate through cells on the table. @@ -37,11 +37,11 @@ You can use the `Tab` key to navigate through cells on the table. ### Pagination -The table component supports both **[client-side pagination](/docs/widgets/table#client-side-pagination)** and **[server-side pagination](/docs/widgets/table#server-side-pagination)**. The `<<` and `>>` button skips to the first and last page respectively. The `<` and `>` button takes the user to the previous and next page respectively. You can also **[hide the pagination buttons](/docs/widgets/table#show-pagination-buttons)** in the table properties. +The table component supports both **[client-side pagination](/docs/widgets/table#client-side-pagination)** and **[server-side pagination](/docs/widgets/table#server-side-pagination)**. The `<<` and `>>` button skips to the first and last page respectively. The `<` and `>` button takes the user to the previous and next page respectively. You can also **hide the pagination buttons** in the table properties. ### Add New Rows -Upon clicking this button, a popup modal will show, providing users with the ability to insert new rows. Initially, the modal will contain a single row, with columns mirroring those found in the table. If users input data into this row, it will be stored within the **[`newRows` variable](/docs/widgets/table#exposed-variables)** associated with the table. Clicking on the **Discard** button will clear the data within this variable. However, if the users close the popup without any action (neither saving nor discarding), the data will persist, accompanied by a green indicator on the **Add new row** button. The table incorporates an **[Add new rows event handler](/docs//widgets/table#add-new-rows)**, which can be employed to execute queries that store the data into the data source upon clicking the **Save** button. +Upon clicking this button, a popup modal will show, providing users with the ability to insert new rows. Initially, the modal will contain a single row, with columns mirroring those found in the table. If users input data into this row, it will be stored within the **[`newRows` variable](#exposed-variables)** associated with the table. Clicking on the **Discard** button will clear the data within this variable. However, if the users close the popup without any action (neither saving nor discarding), the data will persist, accompanied by a green indicator on the **Add new row** button. The table incorporates an **[Add new rows event handler](#add-new-rows)**, which can be employed to execute queries that store the data into the data source upon clicking the **Save** button. :::info At present, it is not possible to include columns of type Image when adding a new row to the table. @@ -60,7 +60,7 @@ The name of the downloaded file will be in the following format:
    `Tablename_DD-MM-YYYY_HH-mm.filetype`

    Example: Customers_25-03-2022_16-10.csv -You have the option to **[hide the download button](/docs/widgets/table#show-download-button)** in the table properties. +You have the option to **[hide the download button](#show-download-button)** in the table properties. :::tip You can utilize **[Component Specific Actions](#component-specific-actions-csa)** to retrieve the table data in the mentioned formats from the event handlers across the application. @@ -68,11 +68,11 @@ You can utilize **[Component Specific Actions](#component-specific-actions-csa)* ### Hide Columns -You can choose which columns to show or hide in the table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table#show-column-selector-button)** in the table properties. +You can choose which columns to show or hide in the table using this option. You also have the option to **hide the column selector button** in the table properties. ### Sorting -You can sort the table data in ascending or descending order by clicking on the column header. You can also **[disable the sorting](/docs/widgets/table#disable-sorting)** from the table properties. +You can sort the table data in ascending or descending order by clicking on the column header. You can also **disable the sorting** from the table properties. ## Table Data @@ -405,16 +405,16 @@ If the data of a cell is changed, "save changes" button will be shown at the bot ## Events -- **[Row hovered](#row-hovered)** -- **[Row clicked](#row-clicked)** -- **[Save changes](#save-changes)** -- **[Cancel changes](#cancel-changes)** -- **[Page changed](#page-changed)** -- **[Search](#search)** -- **[Sort applied](#sort-applied)** -- **[Cell value changed](#cell-value-changed)** -- **[Filter changed](#filter-changed)** -- **[Add new rows](#add-new-rows)** +- **Row hovered** +- **Row clicked** +- **Save changes** +- **Cancel changes** +- **Page changed** +- **Search** +- **Sort applied** +- **Cell value changed** +- **Filter changed** +- **Add new rows** ### Allow Selection diff --git a/docs/versioned_docs/version-2.68.0/widgets/table/columns.md b/docs/versioned_docs/version-2.68.0/widgets/table/columns.md index 347208e5f7..832ad1cde6 100644 --- a/docs/versioned_docs/version-2.68.0/widgets/table/columns.md +++ b/docs/versioned_docs/version-2.68.0/widgets/table/columns.md @@ -464,7 +464,7 @@ On hovering on a column, you can see a delete icon on the right which can be use ### Hide columns -You can choose which columns to show or hide in the Table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table#show-column-selector-button)** in the Table properties. +You can choose which columns to show or hide in the Table using this option. You also have the option to **hide the column selector button** in the Table properties. ## Make all columns editable diff --git a/docs/versioned_docs/version-2.7.0/setup/env-vars.md b/docs/versioned_docs/version-2.7.0/setup/env-vars.md index fa42dfbfd9..476b252b32 100644 --- a/docs/versioned_docs/version-2.7.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.7.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.7.0/setup/heroku.md b/docs/versioned_docs/version-2.7.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.7.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.7.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.7.0/tooljet_database.md b/docs/versioned_docs/version-2.7.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.7.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.7.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.8.0/setup/env-vars.md b/docs/versioned_docs/version-2.8.0/setup/env-vars.md index 235ffa43b8..1210c6a94e 100644 --- a/docs/versioned_docs/version-2.8.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.8.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.8.0/setup/heroku.md b/docs/versioned_docs/version-2.8.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.8.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.8.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.8.0/tooljet_database.md b/docs/versioned_docs/version-2.8.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.8.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.8.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.9.0/setup/env-vars.md b/docs/versioned_docs/version-2.9.0/setup/env-vars.md index 235ffa43b8..1210c6a94e 100644 --- a/docs/versioned_docs/version-2.9.0/setup/env-vars.md +++ b/docs/versioned_docs/version-2.9.0/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.9.0/setup/heroku.md b/docs/versioned_docs/version-2.9.0/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.9.0/setup/heroku.md +++ b/docs/versioned_docs/version-2.9.0/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.9.0/tooljet_database.md b/docs/versioned_docs/version-2.9.0/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.9.0/tooljet_database.md +++ b/docs/versioned_docs/version-2.9.0/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-2.9.4/setup/env-vars.md b/docs/versioned_docs/version-2.9.4/setup/env-vars.md index 235ffa43b8..1210c6a94e 100644 --- a/docs/versioned_docs/version-2.9.4/setup/env-vars.md +++ b/docs/versioned_docs/version-2.9.4/setup/env-vars.md @@ -304,9 +304,10 @@ If you intend to use client separately then can set `SERVE_CLIENT` to `false`. If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: :::info diff --git a/docs/versioned_docs/version-2.9.4/setup/heroku.md b/docs/versioned_docs/version-2.9.4/setup/heroku.md index a99a4a101e..efb7ac193c 100644 --- a/docs/versioned_docs/version-2.9.4/setup/heroku.md +++ b/docs/versioned_docs/version-2.9.4/setup/heroku.md @@ -115,9 +115,10 @@ Please install Heroku CLI on your local machine. Please refer Heroku CLI install You can also refer environment variable [**here**](/docs/setup/env-vars/#enable-tooljet-database--optional-). :::tip - If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + 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. + If this parameter is not specified, PostgREST will refuse authentication requests. ::: ```bash diff --git a/docs/versioned_docs/version-2.9.4/tooljet_database.md b/docs/versioned_docs/version-2.9.4/tooljet_database.md index b337d04d3c..bf4b524a00 100644 --- a/docs/versioned_docs/version-2.9.4/tooljet_database.md +++ b/docs/versioned_docs/version-2.9.4/tooljet_database.md @@ -24,9 +24,10 @@ This feature is only enabled if [`ENABLE_TOOLJET_DB`](/docs/setup/env-vars#enabl 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 talks with ToolJet server and therefore does not have to be publicly exposed. :::tip -If you have openssl installed, you can run the following command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. +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. +If this parameter is not specified, PostgREST will refuse authentication requests. ::: | variable | description | diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/actions/_category_.json new file mode 100644 index 0000000000..f5b2dfe045 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Actions Reference", + "position": 7, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/close-modal.md b/docs/versioned_docs/version-3.0.0-LTS/actions/close-modal.md new file mode 100644 index 0000000000..bb772142f9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/close-modal.md @@ -0,0 +1,19 @@ +--- +id: close-modal +title: Close modal +--- + +Use this action to close the modal that is already shown. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Close modal + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/control-component.md b/docs/versioned_docs/version-3.0.0-LTS/actions/control-component.md new file mode 100644 index 0000000000..bab10a66bb --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/control-component.md @@ -0,0 +1,102 @@ +--- +id: control-component +title: Control component (Component Specific Actions) +--- + +Control component action invokes the component specific actions. Component specific actions are the actions that are exclusive actions for a particular component. Component specific actions can be triggered either through the event handlers or from the Run JavaScript code query. + +You can find the component specific actions for the specific component in their respective documentation. For example, you can find the component specific actions for the **Bounded Box** component in the [Bounded Box](/docs/widgets/bounded-box) documentation. + +
    + Currently, Component specific actions are supported only by the below listed components. + +
    + +:::info +Check out the **[demo](https://youtu.be/JIhSH3YeM3E)** of Component specific actions demonstrated in one of our community call. +::: + +## Using Component Specific Actions + +### Set a value for text input component using button's event handler + +- Drag a **Text Input** and a **Button** component onto the canvas. + +- Go to the **Inspector** on the left sidebar to check the exposed variables available for the `textinput1` component under the `components`. You'll see that the variable `value` is an empty string because the field value of the text input component is empty right now. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/inspector.png) + +
    + +- Now enter some value in the text input component and you'll see that the `value` in inspector has been updated. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/updated.png) + +
    + +- Now, click on the button's component handler to open up its properties in the right sidebar and then add a event handler for **On Click** event to trigger **Control Component** action. Select `textinput1` in component dropdown, `Set text` as Action, and in `Text` field enter the text that you want to update in the field value. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/button.png) + +
    + +- Now when you'll click on the button you'll see that the field value of the text input component has been updated with value that you set. + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/set.png) + +
    + + +### Clear value of text input component using JavaScript query + +- Let's clear the value that we set in the previous section, using Run JavaScript code. Create a new Run JavaScript Code query and call the component and the CSA that component provides. + +**Syntax:** +```js +await components.textinput1.clear() +``` + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/jsoption.png) + +
    + + +
    + +![ToolJet - Action reference - Control Component](/img/actions/controlcomponent/clear.png) + +
    + +- Finally, hit the **save and run** query button to fire up the query, and you'll see that the field value of the text input component has been cleared. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/copy-to-clipboard.md b/docs/versioned_docs/version-3.0.0-LTS/actions/copy-to-clipboard.md new file mode 100644 index 0000000000..81f97c360e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/copy-to-clipboard.md @@ -0,0 +1,18 @@ +--- +id: copy-to-clipboard +title: Copy to clipboard +--- + +Use this action to copy the text to the clipboard. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Copy to clipboard + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/generate-file.md b/docs/versioned_docs/version-3.0.0-LTS/actions/generate-file.md new file mode 100644 index 0000000000..5e969b87a8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/generate-file.md @@ -0,0 +1,56 @@ +--- +id: generate-file +title: Generate file +--- + +# Generate file + +This action allows you to construct files on the fly and let users download it. + +## Options + +| Option | Description | +|--------|-------------| +| Type | Type of file to be generated. Types: `CSV`, `Text` and `PDF` | +| File name | Name of the file to be generated | +| Data | Data that will be used to construct the file. Its format will depend on the file type, as specified in the following section | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::tip +Check how to run **[generate file action using RunJS](/docs/how-to/run-actions-from-runjs/#generate-file)**. +::: + +### CSV Data Format + +To use the `CSV` file format, the data field should contain an array of objects. ToolJet assumes that the keys in each object are the same and represent the column headers of the CSV file. + +Example: + +```javascript +{{ + [ + { name: 'John', email: 'john@tooljet.com' }, + { name: 'Sarah', email: 'sarah@tooljet.com' }, + ] +}} +``` + +Using the above code snippet will generate a CSV file with the following content: + +```csv +name,email +John,john@tooljet.com +Sarah,sarah@tooljet.com +``` + +### Text Data Format + +To use the `Text` file format, the data field should contain a string. + +If you want to generate a text file based on an array of objects, you need to stringify the data before providing it. + +For example, if you are using the table component to provide the data, you can enter **`{{JSON.stringify(components.table1.currentPageData)}}`** in the Data field. + +### PDF data format + +The PDF data format supports two types of input: either a `string` or an `array of objects`. When using an array of objects, the resulting PDF will display the data in a tabular format with columns and rows. On the other hand, if a string is provided, the generated PDF will consist of plain text. diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/go-to-app.md b/docs/versioned_docs/version-3.0.0-LTS/actions/go-to-app.md new file mode 100644 index 0000000000..e38e00468e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/go-to-app.md @@ -0,0 +1,18 @@ +--- +id: go-to-app +title: Go to app +--- + +This action allows you to open any released ToolJet application when an event occurs. Only the apps that are released can be opened using this action. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Open webpage + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/logout.md b/docs/versioned_docs/version-3.0.0-LTS/actions/logout.md new file mode 100644 index 0000000000..0e3187471c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/logout.md @@ -0,0 +1,18 @@ +--- +id: logout +title: Logout +--- + +This action allows you to log out of the application (ToolJet). + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -  Logout + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/open-webpage.md b/docs/versioned_docs/version-3.0.0-LTS/actions/open-webpage.md new file mode 100644 index 0000000000..749b205eb9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/open-webpage.md @@ -0,0 +1,18 @@ +--- +id: open-webpage +title: Open webpage +--- + +You can use this action to open a webpage(on a new tab) for any event. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Open webpage + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/run-query.md b/docs/versioned_docs/version-3.0.0-LTS/actions/run-query.md new file mode 100644 index 0000000000..55eb1f16aa --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/run-query.md @@ -0,0 +1,18 @@ +--- +id: run-query +title: Run Query +--- + +This action allows you to fire queries when an event occurs. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -  Run Query + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/set-localstorage.md b/docs/versioned_docs/version-3.0.0-LTS/actions/set-localstorage.md new file mode 100644 index 0000000000..bfa52c0a5e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/set-localstorage.md @@ -0,0 +1,58 @@ +--- +id: set-localstorage +title: Set localStorage +--- + +# Set localStorage + +This action allows you to specify a `key` and its corresponding `value` to be stored in local storage of the browser. Local storage can be useful in a lot of scenarios. Some of the most common use cases of the local storage includes: +- Saving form values so that users don't accidentally lose them if they reload the page +- Storing any kind of data that is not going to be transferred to the database + +
    + +## Example: Setting a Component Value Based on Local Storage + +1. Add **Text Input**, **Button** and **Text** components to the canvas. + +
    + Add Components To The Canvas +
    + + +2. Select the Button, add a new event handler, and add a `Set local storage` action with `key` set to `localtest` and `value` set to `{{components.textinput1.value}}`. + +
    + Set Local Storage +
    + + This will set a local storage value with `localtest` as the key and the value entered in the Text Input component as its value. + +3. Create a `Run JavaScript code` query, and enter the code below: + + ```js + return localStorage.getItem("localtest"); + ``` +
    + Create RunJS Query +
    + + Click on the **Run** button in the Query Panel. This query will fetch the `localtest` local storage variable that we had set earlier. + +4. Select the **Text** component. Under its `Text` property, enter `{{queries.runjs1.data}}`. Now, the Text component will display the value returned by the `Run JavaScript code` query - the local variable we had set earlier. +
    + Update Value Of Text Component Based On Local Storage +
    + +5. Select the Button component. Add a new event handler to it, add a `Run query` action, select `runjs1` as the query, and set a debounce of `300`. +
    + Updating Text On Button Click +
    + + Now, every time you click on the Button component, it will set the local storage value, and the Text component will display the value set in local storage. + + :::info + Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + ::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/set-page-var.md b/docs/versioned_docs/version-3.0.0-LTS/actions/set-page-var.md new file mode 100644 index 0000000000..5c50bab3ee --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/set-page-var.md @@ -0,0 +1,36 @@ +--- +id: set-page-variable +title: Set page variable +--- + +Page variables are restricted to the page where they are created and cannot be accessed throughout the entire application like regular variables. + +Use this action to establish a variable and assign a value to it within the [Multipage Apps](/docs/tutorial/pages). + +By default, the debounce field is left empty. However, you can input a numeric value to indicate the time in milliseconds before the action is executed. For example, `300`. + +
    + +ToolJet - Action reference - Switch page + +
    + +## Using RunJS query to set page variable + +Alternatively, the set page variable action can be triggered via a RunJS query using the following syntax: +```js +await actions.setPageVariable('',) +``` + +`variablekey` must be provided as a string (enclosed in quotes), while the `variablevalue` does not require quotation marks if it is a numerical value. + +
    + +ToolJet - Action reference - Switch page + +
    + +:::info +For instructions on how to run actions from a RunJS query, refer to the how-to guide [Running Actions from RunJS Query](/docs/how-to/run-actions-from-runjs). +::: + diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/set-table-page.md b/docs/versioned_docs/version-3.0.0-LTS/actions/set-table-page.md new file mode 100644 index 0000000000..6c6414650c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/set-table-page.md @@ -0,0 +1,24 @@ +--- +id: set-table-page +title: Set Table Page +--- + +Use this action to change the page index in the table widget. + +## Options + +| Option | Description | +|--------|-------------| +| Table | Select table from the dropdown | +| Page Index | Numerical value for the page index. ex: `{{2}}` | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Open webpage + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/set-variable.md b/docs/versioned_docs/version-3.0.0-LTS/actions/set-variable.md new file mode 100644 index 0000000000..ef611d43ba --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/set-variable.md @@ -0,0 +1,24 @@ +--- +id: set-variable +title: Set variable +--- + +This action allows you to create a variable and assign a `value` to it. + +## Options + +| Option | Description | +|--------|-------------| +| Key | Name(String) of the variable through which you can access the value | +| Value | A value can be a string, number, boolean expression, array, or object | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -Set variable + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/show-alert.md b/docs/versioned_docs/version-3.0.0-LTS/actions/show-alert.md new file mode 100644 index 0000000000..f92ec12cd7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/show-alert.md @@ -0,0 +1,23 @@ +--- +id: show-alert +title: Show alert +--- + +This action allows you to display an alert message. + +You can set a custom **message** for the alert and choose a particular alert type. + +There are 4 types of alert messages - **Info**, **Success**, **Warning**, and **Error**. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -  Show Alert + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/show-modal.md b/docs/versioned_docs/version-3.0.0-LTS/actions/show-modal.md new file mode 100644 index 0000000000..10f5d9ab17 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/show-modal.md @@ -0,0 +1,18 @@ +--- +id: show-modal +title: Show modal +--- + +Use this action to show the modal for an event. + +Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference - Show modal + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/switch-page.md b/docs/versioned_docs/version-3.0.0-LTS/actions/switch-page.md new file mode 100644 index 0000000000..2438fb45e7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/switch-page.md @@ -0,0 +1,55 @@ +--- +id: switch-page +title: Switch Page +--- + +Utilize this action with various event handler to transition to a different page within the [Multipage App](/docs/tutorial/pages). + +By default, the debounce field is left empty. However, you can input a numeric value to indicate the time in milliseconds before the action is executed. For example, `300`. + +
    + +ToolJet - Action Reference - Page Switching + +
    + +## Query Params + +Query parameters can be passed through action such as `Switch Page`. The parameters are appended to the end of the application URL and are preceded by a question mark (`?`). + +Query parameters are composed of key-value pairs, where the `key` and `value` are separated by an equals sign (`=`). Multiple query parameters can be included by clicking on the `+` button. + +
    + +ToolJet - Action Reference - Page Switching + +
    + +In the above screenshot, we have provided the `username` as the key and the value is `{{globals.currentUser.email}}` which gets the email of the signed in user dynamically. When the button is clicked to trigger the `Switch Page` event handler attached to it then the URL on the switched page will have the parameters. + +They are commonly used to provide additional information to the server or to modify the behavior of a web page. They can be used for filtering search results, pagination, sorting, and various other purposes. + +
    + +ToolJet - Action Reference - Page Switching + +
    + +## Using RunJS query to switch page + +Alternatively, the switch page action can be activated via a RunJS query using the following syntax: +```js +await actions.switchPage('') +``` + +:::info +For instructions on how to run actions from a RunJS query, refer to the how-to guide [Running Actions from RunJS Query](/docs/how-to/run-actions-from-runjs). +::: + +### Switch page with query params + +The switch page action can also be triggered along with query parameters using the following syntax: + +```js +actions.switchPage('', [['param1', 'value1'], ['param2', 'value2']]) +``` diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/unset-page-var.md b/docs/versioned_docs/version-3.0.0-LTS/actions/unset-page-var.md new file mode 100644 index 0000000000..933721c12d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/unset-page-var.md @@ -0,0 +1,27 @@ +--- +id: unset-page-variable +title: Unset page variable +--- + +Utilize this action to clear a variable that was established using the [set page variable action](/docs/actions/set-page-variable). + +By default, the debounce field is left empty. However, you can input a numeric value to indicate the time in milliseconds before the action is executed. For example, `300`. + +
    + +ToolJet - Action reference - Switch page + +
    + +## Using RunJS query to unset variable + +Alternatively, the unset page variable action can be triggered via a RunJS query using the following syntax: +```js +await actions.unsetPageVariable('') +``` + +`variablename` is the key of the variable that was provided while creating the variable. + +:::info +For instructions on how to run actions from a RunJS query, refer to the how-to guide [Running Actions from RunJS Query](/docs/how-to/run-actions-from-runjs). +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/actions/unset-variable.md b/docs/versioned_docs/version-3.0.0-LTS/actions/unset-variable.md new file mode 100644 index 0000000000..7da5a78161 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/actions/unset-variable.md @@ -0,0 +1,23 @@ +--- +id: unset-variable +title: Unset variable +--- + +This action allows you to remove the variable that was created using the set variable action. + +## Options + +| Option | Description | +|--------|-------------| +| Key | Name(String) of the variable through which you can access the value | +| Debounce | Debounce field is empty by default, you can enter a numerical value to specify the time in milliseconds after which the action will be performed. ex: `300` | + +:::info +You can also trigger actions from the **JavaScript code**. Check it out [here](/docs/how-to/run-actions-from-runjs). +::: + +
    + +ToolJet - Action reference -Unset variable + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/anti-patterns.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/anti-patterns.md new file mode 100644 index 0000000000..096f10ad1f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/anti-patterns.md @@ -0,0 +1,131 @@ +--- +id: anti-patterns +title: Anti-Patterns to Avoid +--- + +When building applications with ToolJet, it's essential to follow best practices to ensure your apps are efficient, maintainable, and provide a smooth user experience. This documentation outlines common anti-patterns to avoid while using ToolJet and offers solutions to optimize your applications. + +--- + +## 1. Unmanaged Component Naming + +- **Anti-Pattern**: Using default or non-descriptive names for components. +- **Solution**: **Rename all components with meaningful names to make the apps more manageable as they grow.** +- **Reason**: Descriptive names improve readability, making it easier for you and others to understand and maintain the app's structure. + +--- + +## 2. Exceeding Component Limits + +- **Anti-Pattern**: Having more than 2,500 components in a single app. +- **Solution**: **Limit each app to a maximum of 2,500 components.** +- **Reason**: Exceeding this number can slow down the app builder and live apps, impacting both development speed and user experience. + +--- + +## 3. Client-Side Operations for Large Data Sets + +- **Anti-Pattern**: Handling large data sets with client-side operations on the Table component. +- **Solution**: **Implement [server-side operations](/docs/widgets/table/serverside-operations/overview) for handling large data sets.** +- **Reason**: Server-side operations reduces the amount of data loaded at once, improving load times and performance. + +--- + +## 4. Simultaneous Execution of Multiple JavaScript Queries + +- **Anti-Pattern**: Triggering a large amount of JavaScript queries simultaneously through a single event. For example, using an event to trigger a **Run JavaScript code** query that contains code to execute 15-20 other **Run JavaScript code** queries within the application. +- **Solution**: **Limit the number of simultaneous JavaScript queries triggered by a single event.** +- **Reason**: Triggering numerous Run JavaScript queries at the same time can significantly degrade browser performance as it each JavaScript query creates **[new execution environment](https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API/Microtask_guide/In_depth#javascript_execution_contexts)** within the browser. JavaScript in browsers runs on a single main thread. When multiple scripts are executed concurrently, they compete for execution time on this thread. + +--- + +## 5. Storing Base64 Data in Variables + +- **Anti-Pattern**: Capturing and storing Base64 data directly in variables. +- **Solution**: **Store large data, like base64 images, in a database and retrieve it as needed.** +- **Reason**: Storing Base64 data in variables can consume significant memory and slow down the app. Retrieving data from a database as needed optimizes performance. + +--- + +## 6. Loading All Tabs Simultaneously + +- **Anti-Pattern**: Loading all items in the Tab component at once when there are numerous tabs. +- **Solution**: **Enable the “Render only active tabs” option.** +- **Reason**: This prevents unnecessary loading of inactive tabs, reducing initial load times and improving performance. + +--- + +## 7. Excessive Number of Pages in an App + +- **Anti-Pattern**: Including too many pages within a single app. +- **Solution**: **Limit the number of pages per app to maintain optimal performance.** +- **Reason**: An excessive number of pages can slow down the app and make it difficult to manage. Organize content efficiently and consider splitting the app if necessary. + +--- + +## 8. Using Non-Blocking Commands in JavaScript for Synchronous Operations + +- **Anti-Pattern**: Using non-blocking commands like `Promise.all` and `setTimeout` in the **Run JavaScript code** query when an accurate isLoading state is needed. +- **Solution**: **Avoid non-blocking operations in JavaScript Queries if you require an accurate isLoading status. Ensure your code is synchronous within the Run JavaScript code query.** +- **Reason**: Non-blocking operations can cause **Run JavaScript code** query to exit before these commands complete, leading to an incorrect isLoading status and potentially confusing users. + +--- + +## 9. Triggering Unnecessary Queries on Page Load + +- **Anti-Pattern**: Triggering all queries on page load, regardless of their necessity. +- **Solution**: **For multi-page apps, only trigger queries on page load that are needed for the specific page.** +- **Reason**: Loading unnecessary data consumes resources and slows down page load times. Optimizing queries enhances performance. + +--- + +## 10. Using Actions inside Loop Functions +- **Anti-Pattern**: Using actions inside loop functions. + +Example: +You have a Table displaying data from `{{page.variables.data}}` and a **Save Changes** button that updates the data. When users edit rows and click **Save Changes**, you might initially implement the update like this: + +```javascript +const data = page.variables.data; +Object.values(components.table1.dataUpdates).forEach(ele => { + data[ele.id] = ele; + actions.setPageVariable("data", data); +}); +``` + +The setPageVariable action is executed inside the loop for each row update. This causes the table to re-render every time the variable is updated, leading to significant performance degradation, especially when multiple rows or cells are updated simultaneously. + +- **Solution**: **Modify your code to update the page variable once after all changes are processed**: + +```javascript +const data = page.variables.data; +Object.values(components.table1.dataUpdates).forEach(ele => { + data[ele.id] = ele; +}); +actions.setPageVariable("data", data); +``` + +- **Reason**: By updating the variable after the loop completes, the table re-renders only once. This reduces unnecessary processing and significantly improves performance when handling multiple updates. + +--- + +## 11. Direct Mutation of Data + +- **Anti-Pattern**: Directly mutating data structures through JavaScript code, such as using `queries.getEmployees.data = []`. +- **Solution**: Always use ToolJet's built in **[actions](/docs/how-to/run-actions-from-runjs/)** to manipulate data. +- **Reason**: Direct mutation of data can lead to unexpected bugs and make debugging more complex. + +--- + +## 12. Naming Component/Query with Hyphen or Space + +- **Anti-Pattern**: Naming components or queries with hyphens or spaces in between, such as `run-py1` or `my query`. +- **Solution**: **Use names without hyphens or spaces**, or reference them using bracket notation (e.g., `{{queries['run-py1'].isLoading}}`). +- **Reason**: Hyphens and spaces can cause syntax issues. Using bracket notation or avoiding these characters ensures consistency and prevents errors in query or component references. + +--- + +## Conclusion + +Avoiding these anti-patterns when using ToolJet ensures that your applications are efficient, responsive, and maintainable. By following these best practices, you can enhance user experience and simplify app management. Always consider the impact of your development choices on both performance and scalability. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/canvas.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/canvas.md new file mode 100644 index 0000000000..99d2a75318 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/canvas.md @@ -0,0 +1,67 @@ +--- +id: canvas +title: Canvas +--- + +Canvas is the center area of the ToolJet app builder where the application is built. You arrange the **components** by dragging them from the Components library(right-sidebar). + +
    + +App Builder: Canvas + +
    +
    + +:::info +- The Canvas height and width can be adjusted from the [Global Settings](/docs/app-builder/left-sidebar#global-settings). +- When the [Pages drawer](/docs/tutorial/pages) on the left is opened or pinned, the canvas becomes horizontally scrollable. + +
    + +App Builder: Canvas + +
    +::: + +### Arrange Components + +All the components are fully interactive in editor mode - to prevent interaction you can **click and hold** the **Component Handle** to change component's position. + +
    + +App Builder: Canvas + +
    + +### Resize Components + +Components on the canvas can be resized from the edges. + +You can precisely set the position of selected components using keyboard arrow keys after clicking the component handle. + +
    + +App Builder: Canvas + +
    + +### Group Components + +ToolJet comes with flexible components to group other components together, such as **[Container](/docs/widgets/container/)** and **[Form](/docs/widgets/form/)**. When you drag and drop components in containers/forms they create a group of nested components. All components can be nested in this way. + +### Hide or Disable Components + +Hide or Disable a component by setting its **Visibility** or **Disabled** property to `true`. Click on the component handle to open **config inspector** on right side. These values can also evaluate to true based on a truthy value. For example, you can use the property of one component to toggle the Visibility property of another component dynamically, you just need to write a conditional statement. + +For example: We want to disable a button when a checkbox is checked so we can simple use `{{components.checkbox1.value}}` in **Disable** property of the button. `{{components.checkbox1.value}}` evaluates to `true` when the checkbox is checked, and false when unchecked. + +
    + +App Builder: Canvas + +
    + +### Clone Components + +You can clone existing components on the canvas by **cmd/ctrl + d**. Check other **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)**. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/customcss.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/customcss.md new file mode 100644 index 0000000000..73f8e1dece --- /dev/null +++ b/docs/versioned_docs/version-3.0.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.0.0-LTS/app-builder/import-export-apps.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/import-export-apps.md new file mode 100644 index 0000000000..b616372eb3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/import-export-apps.md @@ -0,0 +1,46 @@ +--- +id: importing-exporting-applications +title: Import and Export Applications +--- + +This documentation explains the process of exporting and importing applications in ToolJet. + +
    + +## Exporting Applications + +- Navigate to the dashboard. +- Click on the settings icon located in the top right corner of the application. +- Click on the **Export app** button. + +
    + Export App Button +
    + +- If you select `Export All`, all the versions of the application will be exported in JSON format. If you select `Export selected version`, only the selected version will be exported in JSON format. +- Ticking the `Export ToolJet table schema` checkbox will also export the related ToolJet Database table schemas with your application. In this case, when you import the application in a workspace, the related ToolJet Database tables will also be created. + +
    + Export App Options +
    + +
    + +
    + +## Importing Applications + +- Navigate to the dashboard. +- Click on the ellipses on the **Create new app** button and select `Import`. + +
    + Import App Button +
    + +- After clicking on `Import`, choose the relevant JSON file that you previously downloaded during the application export process. + +
    + Select App To Import +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/left-sidebar.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/left-sidebar.md new file mode 100644 index 0000000000..9ae50217a7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/left-sidebar.md @@ -0,0 +1,98 @@ +--- +id: left-sidebar +title: Left-sidebar +--- + +Left-sidebar has the following options: + +- **[Pages](#pages)** +- **[Inspector](#inspector)** +- **[Debugger](#debugger)** +- **[Global Settings](#global-settings)** +- **[Comments](#comments)** +- **[Theme switch](#theme-switch)** + +
    + +App Builder: Left-sidebar + +
    + +## Pages + +Pages allows you to have multiple pages in a single application, making your ToolJet applications more robust and user-friendly. + +Check the detailed documentation for **[Pages](/docs/tutorial/pages)**. + +
    + +App Builder: Left-sidebar + +
    + +## Inspector + +The Inspector can be used to inspect the data of the **queries**, properties and values of the **components** that are there on the canvas, ToolJet's global variables and the variables that have been set by the user. + +Check the detailed guide on **[using Inspector](/docs/how-to/use-inspector)**. + +
    + +App Builder: Left-sidebar + +
    + +## Debugger + +Debugger records any errors that occur during the execution of queries. For instance, if a database query fails because the database is unavailable or if a REST API query fails due to an incorrect URL, the errors will be captured and shown in the debugger. Additionally, the debugger provides pertinent information associated with the error alongside the error message. + +If you wish to prevent the debugger from closing, you can simply click on the pin icon located in the top-right corner. By doing so, the debugger will stay open until you decide to unpin it. + +To clear all the errors on the debugger, you can click on the `Clear` button. + +Debugger consists of two main sections: + +1. **All Log:** In this section, you can view a comprehensive list of all the logs generated during the execution of the application. These logs may include various types of messages, such as success messages, warning, and error messages. + +2. **Errors:** This section specifically focuses on displaying the error messages that occurred during the program's execution. These error messages indicate issues or problems that need attention, as they may lead to unexpected behaviors of the application. + +## Global Settings + +To configure the app's global settings, click on the kebab menu(three vertical dots) on the left of the app name. Global settings include: + +- **Unique app slug**: The unique slug of the application. This slug is used in the URL of the application. By default, the slug is the `app id` of the application. You can change the slug to a custom value. For example, if the slug is `7b56293b-be5a-401f-8806-b71625f8ee0d` you can change it to `` then the new URL of the application will be `https://app.tooljet.com//apps//` +- **App link**: The link to the application. This link can be used to share the application with other users of the workspace. If you want to share the application with users outside the workspace, you can make the application public from the **[Share](/docs/app-builder/share)** modal. +- **Hide header for launched apps**: Toggle this on to the hide the tooljet's header when the applications are launched +- **Maintenance mode**: Toggle this on to put the application in maintenance mode. When in **maintenance mode**, on launching the app, the user will get an error message that **the app is under maintenance**. +- **Max width of canvas**: Modify the width of the canvas in **px** or **%**. The default width is `1292` px. +- **Canvas background**: Enter the hex color code or choose a color from the picker to change the background color of the canvas. You can also click on the **fx** to programmatically set the value. +- **App mode**: Select between three theme modes - Auto (default, adapts to browser settings), Light (brighter interface for well-lit conditions), and Dark (reduces eye strain in low light). +- **Export app**: Click on the [Export app](/docs/dashboard/#export-app) button to export the application as a JSON file. You can import this JSON file in any other workspace to use the application. + +
    + +App Builder: Left-sidebar + +
    + +## Comments + +Comment anywhere on the canvas and collaborate with other users in the workspace. Click on the comments button to enable it and then drop comment anywhere on the canvas. + +
    + +App Builder: Left-sidebar + +
    + +## Theme Switch + +Use the theme switch button to toggle ToolJet between light and dark modes. + +While developers can access the current theme's value through global variables using `{{globals.theme.name}}`, it is not currently feasible to change the theme programmatically. + +
    + +App Builder: Left-sidebar + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/overview.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/overview.md new file mode 100644 index 0000000000..6340e83798 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/overview.md @@ -0,0 +1,27 @@ +--- +id: overview +title: Overview +--- + +# App-Builder: Overview + +ToolJet's App-Builder is a visual development platform that lets you create business applications in minutes. Transform your ideas into working solutions using an intuitive drag-and-drop interface that helps you design everything from simple forms to complex dashboards. + +
    + App Builder Preview +
    + +Getting started is straightforward – design your interface, connect your data sources, and add business logic through the visual builder. As your needs grow, extend your applications with custom code and use GitSync to streamline application management. + +Explore these hands-on guides to start building your first app. The step-by-step guides will walk you through the App-Builder's essential features: + +- **[Create UIs Using Pre-Built Components](/docs/app-builder/walkthrough/create-ui)** +- **[Create Queries to Interact With Data Sources](/docs/app-builder/walkthrough/create-queries)** +- **[Use Custom Code](/docs/app-builder/walkthrough/using-code)** +- **[Access and Referring Values Within The App-Builder](/docs/app-builder/walkthrough/accessing-values)** +- **[Create and Managing Variables](/docs/app-builder/walkthrough/variables)** +- **[Use Gitsync to Sync your Application with a Git Repository](/docs/gitsync)** +- **[Versioning and Release](/docs/development-lifecycle/release/version-control)** +- **[Import and Export Apps](/docs/app-builder/importing-exporting-applications)** + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/preview.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/preview.md new file mode 100644 index 0000000000..d6aef27a9b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/preview.md @@ -0,0 +1,12 @@ +--- +id: preview +title: Preview +--- + +You can preview your app by clicking on the `Preview` icon on the top-right of the App-Builder. + +
    + App In Preview Mode +
    + +Once you are in preview mode, you can change preview settings to test the app in different settings. Change the version of the app and switch between different versions to see how they compare. You can also select **Mobile** or **Desktop** view to see how the components are displayed in different screen settings. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/query-panel.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/query-panel.md new file mode 100644 index 0000000000..c45295d913 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/query-panel.md @@ -0,0 +1,152 @@ +--- +id: query-panel +title: Query Panel +--- + +The Query Panel, located at the bottom of the app-builder, allows you to create and manage queries to interact with connected **data sources**. It provides the capability to perform API requests, query **[databases](/docs/data-sources/overview)**, and apply **[transformations](/docs/tutorial/transformations)** or data manipulation using **[JavaScript](/docs/data-sources/run-js)** and **[Python](/docs/data-sources/run-py)**. + +The Query Panel consists of two sections: +- The **[Query Manager](#query-manager)** on the left side, which displays a list of all the created queries. +- The **[Query Editor](#query-editor)** on the right side, used to configure the selected query. + +Query Panel + +
    + +## Query Manager + +The Query Manager on the left lists all the queries that have been created in the application. Query Manager helps in managing the queries that have been created. + +Query Panel + +The **+** button on the Query Manager is used to add new queries in the application. When **+** button is clicked, a menu will open with a list of options for creating a query from the available data sources. + +### Sort and Filter Queries +On the top of Query Manager, there is button to Sort or Filter queries. The button allows you to select from the following options: + +**Filter:** +- By Data source + +**Sort:** +- Name: A-Z +- Name: Z-A +- Type: A-Z +- Type: Z-A +- Last modified: oldest first +- Last modified: newest First + +Next to the filter is the search box that can be used to search for a specific query. + +### Edit, Copy and Delete Queries + +On hovering on a query name, you can see the edit, copy and delete buttons. +The edit button lets you rename the query, the delete button lets you delete the selected query, and the duplicate button duplicates the selected query. + +
    + +
    + +## Query Editor + +Query Editor provides the functionality to construct queries either through a low-code interface or by manually entering the query text. + +:::info +The changes made in the query panel will be saved automatically. +::: + +Query Panel + +### Query Name + +Apart from the query editor, the query name is displayed at the top of the query panel. Click on it to make edits and customize the query name as needed. + +Query Editor + +### Custom Parameters + +Custom parameters provide a convenient method for passing variables to a query. To add parameters, simply click the **+ Add** button next to the Parameters label in the query editor. + +For each parameter, you need to specify: +- **Name**: The identifier for the parameter. +- **Default value**: This value can be a constant string, number, or object. + +**Syntax for utilizing the parameter:** Employ `parameters.` in your query. It's important to note that parameters can only be utilized within the specific query where they are defined. + +Learn more about **[Using Custom Parameters](/docs/how-to/use-custom-parameters)**. + +Custom Parameters + +### Preview + +The Preview button allows you to preview the data returned by the query. The data is displayed in the preview section at the bottom of the query panel, aiding in query debugging without triggering the query in the app. + +Data preview is available in two formats: **Raw** and **JSON**. Click the clear button to reset the preview data. + +Query Editor + +### Run + +The Run button triggers the query, causing it to interact with the application. This action differs from the **Preview** feature. + +Query Editor + +### Query Configuration + +Query Configuration allows you to set vital values that are necessary to generate a response from a database. These configurations may include but are not limited to: + +- **Data source**: Name of the data source +- **Operation**: The kind of operation you want to perform (For e.g., **List collections**, **Find one**, **Find many**,etc.) + +The set of configuration options you get depend on the type of data source. + +Query Editor + +#### Data Source + +The primary and default parameter for all queries is **data source**. This option enables the selection of the appropriate data source for your query. + +In cases where multiple data sources of the same type are connected, easily switch the query's data source using the dropdown menu. + +Query Editor + +### Transformation + +Queries can be enhanced with transformations to modify the query results. ToolJet supports transformations using two programming languages: JavaScript & Python. Refer to the detailed documentation on **[Transformations](/docs/tutorial/transformations)** for more information. + +Query Editor + +### Settings + +Query Editor + +- **Run this query on application load?** Enabling this option executes the query every time the app is loaded. +- **Request confirmation before running the query?** Enabling this option displays a confirmation modal, prompting for a *Yes* or *No* before running the query. +- **Show notification on success?** Enabling this option shows a success toast notification when the query is successfully triggered. Customize the *success message* and *notification duration* in seconds. + +### Events + +Event handlers can be added to queries for the following events: + +- **Query Success** +- **Query Failure** + +Event handlers link actions in your application for smoother operation. Here's an example: + +Scenario: You have two queries: + +- *getTodos*: Fetches your to-do list. +- *deleteTodos*: Removes a to-do item. +- Event Handler: A Query Success event handler on deleteTodos that runs getTodos after a deletion. + +The Result: +- User deletes a to-do. +- The event handler refreshes the to-do list. +- The component displaying the to-do data will be update with the lates data. + +:::info +Learn more about [Event Handlers and Actions](/docs/widgets/overview#component-event-handlers). +::: + +Query Editor + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/right-sidebar.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/right-sidebar.md new file mode 100644 index 0000000000..daa0d48794 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/right-sidebar.md @@ -0,0 +1,29 @@ +--- +id: components-library +title: Components Library +--- + +The **Components Library** on the right sidebar contains all of the available components. Use this to drag-and-drop a component from the library to the canvas. It organizes components into sections and you can enter a search term to quickly find a component you need. + +
    + +App Builder: Component library- right sidebar + +
    + +:::tip +Check the **[Components Catalog](/docs/widgets/overview)** to know more about specific component. +::: + +## Properties Panel + +The Properties Panel contains all the available settings for the selected component and is where you **set values**, **update component names**, and **create event handlers**. The Properties Panel organizes settings into different sections, such as **Properties** and **Styles**. + +To open the Properties Panel, click on the **[component handle](/docs/app-builder/canvas#arrange-components)** that is present on the top of the component including **⚙️ + Component Name** and the Properties Panel will open up on the right side. + +
    + +App Builder: Component library- right sidebar + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/share.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/share.md new file mode 100644 index 0000000000..fdd2874eaf --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/share.md @@ -0,0 +1,56 @@ +--- +id: share +title: Share +--- + +ToolJet apps offer two sharing options: private sharing with workspace users or public sharing via a generated link. To obtain the shareable URL, click the **Share** icon on the top bar of the App Builder. + +
    + +Share modal + +
    + +### Making the app public + +To share the app publicly and make it accessible to anyone on the internet without requiring a ToolJet login, toggle the **Make application public** switch in the Share modal. + +:::info +Only released apps can be accessed using the Shareable app link. +::: + +
    + +Make Application Public + +
    + +### Customizing the app URL + +By default, ToolJet will generate a unique URL for your application. However, you also have the option to edit the slug of the URL to make it more customized and user-friendly. + +
    + +Edit Slug/URL + +
    + +### Embedding ToolJet Apps + +ToolJet apps can be directly shared with end users and embedded into web apps using `iframes`. If you want to make your application public, you can use the Share modal to obtain the embeddable link. + +:::info +For embedding private ToolJet apps, you'll need to set an environment variable in the `.env` file. + +| Variable | Description | +|:-------------- |:------------------------------------ | +| ENABLE_PRIVATE_APP_EMBED | `true` or `false` | + +You can learn more [here](/docs/setup/env-vars#enabling-embedding-of-private-apps). +::: + +
    + +Share modal + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/toolbar.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/toolbar.md new file mode 100644 index 0000000000..0588d795f3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/toolbar.md @@ -0,0 +1,119 @@ +--- +id: topbar +title: Topbar +--- + +The Topbar of the app-builder interface serves as a central hub for configuring app settings. + +### Application Name + +To modify the app name, click on the application name on the left side of the topbar. + +
    + App Builder: App Name +
    + +### Desktop or Mobile layout + +Toggle between Mobile and Desktop views directly from the topbar to switch the canvas mode. + +
    + App Builder: Mobile and Desktop Mode +
    + +#### Showing Components on Mobile or Desktop layout + +Select a component and navigate to its Properties Panel on the right. Scroll down to the **Devices** section and toggle on the `Show on mobile` option. This will ensure that the component is visible in Mobile view. + +
    + App Builder: Show On Mobile Icon +
    + +Similarly, you can toggle on the `Show on desktop` option to make the component visible in the Desktop view. + +### Changes Saved Indicator + +Whenever changes are made in the application, they are saved automatically. The topbar's `Changes Saved` indicator shows the save status. + +
    + App Builder: Changes Saved Indicator +
    + +### Developer Details + +The Developer Details icon will show a profile picture of the currently active developer. Hovering over this picture reveals the developer's name. If no picture is set, initials are displayed. + +
    + App Builder: Developer Details +
    + +### App Environment + +You can use the Env dropdown menu to select an environment for your app: Development, Staging, or Production. This feature facilitates seamless transition through the app development cycle. + +:::tip +Learn more about multi-environment configuration **[here](/docs/development-lifecycle/environment/self-hosted/multi-environment)**. +::: + +
    + App Builder: App Env +
    + +### Version Manager + +You can manage application versions through the Version Manager. You can use this dropdown to edit a version name or adding/removing versions. + +:::tip +Versioning is also helpful when working with **[multiple environments](/docs/development-lifecycle/environment/self-hosted/multi-environment)** like development, staging and production. +::: + +
    + App Builder: Version Manager +
    + + +### Gitsync +The `Gitsync` icon next to the versions dropdown allows you to sync your application with your GitHub repository. + +Read more about Gitsync **[here](/docs/gitsync)**. +### Undo or Redo + +You can Undo or Redo any action performed on the canvas using the Undo and Redo buttons. + +You can also use **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** to perform such actions. + +
    + App Builder: Topbar +
    + +### Share + +The Share button allows you to share your applications with a unique URL generated automatically or edit the URL slug to personalize it. The share button will only be active when your application is released. + +:::tip +Learn more about **[Sharing](/docs/app-builder/share)** your ToolJet applications. +::: + +
    + App Builder: Share +
    + +### Preview + +The Preview button allows you to view the current app version in a new tab, facilitating immediate feedback on changes. + +
    + App Builder: Preview +
    + +### Release + +Use the Release button on the right to publish the current app version. The Release button, used to publish the current app version, becomes visible only in the Production environment, ensuring that only finalized versions are made public. + +:::caution +ToolJet will block editing of the Released version of an app and will display a prompt to create a new version to make the changes. This is to prevent accidentally pushing an unfinished app to the live version. +::: + +
    + App Builder: Topbar +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/accessing-values.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/accessing-values.md new file mode 100644 index 0000000000..eff7b12732 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/accessing-values.md @@ -0,0 +1,48 @@ +--- +id: accessing-values +title: Access and Reference Values +--- + +ToolJet's flexibility in integrating dynamic data within applications is facilitated through the ability to use custom code, and access and manipulate values derived from components, queries, globals. You can use double curly braces `{{}}` in the app-builder to access values or enter JavaScript code. + +## Accessing Values + +You can check all the accessible values using the left sidebar's **[Inspector](/docs/how-to/use-inspector/)** tab. This functionality can be handy to check data returned by queries and components on the canvas and reference it in queries or components. Inspector also displays other values like global values, variables, page variables, etc. + +![Check Available Values Using Inspector](/img/tooljet-concepts/writing-custom-code/inspector.png) + +### Example Scenarios + +**Query Data Access**: +- **Purpose**: Retrieve sales data from a query. +- **Implementation**: Use the expression `{{queries.getSalesData.data}}` to fetch data from the `getSalesData` query. + +**Component Data Access**: +- **Purpose**: Access data from a selected row in a table. +- **Implementation**: Use the expression `{{components.table1.selectedRow.id}}` to get the ID of the selected row in `table1`. + +**Accessing Globals** +- **Purpose**: Access global settings and variables predefined in the ToolJet environment. +- **Implementation**: To check the current theme and adjust styles dynamically, use: +`{{globals.theme.name}}` + +## More on the Left Sidebar + +The left sidebar in ToolJet is a hub for navigation and application configuration, featuring several options including Pages, Inspector, Debugger, and Global Settings. + +### Key Features + +- **Pages**: Manage multiple pages within a single application, enhancing organizational structure and user navigation. + +- **Inspector**: Inspect data linked to queries and components, essential for debugging and data manipulation. + +- **Debugger**: Track and display errors during query execution, providing insights into application issues. + +- **Global Settings**: Configure application-wide settings such as app slug, header visibility, and maintenance mode. + +## Practical Tips + +- Use the Inspector to ensure correct data bindings and troubleshoot data flow issues. +- Leverage the Debugger to maintain smooth operation and quick error resolution. +- Adjust Global Settings to tailor app behavior to specific user or organizational needs. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/create-queries.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/create-queries.md new file mode 100644 index 0000000000..9046c45d56 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/create-queries.md @@ -0,0 +1,140 @@ +--- +id: create-queries +title: Create Queries +--- + +The Query Panel at the bottom of the app-builder enables the creation and management of queries for interacting with connected data sources. This includes performing API requests, querying databases, and applying transformations or data manipulations using JavaScript and Python. + +The Query Panel consists of two sections: +- **Query Manager** on the left, which displays a list of all the created queries. +- **Query Editor** on the right, which is used to configure the selected query. + +Create a query + +
    + +## Creating a New Query + +- Click on the **+** button in the Query Panel to open a menu listing the available data sources or you can add a new data source by clicking on **+ Add new Data Source** button. +- Choose the desired data source to operate on. + +Data Source List + +### Configuring the Query + +- Depending on the data source you have selected, you can either choose GUI mode or SQL mode to configure your query. +- **For GUI mode**: You will have to choose the **Table name** and **Operations** you want to perform. + +Low Code Query Builder + +- **For SQL mode** Yow will have to enter the SQL query to perform your desired operation. + +SQL Query Builder + +- At the top of the Query Editor, you can click on the query name area to input a descriptive name, like *fetchUsers*. +- If your query requires parameters, add them using the **+ Add** button near the **Parameters** label. + +**Example**: For a PostgreSQL query named *fetchUsers* that is fetching data from the *allUsers* table, you might set a parameter to a single user by passing in the id parameter. + +```sql +SELECT * FROM allUsers WHERE id = {{parameters.id}} +``` + +Here, `{{parameters.id}}` is a parameter that you can define by clicking on the **+ Add** button on the Query Panel next to the **Parameters** label. + +
    + +
    + +## Query Examples + +Let's look at some examples with a PostgreSQL data source with a database table named *feature_requests*. + +### Reading Data +- Create a query named *getAllRequests* that selects all records from the *feature_requests* table. + +```sql +SELECT * FROM feature_requests; +``` + +Read Data + +- You can scroll down and see the returned data in the **Preview** section. +- Binding the returned data to components is a straightforward process. For instance, to add the returned data of the *getAllRequests* query to a Table, simply reference the query in the *Data* property of the Table component: + +```js +{{queries.getAllRequests.data}} +``` + +### Inserting Data +- Define a query *addNewRequest* to insert a new item into the *feature_requests* table. + +```sql +INSERT INTO feature_requests (id, title, description, votes, priority) +VALUES (10, 'Toggle Component', 'We need a toggle component in future release.', 0, 2); +``` + +Insert Data + +You can insert values from the components in queries. For instance, the above code can be updated to pick values from the components by using the double curly braces to pass the component values: + +```sql +INSERT INTO feature_requests (id, title, description, votes, priority) +VALUES (10, '{{components.textinput1.value}}', '{{components.textinput2.value}}', 0, 2); +``` + +You can apply the same principles to upcoming examples. + +### Updating Data + +To update existing data: + +**Example**: Set up a query *updateRequest* to modify details of an existing product based on the id of the selected product in the Table component. + +```sql +UPDATE feature_requests +SET + title = 'Updated Feature Title', + description = 'Updated Feature Description', + votes = 15, + priority = 2 +WHERE id = '{{components.table1.selectedRow.id}}'; +``` + +Update Data + +### Deleting Data +To delete data: + +**Example**: Craft a query *deleteRequest* that removes a product from the database based on a parameter. + +```sql +DELETE FROM feature_requests WHERE votes < {{parameters.minimumVotes}}; +``` + +Delete Data + +
    + +
    + +## Using Transformations and Events + +**Transformations**: After fetching data, you might want to format it (e.g., filtering out unnecessary fields or converting data types). ToolJet allows using JavaScript or Python for these transformations. + +**Event Handling**: Link queries with application events for dynamic interactions. For example, in the *updateRequest* query, you can set up an event to automatically run the *getAllRequests* query right after *updateRequest*. This ensures that the application retrieves and displays the updated data in the relevant components. + +
    + +
    + +## Advanced Settings and Debugging + +**Preview and Run**: Use the **Preview** button to test queries and view results in raw or JSON format before executing them within the app using the **Run** button. + +**Configuration Settings**: +- **Run this query on application load?**: Decide if the query should execute automatically when the app loads. +- **Request confirmation before running query?**: Set up confirmations for query operations to prevent accidental data changes. +- **Show notification on success?**: Configure notifications to inform users of successful operations. You can customize this property's notification message content and display duration. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/create-ui.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/create-ui.md new file mode 100644 index 0000000000..211df77ce8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/create-ui.md @@ -0,0 +1,161 @@ +--- +id: create-ui +title: Create User Interfaces +--- + +ToolJet offers a variety of pre-built components that streamline the development process and allow for rapid prototyping and deployment of internal tools. This guide is focused on building a basic UI for a Support Desk Dashboard application. + +## Creating the Header +- Drag and drop a **Text** component on the top left of the canvas. +- Click on the component to open its Properties Panel on the right and add **Support Desk Dashboard** under its `Data` property. + +
    + Add header text +
    + +You can see all the available properties of a component in the Properties Panel. You can manage the functionality and styling properties of the component in the Properties Panel. + +- Change its font size to 24, font weight to bold and color to blue(hex code - `#408FCC`). +- Add another Text component below it and enter `Track and manage all your tickets in one place` under its `Data` property. +- Change its font size to 14 and color to grey (hex code - `#9B9B9B`). + +
    + Add sub header text +
    + +## Support Tickets Counter +- Drag and drop **Statistics** component next to it. +- Under its `Primary value label`, enter `Created` and enter a number under `Primary value`. +- Change its Primary label color and Primary text color to blue(`#4A90E2`). +- Disable `Hide secondary value` +- Add 2 more Statistics components for Pending and Closed tickets. + +
    + Add statistics +
    + +## Tickets Table +- Add a **Table** component on the canvas. +- Navigate to its Properties Panel on the right and change its `Border Radius` to 10. +- Under its `Data` property, add the below dummy data: + +```js +{{ [{ + ticketId: "TCK1001", + customerName: "Jane Doe", + issueType: "Login Issue", + priority: "High", + status: "Open", + lastUpdated: "2024-04-12" + }, + { + ticketId: "TCK1002", + customerName: "John Smith", + issueType: "Payment Failure", + priority: "Medium", + status: "Pending", + lastUpdated: "2024-04-11" + }, + { + ticketId: "TCK1003", + customerName: "Alice Johnson", + issueType: "Feature Request", + priority: "Low", + status: "Closed", + lastUpdated: "2024-04-10" + }, { + ticketId: "TCK1004", + customerName: "Sarah Dunsworth", + issueType: "Feature Request", + priority: "High", + status: "Closed", + lastUpdated: "2024-04-10" + }, +] }} +``` + +- Add a **Text** component above it and enter **Tickets** under its `Data` property. +- Change its font size to 14 and color to grey (hex code - `#9B9B9B`). +- Under the `Columns` section, click on the columns and change their `Column name` properties to update the column name. For instance, change "ticketId" to "ticket ID", "customerName" to "customer name", etc. + + +
    + Add table component +
    + + + +## Adding a New Page +- Click on **Pages** on the left sidebar - there will be a *Home* page by default. Rename the home page to Dashboard. +- Click on the `+` icon to create a new page and rename the new page to Customers. + +
    + Add new page +
    + +- Click and drag to select all components on the *Dashboard* page, copy them (CMD+C for Mac and Cntrl+C for Windows) and paste (CMD+V for Mac and Cntrl+V on Windows) them in the Customers page. + + +- For the **Text** component for **Tickets**, change the `Data` property to **Customers**. +- Add the below data under the Table's `Data` property. +```js +{{[ + { + id: 1, + name: "John Doe", + email: "john.doe@example.com", + phone: "+1234567890", + status: "Active", + issuesResolved: 0 + }, + { + id: 2, + name: "John Smith", + email: "jane.smith@example.com", + phone: "+1234567891", + status: "Inactive", + issuesResolved: 0 + }, + { + id: 3, + name: "Alice Johnson", + email: "emily.johnson@example.com", + phone: "+1234567892", + status: "Active", + issuesResolved: 1 + }, + { + id: 4, + name: "Michael Brown", + email: "michael.brown@example.com", + phone: "+1234567893", + status: "Inactive", + issuesResolved: 4 + }, + { + id: 5, + name: "Sarah Dunsworth", + email: "michael.brown@example.com", + phone: "+1234567893", + status: "Active", + issuesResolved: 1 + } +]}} +``` +
    + Update new page +
    + +## Changing the Theme + +Click on the **Settings** button on the left sidebar. The `App mode` property will be set as `Auto` by default. Switch the `App mode` property to dark. Now when you preview the app, you can see that the app has a dark color scheme. + +
    + Dark mode +
    + + +When you keep the `App mode` as auto, it will follow the color scheme of the browser. + + +This guide has outlined the steps to create a Support Desk Dashboard UI using ToolJet's components. You now have a visually appealing interface that will help manage and track support tickets efficiently. Continue to explore ToolJet to learn about adding functionality to the UI. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/using-code.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/using-code.md new file mode 100644 index 0000000000..5b03b18adf --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/using-code.md @@ -0,0 +1,76 @@ +--- +id: using-code +title: Use Custom Code +--- + +In ToolJet, code serves as a powerful means to enhance and customize your applications. From complex logic implementations using **Run JavaScript code** or **Run Python code** queries to simple dynamic expressions with `fx`, the versatility is immense. Below is a basic demonstration of how you can leverage code within ToolJet. + +Let's take a look at different examples on how to use code. + +## Using fx to Dynamically Change Properties of a Component: +- Drag and drop a **Number Input** component and a **Button** component on the canvas. +- Click on the **Button** component, navigate to its Properties Panel on the right and click on the `fx` button next to the `Disable` condition. +- Enter the below code under the `Disable` condition: +```js +{{components.numberinput1.value ? false : true}} +//replace numberinput1 with the name of your check box component +``` +Now if there is no value entered in the Number Input component, the button will be disabled. + +You can apply the same principles to programmatically set a range of properties. + +#### Examples: +1. To change the color of the Button component based on a Text Input field, enter the below code under the color property of the Button component: +```js +{{components.textinput1.value == "available" ? '#375FCF' : '#FF0000'}} +//replace textinput1 with the name of your check box component +``` + +2. To change the visibility of an Image component based on a Checkbox component, enter the below code under the Visibility condition of the Image component: + +```js +{{components.checkbox1.value ? true : false}} +//replace checkbox1 with the name of your check box component +``` + +## Table Transformations to Change Cell Value +- Go to the Properties Panel of a Table component, under `Columns`, click on a column name. +- Under `Transformations`, the default value will be `{{cellValue}}`. Add JavaScript code to update the cell value dynamically. +- For instance, to round off a value, you can use the below code: +```js +{{cellValue > 4.5 ? 5 : 4}} +``` + +## Transforming Data Returned by a Query Using Run JavaScript code: +- Click on the **Add** button in the Query Panel and select **Run JavaScript code** +- Use the below code to execute a query, access its data and transform it: + +```js +await queries.restapi1.run(); +// replace restapi1 with your query name + +let value = queries.restapi1.getData(); +// replace restapi1 with your query name + +function filterProductsByBrandAndRating(value.products, brand, minRating) { + return products.filter(product => product.brand === brand && product.rating >= minRating);} + return filterProductsByBrandAndRating(value.products, "Apple", 4.5) +//use JavaScript code to refine the data +``` + +## Use Moment.js to Add Current Date to the Datepicker Component +- Select the Datepicker component and go to its Properties Panel. Under `Default value`, enter the below code: +```js +{{moment().format('DD/MM/YYYY');}} +``` +The above code will add today's date as the default in DD/MM/YYYY format. + +## Show Data Based on the Logged-in User. + +- Click on the **Inspector** in the left side-bar and expand the `Globals` accordion to check all the values available under global. These properties can be used to make your app more dynamic. +- For instance, if there is a Button component used to update IT Ticket Requests, you can click on **fx** next to the component's `Visibility` property and enter the below code to make the button visible only when admins access it: +```js +{{globals.currentUser.groups.includes("admin") ? true : false }} +``` + +The examples provided are just a starting point for leveraging ToolJet's custom code capabilities. You have the flexibility to fully tailor your applications using our comprehensive custom coding features. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/variables.md b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/variables.md new file mode 100644 index 0000000000..cd9a5b1ec3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/app-builder/walkthrough/variables.md @@ -0,0 +1,59 @@ +--- +id: variables +title: Create and Manage Variables +--- + +During application development, managing state and user interactions effectively are crucial for creating a seamless user experience. This involves keeping track of various data points, filtering data based on the user, tracking user preferences, navigation history, and more. In this context, variables and page variables allow developers to store and manage variables within an application dynamically. + +## Setting Variables and Page Variables + +Setting variables and page variables can be done in two ways - through events or by using **Run JavaScript code** queries. +- To set variables through events, add a new event handler and select `Set variable` as the action. Under `Action Options` you can define the Key and Value of the variable. Similarly, for page variables you can use the `Set page variable` action. + +
    + Set a variable +
    + + +- To set variable through `Run JavaScript code` query, use the `setVariable(key, value)` function. Use `setPageVariable(key, value)` function for page variables. + +
    + Set a variable through JS +
    + +## Example Use-Case for Page Variable: +**Tracking the number of times a user visits a page:** +- Create a `Run JavaScript code` query and enter the below code and name it *countVisits*: + +```js +function incrementPageVisit() { + if (!page.variables.visitCount) { + actions.setPageVariable('visitCount', 1); + } else { + actions.setPageVariable('visitCount', Number(page.variables.visitCount) + 1); + } +} + +incrementPageVisit(); +``` + +- Add a new page to your application named `Product Listing`. +- Add an `Event Handler` on the newly created page, select `On page load` as the Event and `Run Query` as the Action. Under `Query`, select the *countVisits* query that we created in the previous step. +- Now, every time a user lands on the `Product Listing` page, the *CountVisits* query will run and the `visitCount` data will be updated. + +## Example Use-Case for Variables: +**Preventing the appearance of loading state when the query data is loading:** + +You can prevent the appearance of any kind of loading state by filling the Table component with data using a variable. You can update this variable when the data update query runs successfully. + +Below are the steps to achieve this when you are updating the data and don't want the Table component to display a loader. + +- Create two queries - *getData* and *updateData* + +- Add a `Query Success` event to the *getData* query and select the **setVariable** action to save the returned data in a variable (you will have to define the key and value for this, value will be the returned data i.e. queries.getData.data). Name the variable *loadedData*. + +- Enter `{{variables.loadedData}}` under the Table component's `Data` property. + +- In the *updateData* query, add two `Query Success` events. The first event should run the *getData* query and the second event should update the variable that you had created in the first step with the data returned by the *getData* query. + +Now, the Table will continue to display the data stored in *loadedData*. This prevents any loading indicators from appearing on the Table component when the data is being fetched or updated. diff --git a/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/ai-docs-assitant.md b/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/ai-docs-assitant.md new file mode 100644 index 0000000000..61e592c1f6 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/ai-docs-assitant.md @@ -0,0 +1,56 @@ +--- +id: ai-docs-assistant +title: AI Docs Assistant +--- + +The **AI Docs Assistant** is an intelligent assistant designed to help you navigate ToolJet’s documentation with ease. Whether you need quick answers, step-by-step guides, or concept explanations, this assistant provides instant support by summarizing docs, troubleshooting issues, and guiding you through best practices. + +You can access the AI Docs Assistant under the **Learn** tab in the Build with AI sidebar. Simply ask a question or describe what you're looking for, and the assistant will provide relevant documentation and insights. + +
    + +tooljet ai doc assistant + +
    + +### What You Can Do with the AI Docs Assistant +- Get guidance on setting up workspaces, managing users, and configuring roles. +- Quickly understand complex topics with clear, actionable steps +- Find answers to common questions and resolve issues efficiently. +- Explore how to connect databases, APIs, and external tools. +- Discover best practices for securing your applications. +- Get up to speed with key functionalities and platform best practices. + +### Examples + +1. Custom Schema in [Form](/docs/widgets/form/) component: + + **Prompt**: Can you create a custom schema for a Form component with two input fields for name and phone number, and a dropdown for gender? + +
    + +tooljet ai doc assistant + +
    + + + 2. Dynamic columns in [Table](/docs/widgets/table/table-properties/) component: + + **Prompt**: Can you explain dynamic columns in the Table component? + +
    + +tooljet ai doc assistant + +
    + + + 3. Plotly JSON in [Chart](/docs/widgets/chart/) component: + + **Prompt**: Can you help me with the structure of the Plotly JSON that I can pass into Chart components? + +
    + +tooljet ai doc assistant + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/generate-applications.md b/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/generate-applications.md new file mode 100644 index 0000000000..c5da34b336 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/generate-applications.md @@ -0,0 +1,55 @@ +--- +id: generate-applications +title: Generate Applications +--- + +This guide explains how to quickly generate and modify business applications using ToolJet. You can create an app from scratch with a single prompt or enhance an existing app with AI-powered assistance. + +## Creating Application +To create an application, follow these steps: + +1. **Enter a prompt** – Describe the business application you want to build in the prompt input on the dashboard. +
    + +tooljet generate apps + +
    + +2. **Accept or modify requriements** – After submitting your prompt, the app will be created, and you’ll be taken to the App Builder, where a list of features, a database schema, design details, and query specifications will be generated based on your prompt. +
    + +tooljet generate apps + +
    + +You can accept or modify these application requirements after reviewing them thoroughly. +
    + +tooljet generate apps + +
    + +3. **App Generation** – Once you confirm the requirements, ToolJet will build the application inside the App Builder. + +
    + +tooljet generate apps + +
    + +## Modifying Application + +You can modify any application in ToolJet with AI assitance, whether it's a newly created app or an existing one. You can update components and queries within your application with just a prompt. + +For example, if you want add a button in your app you can write a prompt for the same. +
    + +tooljet generate apps + +
    +## Limitations +ToolJet supports generating queries with AI for the following data sources: +- [Postgres](/docs/data-sources/postgresql/) +- [MySQL](/docs/data-sources/mysql/) +- [SQL Server](/docs/data-sources/mssql/) +- [RunJS Queries](/docs/tooljet-concepts/run-js/) \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/overview.md b/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/overview.md new file mode 100644 index 0000000000..6eb7f984a1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/build-with-ai/overview.md @@ -0,0 +1,40 @@ +--- +id: overview +title: Overview +--- +With ToolJet, you can build business applications effortlessly using natural language. Whether you're starting from scratch or refining an existing app, it simplifies the process with it's intelligence. + +Additionally, it comes with an AI-powered [documentation assistant](/docs/build-with-ai/ai-docs-assistant), ready to answer any questions about ToolJet's features, components, and integrations, helping you build faster. + +Follow these step-by-step instructions to create an inventory management application: +1. **Describe your application** – Provide a prompt detailing the business application you want to create. (Example: "Inventory management system for a manufacturing company.") +
    + +tooljet ai overview + +
    +2. **Refine the requirements** – Review and accept or modify the application requirements suggested. +
    + +tooljet ai overview + +
    +3. **Customize your application** – Use AI to customize the generated application to your specific needs, adjusting components and its styles, and also data source queries. + +- **Generated Application** +
    + +tooljet ai overview + +
    + +- **Customizing Application** + +
    + +tooljet ai overview + +
    + + +Refer to [Generate Applications](/docs/build-with-ai/generate-applications) and [AI Docs Assistant](/docs/build-with-ai/ai-docs-assistant) documentation to learn more. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/_category_.json new file mode 100644 index 0000000000..317067020d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Contributing Guide", + "position": 11, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/code-of-conduct.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/code-of-conduct.md new file mode 100644 index 0000000000..03f7184d51 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/code-of-conduct.md @@ -0,0 +1,81 @@ +--- +id: code-of-conduct +title: Contributor Code of Conduct +--- + +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to make participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, sex characteristics, gender identity and expression, +level of experience, education, socio-economic status, nationality, personal +appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +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 + +Examples of unacceptable behavior by participants include: + +* 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 + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies within all project spaces, and it also applies when +an individual is representing the project or its community in public spaces. +Examples of representing a project or community include using an official +project e-mail address, posting via an official social media account, or acting +as an appointed representative at an online or offline event. Representation of +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 +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. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html + +[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 diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/introduction.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/introduction.md new file mode 100644 index 0000000000..e574a4f7b8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/introduction.md @@ -0,0 +1,40 @@ +--- +id: introduction +title: Introduction +--- + +Welcome to the ToolJet Documentation guide! We're thrilled to have you here and can't wait to see the contributions you'll make to our docs. Your insights and improvements will help thousands of users get the most out of ToolJet 🚀. + +In the following sections, you'll find everything you need to get started with contributing to our documentation. + +## What Makes Good Documentation? + +Good documentation is all about clarity, simplicity, and effectiveness. It should guide users through the usage and workings of ToolJet with precision, making it as easy as possible for them to build and deploy internal tools. + +Documentation is a cornerstone of our product. It's one of the most visited sections of our website, second only to our homepage. Without well-crafted, thorough documentation, users can't fully utilize the power of ToolJet, and their experience may suffer as a result. + +### The Golden Rule + +If a ToolJet feature lacks comprehensive documentation, it isn't considered complete. Quality documentation is essential for the success of our product and the satisfaction of our users. It’s often through documentation that users discover new features or decide to upgrade their tools. + +As a contributor, you can create detailed, user-centric content that thoroughly covers the features you're documenting in an engaging and accurate way. + +## Types of Documentation + +We aim to create rich, informative content across three key areas of documentation: + +1. **ToolJet Concepts**: Basic explanations of specific topics, offering general insights into how ToolJet features work. +2. **How-to Guides**: Step-by-step instructions that help users accomplish specific tasks within ToolJet. +3. **Reference**: Concise, lookup-style documentation that covers all possible usages, definitions, and edge cases for ToolJet features. + +As you document features, consider which of these categories your content fits best. Sometimes a feature might require multiple types of documentation to be fully covered. + +### Measuring Impact and Gathering Feedback + +The quality of our documentation isn't just determined by how well it's written—it's also measured by how well it serves our users. We regularly use analytics and feedback tools to assess the impact of our documentation and make data-driven improvements. + +## Next Steps... + +Once you've set up your local environment, take some time to explore our [Style Guide](/docs/contributing-guide/documentation-guidelines/style-guide), understand our page structures, and learn how to work with Docusaurus, the framework we use for our documentation. + +We look forward to your contributions and are excited to see how you'll help make ToolJet documentation even better! diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/pr-checklist.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/pr-checklist.md new file mode 100644 index 0000000000..1d3fe3a7cb --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/pr-checklist.md @@ -0,0 +1,15 @@ +--- +id: pr-checklist +title: Pull Request Review Checklist +--- + +Use this quick checklist to catch common issues and maintain consistency across your project. + +- Review spelling and grammar using tools like ChatGPT or Grammarly. +- Ensure no compilation issues arise due to formatting. +- Verify that all h2 and h3 headings follow title case. +- Confirm that every section starting with h2 has a 24px padding-top. +- Test for broken links, missing images, and any incorrect code. +- Ensure new internal links use root-relative file paths. +- Identify opportunities for relevant cross-linking. +- Ensure that the changes are implemented in all the required versions. diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/style-guide.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/style-guide.md new file mode 100644 index 0000000000..cc9438e21c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/documentation-guidelines/style-guide.md @@ -0,0 +1,236 @@ +--- +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. + +## 1. Text Formatting Guidelines + +Different elements in your projects should be formatted consistently for clarity. Here are some recommendations: + +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. + +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. + + +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. +- 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); +}; +``` + +**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"). + +--- + +## 2. Headings + +Proper use of headers is crucial for organizing content and improving readability. Use the following guidelines to determine which header level to apply: + +- **Title Casing**: Apply title casing for all headers to maintain consistency. +- **Main Header**: Use a single hash (`#`) for the main topic of the document or section. This should be used once per document for the main header. +- **Secondary Header**: Use double hashes (`##`) for subtopics or main sections within a major section. This level of header should organize content under the main header. +- **Tertiary Header**: Use triple hashes (`###`) for more detailed points or subsections under a secondary header. This header is useful for going deeper into specifics within a section. +- **Quaternary Header**: Use four hashes (`####`) for even more granular details within a tertiary section. This header is rarely needed but can be useful in complex documentation. +- **Spacing**: Ensure there’s a blank line before and after each header to maintain readability and to separate the sections clearly. +- **Header Frequency**: Avoid using more than three levels of headers to prevent overcomplication. If additional granularity is needed, consider breaking the content into separate sections or documents. + +--- + +## 3. Markdown Tables + +To efficiently present extensive and repetitive information about features, such as the properties of a component, use markdown tables. This format helps organize and display the data clearly and concisely. + +Ensure all tables are left-aligned for consistency. This aids in readability and ensures that the content is easy to scan. + +**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`. | + +- 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. + +--- + +## 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. + +- **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**: +:::warning +Ensure you back up your data before upgrading to the latest version. +::: + +- **Tip Admonitions**: Use `info` type admonitions to offer useful hints or best practices. These are generally positive and provide additional value to the user. + +**Example**: +:::info +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. + +--- + +## 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. +- 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 `SVG` for logos or icons to ensure scalability without loss of quality. + +--- + +## 6. Tone and Clarity + +Maintaining a clear and consistent tone throughout your documentation is crucial for effective communication. The goal is to be concise, informative, and user-friendly. + +- Keep language straightforward and concise. Avoid jargon unless it's essential for the audience and provide explanations where necessary. +- 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. +- 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. +- Use nested bullet points for items that require further explanation or hierarchy within a list. + +--- + +## 9. Specific Language Guidelines + +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**: +``` +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' \ +-H 'Authorization: Bearer ' \ +-d '{"key": "value"}' +``` + +### 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'; +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!'; +``` + +### 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" +} +``` + +- Avoid comments in JSON code, as JSON does not natively support comments. If explanations are needed, provide them outside the JSON block in the documentation. + +### 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**: +```bash +# This command installs Node.js +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 +WHERE age > 30 +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.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. +- 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." +- 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." +- 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 diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/l10n.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/l10n.md new file mode 100644 index 0000000000..196a10aba2 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/l10n.md @@ -0,0 +1,69 @@ +--- +id: l10n +title: Localization +--- + +Welcome to ToolJet Localization Guide. The goal of the Localization is to make ToolJet easy to use and close to all countries, languages, and general cultural groups. On this page, you will find instructions on how to contribute to ToolJet through Localization and make a more friendly ToolJet for all regions. + +## Adding Translations + +- For adding the translations of your language in ToolJet, you'll need to create a new **languagecode.json** file which will include all the translations for the keywords in your language, and then list the language in the **languages.json** file for the language to be listed in the dashboard of the ToolJet. + +- Go to the **frontend** directory which is at the root of ToolJet, then go to the **assets** and inside assets, you'll find the **translations** directory. You have created a new json file with the **language code** as the file name. The language code should follow [ISO 639-1 Code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). + + ``` + \frontend + |--\assets + |--\--\translations + |--\--\--\languages.json + |--\--\--\en.json + ``` + +
    + + files + +
    + +- Let's localize ToolJet in the **French** language. Create a new json file inside the translations directory and name it **fr.json**. `fr` is the language code for French. + +- After creating the new file, open the **en.json** file and copy all the contents of the file to the newly created **fr.json**. + +
    + + files + +
    + +- Once copied, you can now start adding the translations for the keywords in the french language. + +- After completing the translation, all you need to do is list the language in **languages.json** file. You'll need to add an object with three key-value pairs. **lang** - the name of the language that you added, **code** - the language code, and the **nativeLang** - name of language in the native. + + ```js + { + "languageList": + [ + { "lang": "English", "code": "en", "nativeLang": "English" }, + { "lang": "French", "code": "fr", "nativeLang": "Français" } + ] + } + ``` + + + +:::note +Feel free to reach us on [Slack](https://tooljet.com/slack) for any help related to Localization. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/marketplace/creating-a-plugin.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/marketplace/creating-a-plugin.md new file mode 100644 index 0000000000..a7a9cdf67b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/marketplace/creating-a-plugin.md @@ -0,0 +1,424 @@ +--- +id: creating-a-plugin +title: 'Marketplace: Creating plugins' +--- + +## What are plugins + +ToolJet’s development has centered on extensibility, allowing developers to utilize plugins that expand their capabilities. Currently, these plugins are limited to connectors, including data source connectors like PostgreSQL, MySQL, Twilio, Stripe, and more. Using JavaScript/TypeScript, developers can develop plugins to enhance ToolJet's functionality and publish these plugins on the ToolJet Marketplace. + +This guide will provide step-by-step instructions for creating ToolJet plugins using the `tooljet` CLI. + +The `tooljet` CLI is a user-friendly command-line tool designed to simplify the plugin building process. As part of this guide, we will create a basic plugin for GitHub. + +## Step 1: Creating a New Plugin - GitHub Plugin + +The first step is to bootstrap a new plugin for the ToolJet marketplace. The plugin will authenticate users with a GitHub Personal Access Token and include fundamental operations such as fetching user details, repositories, issues, and pull requests. + +If you have completed the **[Setup](/docs/contributing-guide/marketplace/marketplace-setup)** guide, you can begin developing the plugin using the `tooljet` CLI. To initiate plugin development, enter the following command in the terminal: +```bash +# create a new plugin +tooljet plugin create github +``` + +When prompted, enter the **plugin name** and select the **plugin type**, which is api in this case. Additionally, select **yes** when prompted to create a new plugin for the marketplace. + +If your plugin is hosted on GitHub, please provide the **repository URL** when prompted. Otherwise, leave it blank. + +When a plugin is created using the `ToolJet` CLI, an object is added to the **plugins.json** file in the **`ToolJet/server/src/assets/marketplace/`** directory. This object includes metadata about the plugin, such as its name, description, version, author, and other relevant details. + +The plugins.json file serves as a registry of all available plugins for use in ToolJet. When the ToolJet server starts up, it reads the plugins.json file and loads all plugins that are listed in it. + +:::info +It is important to note that the plugins.json file should not be manually edited, as it is automatically generated by the `ToolJet CLI`. Making changes to this file can result in issues with the proper functioning of the plugins in the system. +::: + +All marketplace plugins are stored in the **`/marketplace`** directory of the ToolJet repository. You can find the GitHub plugin **[here](https://github.com/ToolJet/ToolJet/tree/develop/marketplace/plugins/github)**. + +The structure of a typical ToolJet plugin directory appears as follows: +```bash +github/ + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json +``` + +In this structure, the file **manifest.json** contains information about the plugin's name, description, and other details. The file **operations.json** contains metadata about all the operations that the plugin supports. The main file, **index.ts**, creates a QueryService for the plugin, which handles queries, connection testing, caching, and more. The **icon.svg** file serves as the plugin's icon, while **package.json** is automatically generated by the CLI. + +:::info +**Why do we need a manifest.json file or a operations.json file?** + +The manifest.json file is used by a React component to create a dynamic UI for connection forms. It defines the schema of an API or data source, including its name, type, and any exposed variables, as well as options for authentication and other customizable properties. The properties section specifies the required fields and their types for connecting to the API or data source. By reading the manifest.json file, the React component generates the necessary UI components based on the schema, such as text inputs, dropdowns, checkboxes, and other elements. + +On the other hand, the operations.json file contains a schema definition for a specific data source, like Github. It describes the available operations and their parameters that can be used to query the data source. A React component uses this schema to create queries in ToolJet applications, generating a UI that allows users to select the desired operation and provide the required parameters. The component uses the properties defined in the operations.json file to create various UI elements, such as dropdowns and input fields, and handle user interactions to create the final query. Once the user fills in the required parameters, the component uses them to generate a query that can be executed against the data source and return the results to the user. + +Overall, *manifest.json* and *operations.json* files are essential for creating dynamic UI components in ToolJet applications. They define the schema for data sources and available operations, which React components then use to generate user-friendly UI elements. By utilizing these files, ToolJet enables users to easily connect to various APIs and data sources, perform queries, and retrieve data in an intuitive and efficient manner. +::: + +## Step 2: Defining the manifest.json file + +To construct the connection form, it's important to include the necessary options in the manifest.json file. Here's an example of how to do it: +```json + "properties": { + "credentials": { + "label": "Authentication", + "key": "auth_type", + "type": "dropdown-component-flip", + "description": "A single select dropdown to choose credentials", + "list": [ + { + "value": "personal_access_token", + "name": "Use Personal Access Token" + } + ] + }, + "personal_access_token": { + "token": { + "label": "Token", + "key": "personal_token", + "type": "password", + "description": "Enter your personal access token", + "hint": "You can generate a personal access token from your Github account settings." + } + } + } +``` +This manifest.json file includes information about authentication options, specifically a dropdown to choose a type of credentials and a field to enter a personal access token. The label, key, type, description, and hint properties are used to define the specific fields and their types required for connecting to the API or data source. + +In this particular code, there are two main properties defined: **`credentials`** and **`personal_access_token`**. + +The **`credentials`** property specifies the authentication method to be used. It contains several keys: +- **`label`**: a user-friendly label for the authentication method, set to "Authentication" +- **`key`**: a unique identifier for the authentication method, set to "auth_type" +- **`type`**: the type of the authentication method, set to "dropdown-component-flip" +- **`description`**: a description of the authentication method, set to "A single select dropdown to choose credentials" +- **`list`**: an array of objects representing the different authentication methods available. In this case, there is only one method available: a personal access token. The `value` key in the object is set to "personal_access_token" and the `name` key is set to "Use Personal Access Token". + +The **`personal_access_token`** property specifies the details of the personal access token authentication method. It contains a `token` key, which specifies the actual personal access token to be used. The `token` key contains several keys: +- **`label`**: a user-friendly label for the personal access token, set to "Token" +- **`key`**: a unique identifier for the personal access token, set to "personal_token" +- **`type`**: the type of the personal access token, set to "password" +- **`description`**: a description of the personal access token, set to "Enter your personal access token" +- **`hint`**: a hint for the personal access token, set to "You can generate a personal access token from your Github account settings." + +The available `type` options are: + +However, based on the code you provided, the available **`type`** options are: +- **`password`**: used to input a secret value, such as a password or an access token. +- **`dropdown-component-flip`**: used to create a dropdown menu that flips its position relative to the component that triggers it. +- **`text`**: used to input a single line of text. +- **`textarea`**: used to input multiple lines of text. +- **`toggle`**: used to create a simple on/off switch. +- **`react-component-headers`**: used to display headers for React components. +- **`codehinter`**: is a specialized input field used for entering code and has additional functionality, such as resolving JavaScript code within double curly braces`{{}}`. + +:::tip +The **manifest.json** file is utilized by the connection modal component, which appears to prompt users to enter their datasource credentials. Meanwhile, the **operations.json** file is used by the query manager when users generate a specific query for a connected datasource. **Both files utilize a similar schema**. +::: + +## Step 3: Defining the operations.json file +```json + "properties": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { + "value": "get_user_info", + "name": "Get user info" + }, + { + "value": "get_repo", + "name": "Get repository" + }, + { + "value": "get_repo_issues", + "name": "Get repository issues" + }, + { + "value": "get_repo_pull_requests", + "name": "Get repository pull requests" + } + ] + }, + "get_user_info": { + "username": { + "label": "Username", + "key": "username", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter username", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "Enter username" + } + }, + "get_repo": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + } + }, + "get_repo_issues": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "className": "codehinter-plugins col-4", + "type": "dropdown", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + }, + "get_repo_pull_requests": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "type": "dropdown", + "className": "codehinter-plugins col-4", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + } + } +``` +The operations.json file specifies the available operations that can be executed on the data source. It provides details about the operation type, required fields to execute the operation, and the data type of each field. The label, key, type, description, and hint properties are used to define the specific fields and their types required to establish a connection with the API or data source. + +## Step 4: Add the npm package of GitHub to the plugin dependencies + +- Change directory to the plugin directory where the npm package needs to be installed and then install the package + ```bash + # change directory to the plugin directory and install the npm package + npm i octokit --workspace=@tooljet-marketplace/github + ``` + + :::info + Steps to install npm package to a plugin + + ```bash + npm i --workspace= + ``` + + The command `npm i --workspace=` is used to install a specific npm package into a particular workspace of a multi-package repository. + + The *--workspace* flag is used to specify the workspace where the package should be installed. In this case, we are installing the package in the *@tooljet-marketplace/github* workspace. + ::: + +## Step 5: Implement the query execution logic in index.ts + +In index.ts, the query execution logic needs to be implemented for the Github plugin's QueryService. The QueryService is responsible for handling the process of running queries and receives information about the data source, including credentials, configurations, and query parameters. + +For the Github data source, the sourceOptions will contain the necessary authentication credentials, like the personal access token, while the queryOptions will include the configurations and parameters specific to the query, like obtaining a list of repositories for a particular user. + +Using this information, the QueryService will create and execute API requests against the Github API. The resulting data will be returned to the caller for further processing as needed. + +Create a new file **query_operations.ts** in the **plugins/github/src** directory and add the following code to it. +```typescript +import { Octokit } from 'octokit' +import { QueryOptions } from './types' + + +export async function getUserInfo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /users/{username}', + { + username: options.username + } + ); + return data; +} + +export async function getRepo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}', + { + owner: options.owner, + repo: options.repo + } + ); + return data; +} + +export async function getRepoIssues(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/issues', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + + } + ); + return data; +} + +export async function getRepoPullRequests(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/pulls', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + } + ); + return data; +} + +``` + + +The query_operations.ts file comprises functions that will execute the queries and will be called by the QueryService in index.ts. + +The GitHub class has three methods: + +- **run**: This method executes a query and is invoked by passing sourceOptions and queryOptions as input, representing the source metadata and query configuration, respectively. The run method utilizes the octokit library to send API requests to the GitHub API and returns the query result in a QueryResult object. + +- **testConnection**: When adding a new data source to a ToolJet application, the connection can be tested. The testConnection method is used to test the connection, and it takes in sourceOptions as input, which represents the source metadata. The method tests the connection by trying to fetch the authenticated user and returns a ConnectionTestResult object indicating whether the connection was successful. + + :::note + Not all data sources may support testing connections. If it's not applicable for your data source, you can disable the test connection feature by adding "customTesting": true to your plugin's manifest.json. + ::: + +- **getConnection**: This method is a helper function that returns an authenticated octokit client, which is utilized to send requests to the GitHub API. It takes in sourceOptions as input, representing the source metadata, and returns an authenticated octokit client. + +## Step 6: Add Error Handling + +In case of an error, it is necessary to return the error message received from the Plugin SDK. To achieve this, include the `errorDetails` in the **run** method within the **index.ts** file. The specific parameters of the error may vary depending on the plugin.

    +Additionally, the **data** field in the Plugin SDK corresponds to **errorDetails** in the code, and the dynamically generated **errorMessage** maps to the **description** field in the error preview. + +#### Example + +Consider the case of MongoDB. If an error occurs, such as the following: + +MongoDB Error + +You can implement error handling using the following code: + +```js +catch (error) { + let errorMessage = 'An unknown error occurred'; + let errorDetails = {}; + + if (error instanceof Error) { + errorMessage = error.message || errorMessage; + errorDetails = { + name: error.name, + code: (error as any).code || null, + codeName: (error as any).codeName || null, + keyPattern: (error as any).keyPattern || null, + keyValue: (error as any).keyValue || null, + }; + } + + throw new QueryError('Query could not be completed', errorMessage, errorDetails); +} +``` + +This code ensures that error messages and details are properly returned to the Plugin SDK, enabling meaningful error previews for the user. + +Query Error + +## Delete a plugin +To delete a plugin, enter the following command: + +```bash +tooljet plugin delete PLUGIN_NAME +``` + +The CLI will prompt users to verify if the plugin to be deleted is a marketplace plugin before proceeding with the deletion. + +## Publish a plugin +To release a plugin, submit a pull request on ToolJet's GitHub Repository after creating it. The ToolJet team will review the pull request, and if approved, the plugin will be included and published in the next release. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/marketplace/marketplace-setup.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/marketplace/marketplace-setup.md new file mode 100644 index 0000000000..05162870b3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/marketplace/marketplace-setup.md @@ -0,0 +1,80 @@ +--- +id: marketplace-setup +title: 'Marketplace: Development Setup' +--- + +The Marketplace offers custom plugins that can be installed in your ToolJet instance. This guide aims to assist you in creating a new plugin for the ToolJet marketplace. + +## Requirements +- [Node.js](https://nodejs.org/en/download/) **(v18.18.2)** +- [npm](https://www.npmjs.com/get-npm) **(v9.8.1)** + +## Getting Started + +### Step 1. Setup ToolJet Locally + +To obtain the ToolJet repository via git, use the command: + +```bash +git clone https://github.com/ToolJet/ToolJet.git +``` + +Next, refer to the appropriate guide for your development environment to follow the Setup instructions: + +- **[MacOS](/docs/contributing-guide/setup/macos)** +- **[Docker](/docs/contributing-guide/setup/docker)** +- **[Ubuntu](/docs/contributing-guide/setup/ubuntu)** + +### Step 2. Enabling the Marketplace for your Instance + +To enable the marketplace for your ToolJet instance, you need to specify the following environment variables in your **`.env`** file: + +#### Marketplace Feature Enable + +Use this environment variable to enable/disable the feature that allows users to use the marketplace. + +| variable | value | +| -------------------------- | ----------------- | +| ENABLE_MARKETPLACE_FEATURE | `true` or `false` | + +#### Enable Marketplace Plugin Developement Mode + +The use of this environment variable facilitates plugin development by enabling automatic builds whenever package changes occur, thus simplifying the development process. Moreover, it also incorporates a reload button that retrieves all the recent local modifications from the file system for installed plugins, making it a valuable feature for improving the overall development experience. + +| variable | value | +| -------------------------- | ----------------- | +| ENABLE_MARKETPLACE_DEV_MODE | `true` or `false` | + + +Please note that the marketplace is not enabled by default. After updating the variable, restart your ToolJet instance. + +For information on running ToolJet on your local machine, please refer to the instructions provided **[here](/docs/contributing-guide/setup/architecture)**. You can access the marketplace by navigating to the **'/integrations'** route. + +### Step 3: Install the Required Packages + +The required packages must be installed from the marketplace root folder. Use the following commands to install the packages: + +``` bash +cd marketplace +npm install +``` + +After the packages are installed, run the following command to build the directory: + +``` bash +npm run build +``` + +### Step 4: Installation of tooljet-cli + +In order to manage plugins for the ToolJet marketplace, including creating, updating, and deleting, you will need to utilize **[tooljet-cli](https://www.npmjs.com/package/@tooljet/cli)**. This can be installed via npm by entering the following command: +```bash +npm install -g @tooljet/cli + +# Ensure the installation was successful +tooljet --version +``` + +Having completed the environment setup for Marketplace Developer mode, we can proceed to the next section and commence with [developing the first plugin](/docs/contributing-guide/marketplace/creating-a-plugin). + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/_category_.json new file mode 100644 index 0000000000..90bb09deae --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Setup", + "position": 1, + "collapsed": true +} diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/architecture.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/architecture.md new file mode 100644 index 0000000000..3ebaba4289 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/architecture.md @@ -0,0 +1,25 @@ +--- +id: architecture +title: Architecture +--- +# Introduction + +ToolJet has two main components: **ToolJet Server** and **ToolJet Client**. + +### 1. ToolJet Server + +ToolJet server is a Node.js API application. Server is responsible for authentication, authorization, persisting application definitions, running queries, storing data source credentials securely and more. + +**Dependencies:** +- **PostgreSQL** - ToolJet server persists data to a postgres database. +- **Email service** (SMTP/Sendgrid/Mailgun/etc) - Required to send user invitations and password reset emails. +- **PostgREST** - Standalone web server that converts PostgreSQL database into queryable RESTful APIs for ToolJet Database. + +### 2. ToolJet Client + +ToolJet client is a ReactJS application. Client is responsible for visually editing the applications, building & editing queries, rendering applications, executing events and their trigger, etc. + +## Requirements + +1. **Node version 18.18.2** +2. **npm version 9.8.1** 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 new file mode 100644 index 0000000000..c64aacb24a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/codespaces.md @@ -0,0 +1,117 @@ +--- +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. + +Open the terminal and run the commands below. + +## Setting up + +### 1. Set up the environment + +1. Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1) + +``` +nvm install 18.18.2 +nvm use 18.18.2 +npm install -g npm@9.8.1 +``` + +2. Install Postgres + +``` +sudo sh -c 'echo "deb [http://apt.postgresql.org/pub/repos/apt](http://apt.postgresql.org/pub/repos/apt) $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' + +wget --quiet -O - [https://www.postgresql.org/media/keys/ACCC4CF8.asc](https://www.postgresql.org/media/keys/ACCC4CF8.asc) | sudo apt-key add - + +sudo apt-get update + +sudo apt-get install postgresql-13 postgresql-contrib-13 +``` + +To start the postgresql service run the below command: + +``` +sudo service postgresql start +``` + +If you wish to change the password of the installed postresql service run the below commands: + +``` +sudo su + +sudo -u postgres psql + +\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) + +**For basic set-up you add the below env variables:** + +``` +TOOLJET_HOST=http://localhost:3000 + +LOCKBOX_MASTER_KEY= + +SECRET_KEY_BASE= + +PG_USER=postgres + +PG_HOST=localhost + +PG_PASS=postgres + +PG_DB=tooljet_prod + +SUB_PATH=/apps/tooljet/ + +NODE_ENV=production + +SERVE_CLIENT=true +``` + +> `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) +> +> `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 + +Make sure node version is set to 18.18.2 before running the below command: + +``` +npm install +npm install --prefix server +npm install --prefix frontend +npm run build:plugins +``` + + +### 4. Set up database + +``` +npm run --prefix server db:create +npm run --prefix server db:migrate +``` + +If at any point you need to reset the database, use this command `npm run --prefix server db:reset` + +### 5. Build client + +``` +cd ./frontend && NODE=production npm run build +``` + +### 6. Run server + +``` +cd ./server && npm run start:prod +``` + +The client will start on the **port 3000**, you can access the client by visiting the url created by codespace - `https:///apps/tooljet` diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/docker.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/docker.md new file mode 100644 index 0000000000..96dcdcfc12 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/docker.md @@ -0,0 +1,189 @@ +--- +id: docker +title: Docker +--- + +:::warning +The following guide is intended for contributors to set up ToolJet locally. If you're interested in **self-hosting** ToolJet, please refer to the **[Setup](/docs/setup/)** section. +::: + +Docker Compose is the easiest way to set up the ToolJet server and client locally. + +*If you just want to try out ToolJet locally with docker, you can follow the steps [here](/docs/setup/try-tooljet).* + +## Prerequisites + +Make sure you have the latest version of `docker` and `docker compose` installed. + +**[Official docker installation guide](https://docs.docker.com/desktop/)** + +**[Official docker-compose installation guide](https://docs.docker.com/compose/install/)** + +## Setting up + +:::warning +If you are setting up on a Windows machine, we advise you to set up Docker Desktop with WSL2. More information is available [here](https://docs.docker.com/desktop/windows/wsl/). + +Make sure to run it within the WSL2 terminal. +::: + +1. Fork the repository: + + Go to the [ToolJet GitHub repository](https://github.com/ToolJet/Tooljet), click on the **Fork** button to create a copy of the repository under your own GitHub account. + +2. Clone your forked repository: + + After forking, clone the forked repository to your local machine using the URL of your forked repo. + +```bash +git clone https://github.com//ToolJet.git +``` + +3. Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the **[environment variables reference](/docs/setup/env-vars)**. + +```bash +cp ./deploy/docker/.env.internal.example .env +``` + +4. Populate the keys in the `.env` using the below the command: + +```bash +chmod +x ./deploy/docker/internal.sh && ./deploy/docker/internal.sh +``` + +:::warning +If you are setting up on a Windows machine, please ensure that the .env file line endings are set to LF, as they will be CRLF by default unless configured otherwise. +::: + +5. Build Docker images. + +```bash +docker compose build +docker compose run --rm plugins npm run build:plugins +``` + +6. Run ToolJet. + +```bash +docker compose up +``` + + ToolJet should now be served locally at `http://localhost:8082`. + +7. To shut down the containers, use the below commands: + +```bash +docker compose stop +``` + +## Making changes to the codebase + +If you make any changes to the codebase or pull the latest changes from upstream, the ToolJet server container will hot reload the application without any action required from you. + +**Note:** + +1. If the changes include database migrations or new npm package additions in `package.json`, you need to restart the ToolJet server container by running `docker compose restart server`. + + +2. If you need to add a new binary or system library to the container itself, you would need to add those dependencies in `docker/server.Dockerfile.dev` and then rebuild the ToolJet server image. You can do that by running `docker compose build server`. After the build completes, you can start all services by running `docker compose up`. + + +Example: +Let's say you need to install the `imagemagick` binary in your ToolJet server's container. You'd then need to make sure that `apt` installs `imagemagick` while building the image. The Dockerfile at `docker/server.Dockerfile.dev` for the server would then look something like this: + +```bash +FROM node:18.18.2-buster AS builder + +RUN apt update && apt install -y \ +build-essential \ +postgresql \ +freetds-dev \ +imagemagick + +RUN mkdir -p /app +WORKDIR /app + +COPY ./server/package.json ./server/package-lock.json ./ +RUN npm install + +ENV NODE_ENV=development + +COPY ./server/ ./ + +COPY ./docker/ ./docker/ + +COPY ./.env ../.env + +RUN ["chmod", "755", "entrypoint.sh"] +``` + +Once you've updated the Dockerfile, rebuild the image by running `docker compose build server`. After building the new image, start the services by running `docker compose up`. + +## Running Tests + +Test config picks up config from `.env.test` file at the root of the project. + +1. Run the following command to create and migrate data for test db: + +```bash +docker compose run --rm -e NODE_ENV=test server npm run db:create +docker compose run --rm -e NODE_ENV=test server npm run db:migrate +``` + +2. To run the unit tests: +```bash +docker compose run --rm server npm run --prefix server test +``` + +3. To run e2e tests: + +```bash +docker compose run --rm server npm run --prefix server test:e2e +``` + +4. To run a specific unit test: + +```bash +docker compose run --rm server npm --prefix server run test +``` + +## Troubleshooting + +Please open a new issue at https://github.com/ToolJet/ToolJet/issues or join our [Slack Community](https://tooljet.com/slack) if you encounter any issues when trying to run ToolJet locally. + + +## Debugging with Docker + +In this section, we provide guidance on how to enable debugging for ToolJet services using Docker and Visual Studio Code. These additions will significantly benefit contributors by streamlining the debugging process and enhancing the overall development experience. + + +#### VSCode Launch Configuration: + +A new configuration has been added in `.vscode/launch.json` to facilitate launching the client and server in debug mode. This allows contributors to easily debug the application within the Visual Studio Code environment. Configurations include: + +- **Docker Debug Client**: Launch the client running in a Docker container for debugging within Visual Studio Code. +- **Docker Debug Server**: Debug the server in a Docker container, allowing developers to leverage Node.js debugging tools directly from their IDE. + +#### VSCode Task Configuration: + +A new task has been introduced in `.vscode/tasks.json` to manage Docker Compose commands for debugging. This includes tasks to start the client and server in detached mode, making it easier to initiate debugging sessions. + +#### Docker Compose Debug Configuration: + +The `docker-compose-debug.yaml` file defines the services for debugging, exposing the necessary port (9229) for Node.js debugging. This setup ensures that the server runs in debug mode, allowing for effective troubleshooting. + +### Benefits of Debugging Configuration +These changes streamline the debugging process, making it more efficient for contributors to identify and fix issues. The integration with Visual Studio Code allows for advanced debugging features such as breakpoints and real-time variable inspection. Furthermore, standardizing the debugging setup fosters better collaboration among team members, facilitating knowledge sharing and improving the overall development workflow. + +By implementing these configurations, ToolJet aims to enhance the development experience, enabling contributors to resolve issues swiftly and maintain project momentum. + +If you want to run docker in debug mode use this command +```bash +docker-compose -f docker-compose.yaml -f docker-compose-debug.yaml up --build +``` + +**Open the Project in VSCode**: Open the ToolJet directory in Visual Studio Code. + +Check Launch Configurations: +- Open the debug view by clicking on the Debug icon in the Activity Bar on the side of the window. +- Select the appropriate configuration, such as Docker Debug Client or Docker Debug Server. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/macos.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/macos.md new file mode 100644 index 0000000000..74e94c7ad2 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/macos.md @@ -0,0 +1,150 @@ +--- +id: macos +title: Mac OS +--- + +The following guide is intended for contributors to set-up ToolJet locally. If you're interested in **self-hosting** ToolJet, please refer to the **[Setup](/docs/setup/)** section. + + +To set up and run ToolJet on macOS for development, begin by opening your terminal and executing the commands listed below. For a better understanding of ToolJet's framework, we advise reviewing our [architecture guide](/docs/contributing-guide/setup/architecture) before proceeding. + +## Setting up + +1. Set up the environment + + 1.1 Install Homebrew + ```bash + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" + ``` + + 1.2 Install Node.js ( version: v18.18.2 ) and npm (version: v9.8.1) + ```bash + brew install nvm + export NVM_DIR=~/.nvm + source $(brew --prefix nvm)/nvm.sh + nvm install 18.18.2 + nvm use 18.18.2 + npm install -g npm@9.8.1 + ``` + + 1.3 Install Postgres + :::tip + ToolJet uses a postgres database as the persistent storage for storing data related to users and apps. We do not plan to support other databases such as MySQL. + ::: + + ```bash + brew install postgresql@13 + ``` + + 1.4 Install PostgREST + + :::info + Please use PostgREST version 12.2.0 + ::: + + ```bash + brew install postgrest + ``` + + 1.5 Fork the repository: + + Go to the [ToolJet GitHub repository](https://github.com/ToolJet/Tooljet), click on the **Fork** button to create a copy of the repository under your own GitHub account. + + 1.6 Clone your forked repository: + + After forking, clone the forked repository to your local machine using the URL of your forked repo. + + ```bash + git clone https://github.com//ToolJet.git + ``` + +2. Set up environment variables + + Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + ``` + +3. Populate the keys in the env file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + + Example: + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 + SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=localhost + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + TOOLJET_DB=tooljet_db + TOOLJET_DB_USER=postgres + TOOLJET_DB_HOST=localhost + TOOLJET_DB_PASS=postgres + ORM_LOGGING=all + ``` + +4. Install and build dependencies + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + npm run build:plugins + ``` + +5. Set up database + ```bash + npm run --prefix server db:create + npm run --prefix server db:reset + ``` + :::info + If at any point you need to reset the database, use this command `npm run --prefix server db:reset` + ::: + +6. Run plugins compilation in watch mode + ```bash + cd ./plugins && npm start + ``` + +7. Run the server + ```bash + cd ./server && npm run start:dev + ``` + +8. Run the client + ```bash + cd ./frontend && npm start + ``` + + The client will start on the port 8082, you can access the client by visiting: [http://localhost:8082](http://localhost:8082) + +9. Create login credentials + + Visiting [http://localhost:8082](http://localhost:8082) should redirect you to the login page, click on the signup link and enter your email. The emails sent by the server in development environment are captured and are opened in your default browser. Click the invitation link in the email preview to setup the account. + +## Running tests + +Test config requires the presence of `.env.test` file at the root of the project. + +To run the unit tests +```bash +npm run --prefix server test +``` + +To run e2e tests +```bash +npm run --prefix server test:e2e +``` + +To run a specific unit test +```bash +npm run --prefix server test +``` diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/system-requirements.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/system-requirements.md new file mode 100644 index 0000000000..7ee71bf0d1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/system-requirements.md @@ -0,0 +1,24 @@ +--- +id: system-requirements-for-contributing +title: System Requirements +--- + +This page details the system requirements for setting up and running ToolJet on both Docker local and Bare-Metal setups. + +## Docker + +**Windows:** + +When configuring Docker Desktop on your Windows machine, ensure you have a minimum of 16GB RAM for optimal performance. + + +**Mac:** + +For Docker setups on Mac systems, it's advisable to use a machine with 16GB RAM to enhance operational efficiency. + + +## Bare-Metal Setup + +For those who prefer a [bare-metal](/docs/contributing-guide/setup/docker) setup over Docker, a minimum of 8GB RAM is recommended for smooth operation. + +Before initiating the installation process, please verify that your system meets these specified requirements. It's essential to customize server specifications based on the unique demands of your deployment scenario. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/ubuntu.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/ubuntu.md new file mode 100644 index 0000000000..02ca21f42d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/ubuntu.md @@ -0,0 +1,159 @@ +--- +id: ubuntu +title: Ubuntu +--- + +:::warning +The following guide is intended for contributors to set-up ToolJet locally. If you're interested in **self-hosting** ToolJet, please refer to the **[Setup](/docs/setup/)** section. +::: + +Follow these steps to setup and run ToolJet on Ubuntu. Open terminal and run the commands below. + +## Setting up + +1. Set up the environment + + 1.1 Install NVM + ```bash + curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash + ``` + + Use the command to load NVM: + ```bash + source ~/.nvm/nvm.sh + ``` + + Close and reopen your terminal to start using nvm + ```bash + nvm install 18.18.2 + ``` + + Ensure you have the correct version of npm, or it will cause an error about fsevents. + ```bash + npm i -g npm@9.8.1 + ``` + + 1.2 Install Postgres + ```bash + sudo apt install postgresql postgresql-contrib + sudo apt-get install libpq-dev + ``` + + 1.3 Install PostgREST + + :::info + Please use PostgREST version 12.2.0 + ::: + + Please follow the installation [PostgREST](https://postgrest.org/en/stable/install.html) guide + +2. Setup the repository: + + 2.1 Fork the repository: + + Go to the [ToolJet GitHub repository](https://github.com/ToolJet/Tooljet), click on the **Fork** button to create a copy of the repository under your own GitHub account. + + 2.2 Clone your forked repository: + + After forking, clone the forked repository to your local machine using the URL of your forked repo. + + ```bash + git clone https://github.com//ToolJet.git + ``` + +3. Set up environment variables + + Create a `.env` file by copying `.env.example`. More information on the variables that can be set is given in the [environment variables reference](/docs/setup/env-vars) + ```bash + cp .env.example .env + ``` + +4. Populate the keys in the env file + :::info + `SECRET_KEY_BASE` requires a 64 byte key. (If you have `openssl` installed, run `openssl rand -hex 64` to create a 64 byte secure random key) + + `LOCKBOX_MASTER_KEY` requires a 32 byte key. (Run `openssl rand -hex 32` to create a 32 byte secure random key) + ::: + + Example: + ```bash + cat .env + TOOLJET_HOST=http://localhost:8082 + LOCKBOX_MASTER_KEY=1d291a926ddfd221205a23adb4cc1db66cb9fcaf28d97c8c1950e3538e3b9281 + SECRET_KEY_BASE=4229d5774cfe7f60e75d6b3bf3a1dbb054a696b6d21b6d5de7b73291899797a222265e12c0a8e8d844f83ebacdf9a67ec42584edf1c2b23e1e7813f8a3339041 + NODE_ENV=development + # DATABASE CONFIG + PG_HOST=localhost + PG_PORT=5432 + PG_USER=postgres + PG_PASS=postgres + PG_DB=tooljet_development + TOOLJET_DB=tooljet_db + TOOLJET_DB_USER=postgres + TOOLJET_DB_HOST=localhost + TOOLJET_DB_PASS=postgres + ``` + +5. Install and build dependencies + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + npm run build:plugins + ``` + > **_NOTE:_** + > If the `npm run build:plugins` command fails due to some packages are missing, try running the following command to install the necessary packages: + `sudo apt install build-essential` + > then proceed to `npm run build:plugins` step again + + +6. Set up database + ```bash + npm run --prefix server db:create + npm run --prefix server db:reset + ``` + :::info + If at any point you need to reset the database, use this command `npm run --prefix server db:reset` + ::: + +7. Run plugins compilation in watch mode + ```bash + cd ./plugins && npm start + ``` + +8. Run the server + ```bash + cd ./server && npm run start:dev + ``` + +9. Run the client + ```bash + cd ./frontend && npm start + ``` + + + The client will start running on the port 8082, you can access the client by visiting: [http://localhost:8082](http://localhost:8082) + +10. Create login credentials + + Visiting https://localhost:8082 should redirect you to the login page, click on the signup link and enter your email. The emails sent by the server in development environment are captured and are opened in your default browser. Click the invitation link in the email preview to setup the account. + + +## Running tests + +Test config requires the presence of `.env.test` file at the root of the project. + +To run the unit tests +```bash +npm run --prefix server test +``` + +To run e2e tests +```bash +npm run --prefix server test:e2e +``` + +To run a specific unit test +```bash +npm run --prefix server test +``` diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/windows.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/windows.md new file mode 100644 index 0000000000..e08d76b153 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/setup/windows.md @@ -0,0 +1,18 @@ +--- +id: windows +title: Windows +--- + +To run ToolJet, please install it in an Ubuntu environment using **[Windows Subsystem for Linux 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual#step-2---check-requirements-for-running-wsl-2)**. You can obtain the Ubuntu environment from the **Microsoft Store** by visiting this [link](https://apps.microsoft.com/store/detail/ubuntu-22042-lts/9PN20MSR04DW). + +After successfully installing the Ubuntu environment, you will have access to a terminal window similar to the one shown below: + +
    + Windows setup +
    + +:::warning +If you are setting up ToolJet on a Windows machine, ensure that the line endings in the **.env** file are changed to LF. By default, they may be set to CRLF, which is not compatible unless configured specifically for Windows machines. +::: + +Once the environment is set up, you can proceed with the steps outlined in the Ubuntu documentation at **[Contributing Guide - Ubuntu Setup](/docs/contributing-guide/setup/ubuntu)**. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/slackcoc.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/slackcoc.md new file mode 100644 index 0000000000..e9a3f7e4d3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/slackcoc.md @@ -0,0 +1,90 @@ +--- +id: slackcoc +title: Slack Code of Conduct +--- + +# Slack Code of Conduct + +This code of conduct governs ToolJet's Slack Community events and discussions. + +--- + +## Introduction + +- Diversity and inclusion make our community strong. We encourage participation from the most varied and diverse backgrounds possible and want to be very clear about where we stand. + +- Our goal is to maintain a safe, helpful and friendly community for everyone, regardless of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other defining characteristic. + +- This code and related procedures apply to unacceptable behavior occurring in all community venues, including behavior outside the scope of community activities — online and in-person— as well as in all one-on-one communications, and anywhere such behavior has the potential to adversely affect the safety and well-being of community members. + +## Expected behavior + +- Be welcoming. +- Be kind. +- Look out for each other. + +## Unacceptable Behavior + +- Conduct or speech which might be considered sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory or offensive in nature. + - Do not use unwelcome, suggestive, derogatory or inappropriate nicknames or terms. + - Do not show disrespect towards others. (Jokes, innuendo, dismissive attitudes.) +- Intimidation or harassment (online or in-person). +- Disrespect towards differences of opinion. +- Inappropriate attention or contact. Be aware of how your actions affect others. If it makes someone uncomfortable, stop. +- Not understanding the differences between constructive criticism and disparagement. +- Sustained disruptions. +- Violence, threats of violence or violent language. + +## Where does the Code of Conduct apply? + +This Code of Conduct applies to all spaces managed by ToolJet. This includes: + +- Conferences (including social events and peripheral activities) +- Unconferences and sprints +- Meetups, including their discussion boards +- Workshops +- Presentation materials used in talks or sessions +- Slack +- GitHub +- Twitter hashtag and mentions +- Any forums created by the ToolJet which the community uses for communication. + +The Code of Conduct does not exclusively apply to slack or events on an official agenda. For example, if after a scheduled social event you go to a bar with a group of fellow participants, and someone harasses you there, we would still treat that as a CoC violation. Similarly, harassment in Twitter direct messages related to ToolJet can still be covered under this Code of Conduct. + +In addition, violations of this code outside our spaces may affect a person’s ability to participate in them. + +## 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 violations occur, organizers will take any action they deem appropriate for the infraction, up to and including expulsion. + +:::info +Portions derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/), [The Rust Code of Conduct](https://www.rust-lang.org/conduct.html) and [The Ada Initiative](https://adainitiative.org) under a Creative Commons Attribution-ShareAlike license. +::: + +--- + +## Etiquettes to follow + +#### 1. Be nice to everyone + +#### 2. Check off your resolved questions + +If you have received a useful reply to your question, please drop a ✅ reaction or a reply for affirmation. + +#### 3. Try not to repost question + +If you have asked a question and have not got a response in 24hrs, please review your question for clarity and revise it. If you still feel you haven't received adequate response, feel free to ping @navaneeth. + +#### 4. Post in public + +Please don't direct message any individual member of ToolJet community without their explicit permission, independent of reason. Your question might be helpful for other community members. + +#### 5. Don't spam tags + +ToolJet's community of volunteer is very active and helpful, generally avoid tagging members unless it is urgent. + +#### 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 diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/testing.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/testing.md new file mode 100644 index 0000000000..d6f2dfbaad --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/testing.md @@ -0,0 +1,62 @@ +--- +id: testing +title: Testing +--- + +Follow the steps below to setup and run the test specifications using Cypress. We recommend [setting up ToolJet locally](/docs/contributing-guide/setup/macos) before proceeding. + +## Setting up + +- Navigate to the `cypress-tests` directory and enter the following command: + ```bash + npm install + ``` + +## Running Tests + +#### Headed mode + +- To run cypress in **headed** mode, run the following command: + ```bash + npm run cy:open + ``` +- In **headed** mode, the user will be able to choose the test specs from the test runner: +
    + + Cypress headed mode + +
    + +#### Headless mode + +- To run cypress in **headless** mode, run the following command: + + ```bash + npm run cy:run + ``` + +- To run a specific spec in headless mode, run the following command: + + ```bash + npm run cy:run -- --spec "cypress/e2e/dashboard/multi-workspace/manageSSO.cy.js + ``` + +
    + + Cypress headless mode + +
    + + :::caution + If some test specs need the environment variables, the user can pass them similar to the following command: + + ```bash + npm run cy:open -- --env='{"pg_host":"localhost","pg_user":"postgres", "pg_password":"postgres"}' + ``` + + or the user can add env-vars in the **cypress.config.js** file + ::: + +:::info +Check all the Cypress commands [here](https://docs.cypress.io/guides/guides/command-line#Commands) +::: diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/troubleshooting/eslint.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/troubleshooting/eslint.md new file mode 100644 index 0000000000..8caacce4c9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/troubleshooting/eslint.md @@ -0,0 +1,46 @@ +--- +id: eslint +title: EsLint +--- + +# ESLint + +ESLint as a code quality tool is a tool that checks your code for errors and helps you to fix them and enforces a coding style. + + +## Setup + + +1. Install the [ESLint extension](https://eslint.org/docs/latest/user-guide/integrations) for your code editor. +2. Set your editor's default formatter to `ESLint`. + +:::tip +For VSCode users, you can set the formatter to `ESLint` in the [**settings.json**](https://code.visualstudio.com/docs/getstarted/settings#_settingsjson). +::: + +3. Install the dependencies. + ```bash + npm install + npm install --prefix server + npm install --prefix frontend + ``` +4. Run the linter. + ```bash + npm run --prefix server lint + npm run --prefix frontend lint + ``` +5. Fix the ESlint errors and warnings. + ```bash + npm run --prefix server format + npm run --prefix frontend format + ``` + + +## Requirements + +1. **Node version 18.18.2** +2. **npm version 9.8.1** + +:::tip +It is recommended to check the VSCode **Setting.json**(Press `ctrl/cmnd + P` and search `>Settings (JSON)`) file to ensure there are no overrides to the eslint config rules. Comment the following rules for eslint: **eslint.options: `{...}`**. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/troubleshooting/runpy-limits.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/troubleshooting/runpy-limits.md new file mode 100644 index 0000000000..dd2390612d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/troubleshooting/runpy-limits.md @@ -0,0 +1,40 @@ +--- +id: runpy-limitations +title: RunPy limitations +--- + +### Limitation: Unable to Open External URLs with urlopen in RunPy + +When using the `urlopen` function within a RunPy query, you may encounter an error when trying to open external URLs, such as `https://api.baserow.io`. This limitation is due to the underlying framework used by RunPy, Pyodide, which has certain constraints and may not support all features available in a standard Python environment. + +### Solution: Using fetch function with JavaScript + +To overcome this limitation, you can utilize the `fetch` function from JavaScript, as Pyodide supports interoperability between Python and JavaScript. Here's an example of how to make an HTTP request using the `fetch` function in a RunPy query: + +```python +from js import fetch +import json + +async def push_data(url, data): + response = await fetch( + url, + method='POST', + headers=[ + ["Authorization", "Token "], + ["Content-Type", "application/json"] + ], + body=data + ) + reply = await response.json() + return reply + +url = "https://api.baserow.io/api/database/rows/table/.../?user_field_names=true" +reply = await push_data(url, json.dumps()) +reply +``` + +In the example above, the `fetch` function is used to make an HTTP POST request to the specified URL. The `Authorization` header is included to provide the necessary authentication token, and the request body is passed as JSON data. + +By using the `fetch` function and incorporating JavaScript interoperability, you can successfully make HTTP requests within a RunPy query in scenarios where `urlopen` may encounter limitations. + +It's important to note that the solution provided here assumes you have the necessary authorization token and data to push to the Baserow table. Adjust the code accordingly to fit your specific requirements. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/tutorials/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/tutorials/_category_.json new file mode 100644 index 0000000000..0d7c9bc587 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/tutorials/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorials", + "position": 2, + "collapsed": true +} diff --git a/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/tutorials/create-widget.md b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/tutorials/create-widget.md new file mode 100644 index 0000000000..999e1999db --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/contributing-guide/tutorials/create-widget.md @@ -0,0 +1,27 @@ +--- +id: creating-widget +title: Creating Widgets +--- + +# Creating Widgets + +These are some of the most useful properties and functions passed to the widget + +### properties + +The `properties` object will contain the configurable properties of a widget, initially obtained from its definition on `widgetConfig.js`. +The values inside `properties` change whenever the developer makes changes to the inspector panel of ToolJet editor. + +### exposedVariables + +The `exposedVariables` object will contain the values of all exposed variables as configured in `widgetConfig.js`. + +### setExposedVariable('exposedVariableName', newValue) + +This function allows you to update the value of an exposed variable to `newValue`. + +### validate(value) + +This function validates the `value` passed based on the validation settings configured on the inspector panel for the widget. +It returns an array `[isValid, validationError]`, which represents respectively, whether the `value` passed is valid, +and the error message if there is one. diff --git a/docs/docs/copilot.md b/docs/versioned_docs/version-3.0.0-LTS/copilot.md similarity index 96% rename from docs/docs/copilot.md rename to docs/versioned_docs/version-3.0.0-LTS/copilot.md index 1026f3d5d4..69c470332a 100644 --- a/docs/docs/copilot.md +++ b/docs/versioned_docs/version-3.0.0-LTS/copilot.md @@ -3,7 +3,16 @@ id: tooljet-copilot title: Copilot --- -
    Available on: Paid plans
    +
    + Icon + Paid feature +
    + :::info BETA ToolJet Copilot is currently in private beta for **Business** and **Enterprise** users only. diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/data-sources/_category_.json new file mode 100644 index 0000000000..c6ad9ffd74 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Datasource Reference", + "position": 5, + "collapsed": true +} diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/airtable.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/airtable.md new file mode 100644 index 0000000000..0e104540f0 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/airtable.md @@ -0,0 +1,269 @@ +--- +id: airtable +title: Airtable +--- + +ToolJet can connect to your **Airtable** account to read and write data. + +
    + +## Connection + +To establish a connection with the **Airtable** 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 requires the following to connect to your Airtable: +- **Personal Access Token** + +You can generate the Personal Access Token by visiting **[Developer Hub from your Airtable profile](https://support.airtable.com/docs/creating-and-using-api-keys-and-access-tokens#understanding-personal-access-token-basic-actions)**. + +
    + Airtable Data Source Connection +
    + +
    + +:::info +Airtable API has a rate limit, and at the time of writing this documentation, the limit is five(5) requests per second per base. You can read more about rate limits here **[Airtable API](https://airtable.com/api)**. +::: + + +
    + +## Querying Airtable + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Airtable** datasource added in previous step. +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. + +Airtable Data Source Operations + +
    + +
    + +## Supported Operations + +- **[List records](#list-records)** +- **[Retrieve record](#retrieve-record)** +- **[Create record](#create-record)** +- **[Update record](#update-record)** +- **[Delete record](#delete-record)** + +
    + +### List Records + +This operation retrieves a list of records from the specified table. + +#### Required Parameters + +- **Base ID**: The unique identifier of the Airtable base. +- **Table name**: The name or ID of the table to retrieve records from. + +#### Optional Parameters* + +- **Page size**: The number of records to return per page. +- **Offset**: Used for pagination to fetch the next set of records. +- **Filter by formula**: A formula to filter records. +- **Fields**: Specifies which fields to include in the response. +- **Timezone**: The timezone to use for date and time fields. +- **User locale**: The locale to use for formatting date and time fields. +- **Cell format**: Determines how cell values are returned. Possible values are: + - **json**: Returns cell values as JSON objects, depending on the field type. + - **string**: Returns cell values as strings. +- **View**: Specifies the view to retrieve records from. +- **Sort**: Defines the sorting order of records. + +:::info +Timezone and User locale are mutually dependent. If you provide a timezone, you must also provide a user locale and vice versa. These properties are only applied when cell format is set to string. To correctly format date and time fields, make sure the coloumn type is set to Date or Date Time in Airtable. +::: + +Airtable List Records Query + + +
    +**Example Values** + +```json +Base ID: appO4WnRU3eTWnrDB +Table name: tblAPbj6KMjS8pxhH // Can be Table name or Table ID +Page size: 100 +Offset: itrU18e2y6ITuMs1n/recjR8UdOZKjZ7aK3 +Fields: ["Date", "Email", "Usage (# Weeks)"] +Filter by formula: IF({Usage (# Weeks)} < 10, 1, 0) // Only records with Usage (# Weeks) less than 10 +Timezone: America/Chicago +User locale: en-gb +Cell format: string // Cell format needs to be string for Timezone and User locale to work +View: All Responses +Sort: createdTime // Select direction: Ascending or Descending +``` + +
    + + +
    + **Response Example** + + ```json + { + "records": [ + { + "id": "recToGRP6bWUG6djd", + "createdTime": "2016-11-21T20:21:40.000Z", + "fields": { + "Usage (# Weeks)": "3", + "Email": "Edith Lindon", + "Date": "11-21-2016" + } + }, + { + "id": "recnUVJ8wwZbdECLk", + "createdTime": "2016-11-21T20:21:40.000Z", + "fields": { + "Usage (# Weeks)": "3", + "Email": "Marcellus Wong", + "Date": "11-21-2016" + } + }, + { + "id": "recStKhQYw4Fn2qpj", + "createdTime": "2016-11-21T20:21:40.000Z", + "fields": { + "Usage (# Weeks)": "2", + "Email": "Lorraine Ljuba", + "Date": "11-21-2016" + } + } + ] + } + ``` +
    + +### Retrieve Record + +This operation fetches a specific record from the specified table. + +#### Required Parameters + +- **Base ID** +- **Table name** +- **Record ID** + +Airtable Retrieve Record Query + +
    + **Response Example** + ```json + { + "id": "recu9xMnUdr2n2cw8", + "fields": { + "Notes": "Discuss project timeline", + "Name": "Michael Scott" + }, + "createdTime": "2021-05-12T14:30:33.000Z" + } + ``` +
    + +### Create Record + +This operation creates a new record in the specified table. + +#### Required Parameters + +- **Base ID** +- **Table name** +- **Records** + +Airtable Create Record Query + +#### Example + +```json title="Records" +[{ + "fields": { + "Name": "Katrina Petersons", + "Email": "katrina.petersions@example.com" + } +}] +``` +
    + **Response Example** + ```json + { + "records": [ + { + "id": "recu6jhA7tzv4K66s", + "createdTime": "2024-06-11T06:01:44.000Z", + "fields": { + "Name": "Katrina Petersons", + "Email": "katrina.petersions@example.com", + "Date": "06-11-2024", + } + } + ] + } + ``` +
    + +### Update record + +Update a specific record by providing new data. + +#### Required parameters: + +- **Base ID** +- **Table name** +- **Record ID** +- **Body** + +Airtable Update Record Query + +#### Example + +```json +{ + "Email": "katrina.petersions2@example.com" +} +``` +
    + **Response Example** + ```json + { + "records": [ + { + "id": "recu6jhA7tzv4K66s", + "createdTime": "2024-06-11T07:01:44.000Z", + "fields": { + "Name": "Katrina Petersons", + "Email": "katrina.petersions2@example.com", + "Date": "06-11-2024", + } + } + ] + } + ``` +
    + +### Delete record + +This operation removes a record from the specified table. + +#### Required parameters: + +- **Base ID** +- **Table name** +- **Record ID** + +Airtable Delete Record Query + +
    + **Response Example** + ```json + { + deleted: true + id: "recIKsyZgqI4zoqS7" + } + ``` +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/amazonses.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/amazonses.md new file mode 100644 index 0000000000..9563584a86 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/amazonses.md @@ -0,0 +1,77 @@ +--- +id: amazonses +title: Amazon SES +--- + +ToolJet can connect to your Amazon SES account to send emails. + +
    + +## Connection + +To establish a connection with the **Amazon SES** 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 requires the following to connect to Amazon SES: + +- **Region** +- **Authentication** +- **Access key** +- **Secret key** + +**Note:** It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +
    + +Amazon SES + +
    + +
    + +
    + +## Querying Amazon SES + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Amazon SES** datasource added in previous step. +3. Select **Email service** as 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. + +Amazon SES + +
    + +
    + +## Supported Operation + +### Email service + +#### Required parameters: +- **Send email to** +- **Send email from** +- **Subject** +- **Body** + + +#### Optional parameters: +- **CC Addresses** +- **BCC Addresses** + +Amazon SES + + +:::info +**Send mail to** - accepts an array/list of emails separated by comma. +For example: +`{{["dev@tooljet.io", "admin@tooljet.io"]}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/appwrite.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/appwrite.md new file mode 100644 index 0000000000..e491266bfc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/appwrite.md @@ -0,0 +1,148 @@ +--- +id: appwrite +title: Appwrite +--- + +ToolJet can connect to appwrite database to read/write data. + +
    + +## Connection + +To establish a connection with the Appwrite 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 requires the following to connect to your Appwrite: +- **Host (API endpoint)** +- **Project ID** +- **Secret Key** + +You'll find the Secret Key and other credentials on your Appwrite's project settings page. You may need to create a new key if you don't have one already. + +:::info +You should also set the scope for access to a particular resource. Learn more about the **API keys and scopes** [here](https://appwrite.io/docs/keys). +::: + +
    + +Appwrite intro + +
    + +
    + +
    + +## Querying Appwrite + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Appwrite** datasource added in previous step. +3. Select the operation you want to perform. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +
    + +Appwrite intro + +
    + +:::tip +Query results can be transformed using Transformations. Read our **Transformation Documentation** [here](/docs/tutorial/transformations). +::: + +
    + +
    + +## Supported Operations + +- **[List Documents](#list-documents)** +- **[Get Document](#get-document)** +- **[Add Document to Collection](#add-document-to-collection)** +- **[Update Document](#update-document)** +- **[Delete Document](#delete-document)** + +### List Documents + +This operation is used to get a list of all the user documents. + +#### Required Parameters + +- **Collection ID** + +#### Optional Parameters + +- **Limit** +- **Order fields** +- **Order types** +- **Field** +- **Operator** +- **Value** + +
    + +Appwrite List + +
    + +### Get Document + +Use this operation to get a document from a collection by its unique ID. + +#### Required Parameters + +- **Collection ID** +- **Document ID** + +
    + +Appwrite get + +
    + +### Add Document to Collection + +Use this operation to create a new document in a collection. + +#### Required Parameters + +- **Collection ID** +- **Body** + +
    + +Appwrite add + +
    + +### Update Document + +Use this operation to update a document. + +#### Required Parameters + +- **Collection ID** +- **Document ID** +- **Body** + +
    + +Appwrite update + +
    + +### Delete Document + +Use this operation for deleting a document in the collection. + +#### Required Parameters + +- **Collection ID** +- **Document ID** + +
    + +Appwrite delete + +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/athena.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/athena.md new file mode 100644 index 0000000000..215d334494 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/athena.md @@ -0,0 +1,103 @@ +--- +id: athena +title: Athena +--- + +ToolJet can connect to **Amazon Athena** which is an interactive query service that makes it easy to analyze data in Amazon S3 using standard SQL. + +
    + +## Connection + +To establish a connection with the **Amazon Athena** 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 **Amazon Athena** as the data source. + +ToolJet requires the following to connect to your Athena. + +- **Database** +- **S3 output location** +- **Access key** +- **Secret key** +- **Region** + +:::info +You can also configure for **[additional optional parameters](https://github.com/ghdna/athena-express)**. +::: + +
    + +Athena connection + +
    + +
    + +
    + +## Querying Amazon Athena + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Amazon Athena** datasource added in previous step. +3. Select the SQL Query from 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. + +:::tip +**Refer amazon athena docs here for more info:** [link](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) +::: + +
    + +Athena connection + +
    + +
    + +
    + +## Basic Queries + +### Creating Table + +This query is used to create an external table within the database. The data for this table is stored in an S3 bucket at the provided URL (`s3://athena-express-akiatfa53s-2022/` in this example). + +```sql +CREATE EXTERNAL TABLE student ( + name STRING, + age INT +) LOCATION 's3://athena-express-akiatfa53s-2022/'; +``` + +Athena connection + +### Inserting to Table + +This query is attempting to insert a new record into the *student* table in a database. + +```sql +INSERT INTO student +VALUES ('Lansing',1) +``` + +Athena connection + +### Select Operation + +This query retrieves all records from the *student* table where the age of the student is exactly 1 year. + +```sql +SELECT * from student WHERE AGE=1 +``` + +Athena connection + +### List Tables + +This query is used to display a list of all tables in the current database. + +```sql +SHOW TABLES +``` + +Athena connection + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/azureblob.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/azureblob.md new file mode 100644 index 0000000000..56f63d25f0 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/azureblob.md @@ -0,0 +1,141 @@ +--- +id: azureblobstorage +title: Azure Blob +--- + +ToolJet offers the capability to establish a connection with Azure Blob storage in order to read and store large objects. + +## Connection + +To establish a connection with the Azure Blob 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 Azure Blob as the data source. + +ToolJet requires the following to connect to your Azure Blob. +- **Connection String** + +
    + +Azure Blob - ToolJet + +
    + +
    + +## Querying Azure Blob + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Azure Blob** datasource added in previous step. +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. + +:::tip +Query results can be transformed using Transformation. For more information on transformations, please refer to our documentation at **[link](/docs/tutorial/transformations)**. +::: + +
    + +Azure Blob - ToolJet + +
    + +
    + +
    + +## Supported Operations + +1. **[Create container](#create-container)** +2. **[List containers](#list-containers)** +3. **[List blobs](#list-blobs)** +4. **[Upload blob](#upload-blob)** +5. **[Read blob](#read-blob)** +6. **[Delete blob](#delete-blob)** + + +### Create Container + +The create container operation enables the creation of new containers within Azure Blob storage. Containers serve as logical units for organizing and managing blob data. Users can provide a unique name for the container. Once created, the container is available for use in storing and organizing blob data. If the container with the same name already exists, the operation fails. + +#### Required Parameters +- **Container Name** + +
    + +Azure blob: create container operation + +
    + +### List Containers + +The list container operation allows you to retrieve a list of containers within Azure Blob storage. + +
    + +Azure blob: list container operation + +
    + +### List Blobs + +The list blobs operation enables you to retrieve a list of blobs within a specific container in Azure Blob storage. + +#### Required Parameter + +- **Container** +- **Page Size** + +#### Optional Parameters + +- **Prefix** +- **Continuation Token** + +
    + +Azure blob: list blobs operation + +
    + +### Upload Blob + +The upload blob operation allows you to upload a new blob or update an existing blob in Azure Blob storage. It provides a convenient way to store data such as files, images, or documents in the specified container. + +#### Required Parameters + +- **Container** +- **Blob Name** +- **Content Type** +- **Upload Data** +- **Encoding** + +Azure blob: upload blobs operation + +### Read Blob + +The read blob operation allows you to retrieve the content of a specific blob stored in Azure Blob storage. It enables you to access and retrieve the data stored within the blob for further processing or display. + +#### Required Parameters + +- **Container** +- **Blob Name** + +
    + +Azure blob: read blob operation + +
    + +### Delete Blob + +The delete blob operation allows you to remove a specific blob from Azure Blob storage. This operation permanently deletes the blob and its associated data, freeing up storage space and removing the blob from the container. + +#### Required Parameters + +- **Container** +- **Blob Name** + +
    + +Azure blob: delete blob operation + +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/baserow.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/baserow.md new file mode 100644 index 0000000000..28af4a4327 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/baserow.md @@ -0,0 +1,292 @@ +--- +id: baserow +title: Baserow +--- + +ToolJet can connect to your Baserow account to read and write data. + +
    + +## Connection + +To establish a connection with the **Baserow** 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 requires the following to connect to Baserow: + +- **API token** +- **Host** +- **Base URL** + +
    + +Baserow intro + +
    + +
    + +
    + +## Querying Baserow + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Baserow** datasource added in previous step. +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. + +Amazon SES + +
    + +
    + +## Supported Operations + +- **[List fields](#list-fields)** +- **[List rows](#list-rows)** +- **[Get row](#get-row)** +- **[Create row](#create-row)** +- **[Update row](#update-row)** +- **[Move row](#move-row)** +- **[Delete row](#delete-row)** + +### List Fields + +This query lists all the fields in a table. + +#### Required Parameter + +- **Table ID** + +Baserow list fields + +
    + **Response Example** + + ```yaml + [ + { + "id": 331156, + "table_id": 57209, + "name": "Name", + "order": 0, + "type": "text", + "primary": true, + "text_default": "" + }, + { + "id": 331157, + "table_id": 57209, + "name": "Last name", + "order": 1, + "type": "text", + "primary": false, + "text_default": "" + }, + { + "id": 331158, + "table_id": 57209, + "name": "Notes", + "order": 2, + "type": "long_text", + "primary": false + }, + { + "id": 331159, + "table_id": 57209, + "name": "Active", + "order": 3, + "type": "boolean", + "primary": false + } + ] + ``` + +
    + +### List Rows + +This query lists all the rows in a table. + +#### Required Parameter + +- **Table ID** + +Baserow list + +
    + **Response Example** + + ```json + { + "count": 3, + "next": null, + "previous": null, + "results": [ + { + "id": 2, + "order": "0.99999999999999999991", + "Name": "Bill", + "Last name": "Gates", + "Notes": "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce dignissim, urna eget rutrum sollicitudin, sapien diam interdum nisi, quis malesuada nibh eros a est.", + "Active": false + }, + { + "id": 3, + "order": "0.99999999999999999992", + "Name": "Mark", + "Last name": "Zuckerberg", + "Notes": null, + "Active": true + }, + { + "id": 1, + "order": "0.99999999999999999997", + "Name": "Elon", + "Last name": "Musk", + "Notes": null, + "Active": true + } + ] + } + ``` + +
    + +### Get Row + +#### Required Parameters + +- **Table ID** +- **Row ID** + +Baserow get + +
    + **Response Example** + + ```json + { + "id": 1, + "order": "0.99999999999999999997", + "Name": "Elon", + "Last name": "Musk", + "Notes": null, + "Active": true + } + ``` + +
    + +### Create Row + +#### Required Parameters +- **Table ID** +- **Records** + +Bserow create + +#### Example + +```json +{ + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +
    + **Response Example** + + ```json + { + "id": 19, + "order": "0.99999999999999999996", + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true + } + ``` + +
    + +### Update Row + +#### Required Parameters + +- **Table ID** +- **Row ID** +- **Records** + +Baserow update + +#### Example + +```json +{ + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true +} +``` + +
    + **Response Example** + + ```json + { + "id": 19, + "order": "0.99999999999999999996", + "Name": "Test", + "Last name": "Test Name", + "Notes": "Test Note", + "Active": true + } + ``` + +
    + +### Move Row + +#### Required Parameters + +- **Table ID** +- **Row ID** + +#### Optional Parameters + +- **Before ID** (The row will be moved before the entered ID. If not provided, then the row will be moved to the end ) + +Baserow move row + +
    + **Response Example** + + ```json + { + "id": 3, + "order": "2.00000000000000000000", + "Name": "Mark", + "Last name": "Zuckerburg", + "Notes": null, + "Active": true + } + ``` + +
    + +### Delete Row + +#### Required Parameters +- **Table ID** +- **Row ID** + +Baserow delete + +While deleting a row, the response will be either success or failure from Baserow. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/bigquery.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/bigquery.md new file mode 100644 index 0000000000..b2c19cbbb8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/bigquery.md @@ -0,0 +1,193 @@ +--- +id: bigquery +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. + +ToolJet requires the following to connect to your BigQuery: +- **Private key** + +How to get a Private key? +1. You need to enable BigQuery API in your Google Cloud Console. You can follow the steps to enable BigQuery API from **[Google Cloud](https://cloud.google.com/bigquery/docs/bigquery-web-ui)**. +2. You need to create a service account and generate a key for the same. You can follow the steps to create a service account from **[Google Cloud](https://cloud.google.com/iam/docs/creating-managing-service-accounts)**. +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 + +**The JSON file should look like this:** + +```json +{ + "type": "service_account", + "project_id": "long-sonar-324407", + "private_key_id": "63f4415e600bd7879bc14fd1157a4aabe227c204", + "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDRGgDmfwYcKp4q\n3ce4DkrKv0vTn/Jn2Z2vEHp+oOz5ebZqmE3v56c6YIvtVRblANILPrOsB5ZvkF5f\nEzZBXn7ZI3+dqKBrpxbJqF6bKTLENdgFZRTbXHtGDpmwX4A+ufir9QNoezRw0i5L\nnVZiVC54f/Qt/cKT8794qSnrxNX1TneZLGxJWou9VAl3xT9h2HdL56gYIuleWXDK\nnXkb3Leh9AMZCdFPMyC24MWefWrUbNkqJ7V8FHo7bMrAcFNuSoF2NfK1v6IPLkEs\nwAU0CJ9VSg6rrahQOqIJ04cdYs2OUh4lRvRB6pqlVvtl6EdJB6dHln1nDzpgHbnb\n+acfwEDnAgMBAAECggEAGs/mSKgGDQuL73wztU6j2X6RBwhN6XIWjZGj22PgLxcj\nxGRWLgp6v3oMxzhvcJrb1BRMrqTkbdbJuxA4F0a6JjaukPVD6Lnqqp37z5KHT3CG\nDB8LfxtLNU7+9wYv6Bspn0cSEk4mCcdxp0F8B6y6rrndgh41WopZRWwPk4tQUh1r\nor67AAYd3rtzGMLoghs+8UE+UYa8wbpsbmHEYgqvXQAkNsl8WdNwqmI0G4lf+pgx\n7Rm27LJrtdBBHc48RUhg2eiN05HLCsnwkrnSj0rLL/L7T1yoSfCSUuv1mTUesxQ1\nXUEsPQQTTsNsqKOxT71CzQLElrPfwZkN4Y/IOJqX3QKBgQD6u0idi2r54hMjBSuk\npLgXygH5AWfHc4QqMCui7HZrFOJ4U4AreI/zZrM3Gemgs+1l27wsUjoxADW2Egyq\nX5AVe94RKSV3cCIIty38VOUBVsgyxj38d8yWkpJKJ2FcAgqEzPDDo0TCaOEq01oA\nYqjkgBz7Sh4XhQ5xwzfnOPRPtQKBgQDVfsly/k03wAJo1xlUZeq9mAnba5Hz07x9\nJ3REAwrtOaD891rKbkqDZKdGHTMweFGeEW2Hx7Q5iRS4WDKFO14wgSHFTkkVoSKR\n2W7XMomUQPFojQwgkDhrxsGE8O1DqfQ0+A5AJn2ASv/cyVGE3V2xg2rGr/HWi6Wq\nUp4FxebXqwKBgQDNIcCNNG03N6EUe7xzHViIDfuDL4UqhvXQVky9JNzVSubmLtqj\ntiV/q7xgDlE36z0EorvXPwbg5B0NcsLt+PU2vnq2a4V9rD4MB2IWGZaqe8ea0toP\n3iuB3TTWelWLIxhcAhfQ15j/vTLLCNOPkShAmhgb902bTH6+0ErCX7RyKQKBgQCe\nDOeLpvF5VT8zaBILZgva4eRiOQdqz5RZvsyW0P3U0vX4cBIZjH7DOM+Q22sa9efO\nMi6490HX2kCpnDmCYon/NInQrHz0cz7JZINm8rXhOBa/hLO2o63xM8nt5gJwNjBg\nykaafSQpxtwWEj+0McD7+kMg5f4OC4HQTqtHsNONUwKBgAoWGGRPja068BPIiUMB\nezsdYPP5TdASiBeAEPaQXQHlJxPDu9KoKqM5xvWIdR8eH1z7cuQ3RP89hYT03/UT\nBvWXHk2MJQZK7BZDw9KMZAKexK9/qxwHS6i7HhErD+Au3UaRX8dfjJzX8WAwuAwp\nVDwHncN3n4mPFQl7eijnQZ/F\n-----END PRIVATE KEY-----\n", + "client_email": "tooljettest@long-sonar-324407.iam.gserviceaccount.com", + "client_id": "103664451567222591066", + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://oauth2.googleapis.com/token", + "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", + "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/tooljettest%40long-sonar-324407.iam.gserviceaccount.com", + "universe_domain": "googleapis.com" +} +``` + +
    + +
    + +## Querying BigQuery + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **BigQuery** datasource added in previous step. +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 + +
    + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +
    + +
    + +## Supported Operations + +- **[Query](#query)** +- **[List Datasets](#list-datasets)** +- **[List Tables](#list-tables)** +- **[Insert Record ](#insert-record)** +- **[Delete Record ](#delete-record)** +- **[Update Record](#update-record)** +- **[Create View](#create-view)** +- **[Create Table](#create-table)** +- **[Delete Table](#create-table)** + +### Query + +This operation returns the data based on the **Query**. + +**Note**: Follow the reference given in **Google Cloud** about the operations: **[Query options](https://cloud.google.com/bigquery/docs/reference/rest/v2/Job)** and **[Query results options](https://cloud.google.com/nodejs/docs/reference/bigquery/latest/overview#_google_cloud_bigquery_QueryResultsOptions_type)**. + +#### Required Parameters + +- **Query** +- **Query options** +- **Query results options** + +BQ query + +### List Datasets + +This operation returns the list of datasets. + +BQ list datasets + +### List Tables + +This operation returns the list of tables within a dataset. + +#### Required Parameter + +- **Dataset ID** + +BQ list tables + +### Create Table + +This operation is used to create a table. + +#### Required Parameters + +- **Table ID** +- **Dataset ID** +- **Options** + +BQ create tables + +**NOTE:** Visit https://github.com/googleapis/nodejs-bigquery/blob/main/samples/createTable.js for more info on schema. + +### Delete Table + +This operation is used to delete a table. + +#### Required Parameters + +- **Table ID** +- **Dataset ID** + +BQ delete tables + +### Create View + +This operation is used to create a view. + +#### Required Parameters + +- **Table ID** +- **Dataset ID** +- **View name** +- **View columns** +- **Condition** +- **Query options** +- **Query results options** + +BQ create view + +### Insert Record + +This operation is used to insert a record. + +#### Required parameters: + +- **Table ID** +- **Dataset ID** +- **Rows** + +BQ insert + +### Delete Record +Use this operation to delete a record. + +#### Required parameters: + +- **Table ID** +- **Dataset ID** +- **Condition** +- **Query options** +- **Query results options** + +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! +::: + +### Update Record +Use this operation to update a record. + +#### Required parameters: + +- **Table ID** +- **Dataset ID** +- **Columns** +- **Condition** +- **Query results options** + +BQ update + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/clickhouse.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/clickhouse.md new file mode 100644 index 0000000000..4f01ec89aa --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/clickhouse.md @@ -0,0 +1,174 @@ +--- +id: clickhouse +title: ClickHouse +--- + +ToolJet can connect to the ClickHouse to read and write data. + +:::info +ToolJet uses this [NodeJS](https://github.com/TimonKK/clickhouse) client for ClickHouse. +::: + +## Connection + +To establish a connection with the Clickhouse 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 requires the following to connect to your ClickHouse Database: + +- **Username** +- **Password** +- **Host** +- **Port** +- **Database Name** +- **Protocol** +- **Use Post** +- **Trim Query** +- **Use Gzip** +- **Debug** +- **Raw** + +ClickHouse connection + +
    + +## Querying ClickHouse + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **ClickHouse** datasource added in previous step. +3. Select the operation you want to perform and enter the query. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +:::info +For more details on clickhouse visit [Clickhouse Docs](https://clickhouse.com/docs/en/quick-start). +::: + +
    + +
    + +## Supported Operations + +- **[SQL Query](#sql-query)** +- **[Insert array of objects](#insert-array-of-objects)** + +### SQL Query + +Use this to operation to enter **[ClickHouse SQL Statements](https://clickhouse.com/docs/en/sql-reference/statements/)**. These statements represent various kinds of action you can perform using SQL queries. + +#### Example SQL queries + +#### SELECT: + +```sql +SELECT * from test array; +``` + +ClickHouse SQL Statement operation + +#### CREATE: + +```sql +CREATE TABLE test array3 ( + date Date, + str String, + arr Array(String), + arr2 Array (Date) + arr3 Array(UInt32) , + id1 UUID +)ENGINE=MergeTree () ORDER BY(str) +``` + +ClickHouse SQL Statement operation + +#### ALTER TABLE (add column) + +```sql +ALTER TABLE test array1 ADD COLUMN Added2 UInt32; +``` + +ClickHouse SQL Statement operation + +#### SELECT WITH WHERE CLAUSE +```sql +SELECT * FROM test array1 WHERE str='Somethingl...' +``` + +ClickHouse SQL Statement operation + +#### UPDATE +```sql +ALTER TABLE test_array1 UPDATE arr = (12] WHERE str='Somethingl...' +``` + +ClickHouse SQL Statement operation + +#### DELETE +```sql +ALTER TABLE test_array1 DELETE WHERE str= 'Somethingl...' +``` + +ClickHouse SQL Statement operation + +#### NORMAL INSERT + +##### Step 1 - Creating Table + +```sql +CREATE TABLE test array4 ( + name String, + date Date +)ENGINE=MergeTree () ORDER BY (name) +``` + +ClickHouse SQL Statement operation + +#### Step 2 - Insert + +```sql +INSERT INTO test_array4 (*) VALUES ('juvane', '1996-01-13') +``` + +ClickHouse SQL Statement operation + +:::info +**Giving Primary Key** +```sql +CREATE TABLE db.table_name +( + name1 type1, name2 type2, ..., + PRIMARY KEY(expr1[, expr2,...])] +) +ENGINE = engine; + +OR + +CREATE TABLE db.table_name +( + name1 type1, name2 type2, ... +) +ENGINE = engine +PRIMARY KEY(expr1[, expr2,...]); +``` +::: + +### Insert Array of Objects + +Use this operation for inserting array of objects. + +#### Required Parameters: +- **Body** +- **Table name** +- **Fields** + +**Example Body value:** +```javascript +[ + { "id": 1, "name": "Alice", "age": 25 }, + { "id": 2, "name": "Bob", "age": 30 }, + { "id": 3, "name": "Charlie", "age": 28 } +] +``` + +ClickHouse Insert array of objects operation + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/cosmosdb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/cosmosdb.md new file mode 100644 index 0000000000..2b792319e2 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/cosmosdb.md @@ -0,0 +1,128 @@ +--- +id: cosmosdb +title: CosmosDB +--- + +ToolJet can connect to CosmosDB databases to read and write data. + +## Connection + +To establish a connection with the CosmosDB 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 requires the following to connect to your Cosmos DB. + +- **Cosmos DB Account End point** +- **Cosmos DB Account Key** + +:::info +**Azure Cosmos DB End Point** is the URL of the Cosmos DB service. +**Azure Cosmos DB Key** is the key that is used to access the Cosmos DB service. +You can find the endpoint and key in the **[Azure Portal](https://portal.azure.com/)**. +::: + +
    + +ToolJet - Data source - CosmosDB + +
    + +
    + +## Querying CosmoDB + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **CosmoDB** datasource added in previous step. +3. Select the operation you want to perform and enter the query. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +ToolJet - Data source - CosmosDB + +
    + +
    + +## Supported Queries + +- **[List databases](#list-databases)** +- **[List containers](#list-containers)** +- **[Insert items](#insert-items)** +- **[Read item](#read-item)** +- **[Delete item](#delete-item)** +- **[Query database](#query-database)** + +### List Databases + +This query lists all the databases in a Cosmos DB. + +ToolJet - Data source - CosmosDB + +### List Containers + +This query lists all the containers of a database in a Cosmos DB. + +#### Required Parameter +- **Database** + +ToolJet - Data source - CosmosDB + +### Insert Items + +This query inserts one or more items in a container of a database in a Cosmos DB. + +#### Required Parameter +- **Database** +- **Container** +- **Items** + +ToolJet - Data source - CosmosDB + +#### Example + +```yaml +{ + "id": "123", + "product": "Laptop", + "price": 1200, + "customer_id": "C001" +} +``` + +### Read Item + +To read a single item from a container of a database in a Cosmos DB, use the following query. + +#### Required Parameter +- **Database** +- **Container** +- **Item ID** + +ToolJet - Data source - CosmosDB + +### Delete Item + +To delete an item from a container of a database in a Cosmos DB, use the following query. + +#### Required Parameter +- **Database** +- **Container** +- **Item ID** + +ToolJet - Data source - CosmosDB + +### Query Database + +To query documents from a container of a database in a Cosmos DB using SQL-like syntax, use the following query. + +#### Required Parameter +- **Database** +- **Container** +- **Query** + +ToolJet - Data source - CosmosDB + +#### Example +```yaml +SELECT * FROM c WHERE c.age > 20 AND c.age <= 30 +``` + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/couchdb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/couchdb.md new file mode 100644 index 0000000000..ef7a46561d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/couchdb.md @@ -0,0 +1,284 @@ +--- +id: couchdb +title: CouchDB +--- + +ToolJet can connect to CouchDB databases to read and write data. + +
    + +## Connection + +To establish a connection with the CouchDB 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 requires the following to connect to your CouchDB. +- **Username** +- **Password** + +Couch listing + +
    + +
    + +## Querying CouchDB + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **CouchDB** datasource added in previous step. +3. Select the operation you want to perform and enter the query. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +Couch listing + +
    + +
    + +## Supported Queries + +- **[List Records](#list-records)** +- **[Retrieve Record](#retrieve-record)** +- **[Create Record](#create-record)** +- **[Update Record](#update-record)** +- **[Delete Record](#delete-record)** +- **[Find](#find)** +- **[Get View](#get-view)** + +### List Records + +This query lists all the records in a database. + +#### Optional Parameters + +- **Include docs** +- **Descending order** +- **Limit** +- **Skip** + +Couch listing + +
    + **Response Example** + ```json +{ + "total_rows": 3, + "offset": 0, + "rows": [ + { + "id": "23212104e60a71edb42ebc509f000dc2", + "key": "23212104e60a71edb42ebc509f000dc2", + "value": { + "rev": "1-0cc7f48876f15883394e5c139c628123" + } + }, + { + "id": "23212104e60a71edb42ebc509f00216e", + "key": "23212104e60a71edb42ebc509f00216e", + "value": { + "rev": "1-b3c45696b10cb08221a335ff7cbd8b7a" + } + }, + { + "id": "23212104e60a71edb42ebc509f00282a", + "key": "23212104e60a71edb42ebc509f00282a", + "value": { + "rev": "1-da5732beb913ecbded309321cac892d2" + } + }, + ] +} +``` +
    + +### Retrieve Record + +This operation fetches a single record by its record ID. + +#### Required Parameters: + +- **Record ID** + + +Couch retrieve view + +
    + **Response Example** +```json +{ + "_id": "e33dc4e209689cb0400d095fc401a1e0", + "_rev": "1-a62af8e14451af88c150e7e718b7a0e8", + "0": { + "name": "test data" + } +} +``` +
    + +### Create Record + +Inserts a new record into the database. + +#### Required Parameters: + +- **Records** + + +Couch create view + +#### Example + +```json + [{"name":"tooljet"}] +``` + +
    + **Response Example** + ```json + { + "ok": true, + "id": "23212104e60a71edb42ebc509f0049a2", + "rev": "1-b0a625abc4e21ee554737920156e911f" + } + ``` +
    + +### Update Record + +You can get the revision id value, by sending a GET request to get the document details. +You get the document as JSON in the response. For each update to the document, the revision field "_rev" gets changed. + +#### Required Parameters: +- **Record ID** +- **Revision ID** + + +Couch update view + + +#### Example + +```json +[{"name":"tooljet"}] +``` + +
    + **Response Example** + ```json + { + "ok": true, + "id": "23212104e60a71edb42ebc509f0049a2", + "rev": "2-b0a625abc4e21ee554737920156e911f" + } + ``` +
    + +### Delete Record + +Removes a record from the database by its record ID. + +#### Required Parameters: +- **Record ID** +- **Revision ID** + + +Couch delete view + +
    + **Response Example** + ```json + { + "ok": true, + "id": "rev_id=2-3d01e0e87139c57e9bd083e48ecde13d&record_id=e33dc4e209689cb0400d095fc401a1e0", + "rev": "1-2b99ef28c03e68ea70bb668ee55ffb7b" + } + ``` +
    + +### Find + +Find documents using a declarative JSON querying syntax. + +#### Required Parameters: +- **Mangoquery** + +:::info +NOTE: +selector syntax: https://pouchdb.com/guides/mango-queries.html +::: + + +Couch find + + +#### Example + +```json +{ + "selector": { + "year": {"$gte": 2015} + }, + "fields": ["year"] +} +``` + +Example response from CouchDB: + +Couch find response + +### Get View + +Views are the primary tool used for querying and reporting on CouchDB documents. + +#### Required Parameters +- **View url** + + +#### Optional Parameters: +- **Start key** +- **End key** +- **Limit** +- **Skip** + +Couch get view + +
    + **Response Example** + ```json + { + "total_rows": 4, + "offset": 0, + "rows": [ + { + "id": "23212104e60a71edb42ebc509f000dc2", + "key": "23212104e60a71edb42ebc509f000dc2", + "value": { + "rev": "1-0cc7f48876f15883394e5c139c628123" + } + }, + { + "id": "23212104e60a71edb42ebc509f00216e", + "key": "23212104e60a71edb42ebc509f00216e", + "value": { + "rev": "1-b3c45696b10cb08221a335ff7cbd8b7a" + } + }, + { + "id": "23212104e60a71edb42ebc509f00282a", + "key": "23212104e60a71edb42ebc509f00282a", + "value": { + "rev": "1-da5732beb913ecbded309321cac892d2" + } + }, + { + "id": "23212104e60a71edb42ebc509f002cbd", + "key": "23212104e60a71edb42ebc509f002cbd", + "value": { + "rev": "1-ca5bb3c0767eb42ea6c33eee3d395b59" + } + } + ] + } + ``` +
    + +
    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 new file mode 100644 index 0000000000..07cd2824fc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/custom-js.md @@ -0,0 +1,165 @@ +--- +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. + +
    + +## Creating a Run JavaScript Query + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select **Run JavaScript Code** from the list of available data sources. +3. Add the JavaScript Code. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +Run JavaScript code + +
    + +
    + +## Parameters in Run JavaScript Code + +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. + +### Steps to Add a Parameter + +1. In the RunJS query editor, click the **Parameters +** button to create a new parameter. +2. Provide a **Name** for the parameter. +3. Set a Default **Value**, which can be a string, number, or object. + +Once added, the **parameter can be referenced in the code using the syntax**: `parameters.`. + +
    + +Run JavaScript code + +
    + +### 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. + +Syntax: +``` +alert(parameters.newAlert) +``` + +When the query is triggered the alert will show the parameters value. + +Run JavaScript code + +### Calling Another Query with Parameters + +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: + + - *num1* with a default value of **10** + - *num2* with a default value of **2**. + - Add the following JavaScript Code: + + ```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. + +
    + +
    + +## RunJS Example Queries + +### Generating a Random Number + +This example demonstrates how to generate and display a random number using JavaScript. + +1. Drag a **button** and a **text** widget inside a **container** widget. +2. Click on the **+ Add** on the query panel to create a query and select **Run JavaScript code** from the available datasources. +3. Write the code in **JavaScript editor** and run the query. + +```js +const a = Math.floor(Math.random() * (10 - 1)) + 1; +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* + +Run JavaScript code + +### Generating a Unique ID + +The following code generates a unique ID in the format "id" followed by a sequence of random hexadecimal characters. + +```js +var id = "id" + Math.random().toString(16).slice(2); +return id; +``` +For example, it could be something like "id2f4a1b". + +Run JavaScript code + +### Generating a Timestamp-Based Unique ID + +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, ''); +``` + +This ID will be longer than the one generated earlier, and it could look like "2g3h1d6a4h3". + +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. +- [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. +::: + +
    + +
    + +## Libraries + +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) | + +:::info +Issues with writing custom JavaScript code? Ask in our [Slack Community](https://tooljet.com/slack). +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/databricks.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/databricks.md new file mode 100644 index 0000000000..3a3784af7a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/databricks.md @@ -0,0 +1,138 @@ +--- +id: databricks +title: Databricks +--- + +Databricks is a cloud-based platform for data processing, analytics, and machine learning. ToolJet connects to Databricks, allowing your applications to access and update your data in your Databricks Warehouses directly using SQL queries. + +
    + Install Databricks +
    + +
    + +## Configuration + +ToolJet's Databricks integration relies on a configuration form that supports the following parameters: + +#### Required Parameters + +- **Server hostname**: The server hostname or the IP address of your Databricks Warehouse. For example, `62596234423488486.6.gcp.databricks.com`. +- **HTTP Path**: The API endpoint path for the Databricks resource you want to access. For example, `/sql/1.0/warehouses/44899g7346c19m95`. +- **Personal access token**: Personal access tokens are used for secure authentication to the Databricks API instead of passwords. For example, `dapi783c7d155d138d8cf14`. + +#### Optional Parameters + +- **Port**: The port number of your Databricks Warehouse. The default port number is `443`. +- **Default Catalog**: The default catalog to use for the connection. +- **Default Schema**: The default schema to use for the connection. + +### Setup + +- Navigate to your Databricks workspace, select the desired SQL Warehouse, and find **Server Hostname** and **HTTP Path** within the connection details tab. + +Databricks: Connection Details + +- To generate a personal access token, access your Databricks User Settings, select the Developer tab, click Manage under Access Tokens, and then click on the **Generate New Token** button. + +Databricks: Access Tokens + +- Navigate to the Databricks datasource configuration form in ToolJet, fill in the required parameters, and click the **Save** button. You can test the connection by clicking the **Test Connection** button. + +Databricks: Setup Paramaters + +
    + +
    + +## Querying Databricks + +1. Click on + Add button of the query manager at the bottom panel of the editor. +2. Select the **Databricks** datasource added in previous step. +3. Select the **SQL Mode** from the dropdown. (ToolJet currently supports only SQL mode for Databricks interactions.) +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +
    + +Databricks: Query Setup + +
    + + +:::tip +You can apply transformations to the query results. Refer to our transformations documentation for more information: [link](/docs/tutorial/transformations) +::: + +
    + +
    + +## Supported Queries + +Databricks supports standard SQL commands for data manipulation tasks. + +### Read Data + +The following example demonstrates how to read data from a table. The query selects all the columns from the *customers* table. + +```sql +SELECT * FROM customers +``` + +Databricks: Read Data Query + +### Write Data + +The following example demonstrates how to write data to a table. The query inserts a new row into the *customers* table. + +```sql +INSERT INTO customers ( + customer_id, + first_name, + last_name, + email, + phone, + city, + state, + zip_code, + country +) VALUES ( + '1001' + 'Tom', + 'Hudson', + 'tom.hudson@example.com', + '50493552', + 'San Clemente', + 'CA', + '92673', + 'USA' +); +``` + +Databricks: Write Data Query + +### Update Data + +The following example demonstrates how to update data in a table. The query updates the *first_name* and *email* column of the *customers* table. + +```sql +UPDATE customer +SET first_name = 'John', + email = 'john.hudson@example.com' +WHERE customer_id = 1001; +``` + +Databricks: Update Data Query + +### Delete Data + +The following example demonstrates how to delete data from a table. The query deletes a row from the *customers* table. + +```sql +DELETE FROM customer +WHERE customer_id = 1001; +``` + +Databricks: Delete Data Query + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/dynamodb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/dynamodb.md new file mode 100644 index 0000000000..2847fb897e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/dynamodb.md @@ -0,0 +1,347 @@ +--- +id: dynamodb +title: DynamoDB +--- + +**DynamoDB** is a managed non-relational database service provided by Amazon. ToolJet has the capability to connect to DynamoDB for reading and writing data. + +
    + +## Connection + +To establish a connection with the **DynamoDB** 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. + +
    + +DynamoDB + +
    + +ToolJet supports connecting to DynamoDB using three methods: **IAM Credentials**, **AWS Instance Credentials**, or **AWS ARN Role**. + +When using **IAM Credentials**, you will need to provide the following information: + +- **Region** +- **Access key** +- **Secret key** + +It is recommended to create a dedicated IAM user for the database in order to have granular control over ToolJet's access levels. + +
    + +ToolJet - DynamoDB connection + +
    + +To connect to DynamoDB using an **AWS Instance Credentials**, select the option to **Use AWS Instance Credentials**. This will utilize the IAM role attached to the EC2 instance where ToolJet is running. The WebIdentityToken parameter obtained from a successful login with an identity provider is used to access the metadata service of an ECS container and the EC2 instance. + +
    + +ToolJet - DynamoDB connection + +
    + +If you prefer to use an **AWS ARN Role**, you will need to provide the following details: + +- **Region** +- **Role ARN** + +
    + +ToolJet - DynamoDB connection + +
    + +
    + +
    + +## Querying DynamoDB + +To perform queries on **DynamoDB**, click on the **+ Add** button in the query manager located at the bottom panel of the editor. Select the previously added database as the data source for the query. Choose the desired operation and click on the **Run** button to run the query. + +
    + +ToolJet - DynamoDB connection + +
    + +:::tip +You can apply transformations to the query results. Refer to our transformations documentation for more information: [link](/docs/tutorial/transformations) +::: + +#### Supported Operations + +- **[List Tables](#list-tables)** +- **[Get Item](#get-item)** +- **[Query Table](#query-table)** +- **[Scan Table](#scan-table)** +- **[Delete Item](#delete-item)** +- **[Update Item](#update-item)** +- **[Describe Table](#describe-table)** +- **[Create Table](#create-table)** +- **[Put Item](#put-item)** + +
    + +### List Tables + +Returns an array of table names associated with the current account and endpoint. The output from *List Tables* is paginated, with each page returning a maximum of 100 table names. + +
    + +ToolJet - DynamoDB operations + +
    + +### Get Item + +Retrieves a single item from a table. You must specify the primary key for the item that you want. You can retrieve the entire item, or just a subset of its attributes. + +#### Required Parameter + +- **Table** +- **Key name** + +#### Example + +```json +{ + "Key": { + "ForumName": { + "S": "Amazon DynamoDB" + }, + "Subject": { + "S": "How do I update multiple items?" + } +} +``` + +
    + +ToolJet - DynamoDB operations + +
    + +### Query Table + +Retrieves all items that have a specific partition key. You must specify the partition key value. You can retrieve entire items, or just a subset of their attributes. Optionally, you can apply a condition to the sort key values so that you only retrieve a subset of the data that has the same partition key. You can use this operation on a table, provided that the table has both a partition key and a sort key. You can also use this operation on an index, provided that the index has both a partition key and a sort key. + +#### Required Parameter + +- **Query condition** + +#### Example + +```yaml +{ + "TableName": "Reply", + "IndexName": "PostedBy-Index", + "Limit": 3, + "ConsistentRead": true, + "ProjectionExpression": "Id, PostedBy, ReplyDateTime", + "KeyConditionExpression": "Id = :v1 AND PostedBy BETWEEN :v2a AND :v2b", + "ExpressionAttributeValues": { + ":v1": { "S": "Amazon DynamoDB#DynamoDB Thread 1" }, + ":v2a": { "S": "User A" }, + ":v2b": { "S": "User C" } + }, + "ReturnConsumedCapacity": "TOTAL" +} +``` + +
    + +ToolJet - DynamoDB operations + +
    + +### Scan Table + +Retrieves all items in the specified table or index. You can retrieve entire items, or just a subset of their attributes. Optionally, you can apply a filtering condition to return only the values that you are interested in and discard the rest. + +#### Required Parameter + +- **Scan condition** + +#### Example + +```yaml +{ + "TableName": "" +} +``` + +
    + +ToolJet - DynamoDB operations + +
    + +### Delete Item + +Deletes a single item from a table. You must specify the primary key for the item that you want to delete. + +#### Required Parameter + +- **Table** +- **Key name** + +#### Example + +```yaml +{ + "Key": { + "ForumName": { + "S": "Amazon DynamoDB" + }, + "Subject": { + "S": "How do I update multiple items?" + } + }, + "ConditionExpression": "attribute_not_exists(Replies)", + "ReturnValues": "ALL_OLD" +} +``` + +
    + +ToolJet - DynamoDB operations + +
    + +### Update Item + +Update an item in DynamoDB by specifying the primary key and providing new attribute values. If the primary key does not exist in the table then instead of updating it will insert a new row. + +#### Required Parameter + +- **Update Condition** + +#### Example + +```yaml +{ + "TableName": "USER_DETAILS_with_local", + "Key": { + "USER_ID": 1, + "USER_NAME": "Nick" + }, + "UpdateExpression": "set USER_AGE = :age, USER_FEE = :fee", + "ExpressionAttributeValues": { + ":age": 40, + ":fee": 230545 + } +} +``` + +
    + +ToolJet - DynamoDB operations + +
    + +### Describe Table + +This operation in DynamoDB retrieves metadata and configuration details about a specific table. It provides information such as the table's name, primary key schema, provisioned throughput settings, and any secondary indexes defined on the table. + +#### Required Parameter + +- **Table** + +
    + +ToolJet - DynamoDB operations + +
    + +### Create Table + +This operation in DynamoDB enables you to create a new table by specifying its name, primary key schema, and optional configurations. + +#### Required Parameter + +- **Table Parameters** + +#### Example + +```yaml +{ + "AttributeDefinitions": [ + { + "AttributeName": "USER_ID", + "AttributeType": "N" + }, + { + "AttributeName": "USER_FEE", + "AttributeType": "N" + } + ], + "KeySchema": [ + { + "AttributeName": "USER_ID", + "KeyType": "HASH" + } + ], + "LocalSecondaryIndexes": [ + { + "IndexName": "USER_FEE", + "KeySchema": [ + { + "AttributeName": "USER_ID", + "KeyType": "HASH" + }, + { + "AttributeName": "USER_FEE", + "KeyType": "RANGE" + } + ], + "Projection": { + "ProjectionType": "KEYS_ONLY" + } + } + ], + "ProvisionedThroughput": { + "ReadCapacityUnits": 1, + "WriteCapacityUnits": 1 + }, + "TableName": "USER_FEE_LOCAL", + "StreamSpecification": { + "StreamEnabled": false + } +} +``` + +
    + +ToolJet - DynamoDB operations + +
    + +### Put Item + +This operation allows you to create or replace an item in a table. It enables you to specify the table name, provide the attribute values for the new item, and define the primary key attributes to uniquely identify the item. + +#### Required Parameter + +- **New Item Details** + +#### Example + +```yaml +{ + "TableName": "USER_DETAILS_with_localS", + "Item": { + "USER_ID": 1, + "USER_NAME": "NICK", + "USER_AGE": 34, + "USER_FEE": 1234.56 + } +} +``` + +
    + +ToolJet - DynamoDB operations + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/elasticsearch.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/elasticsearch.md new file mode 100644 index 0000000000..03f06f0b92 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/elasticsearch.md @@ -0,0 +1,482 @@ +--- +id: elasticsearch +title: Elasticsearch +--- + +ToolJet allows you to connect to your Elasticsearch cluster to perform data read/write operations and execute various queries. + +## Connection + +To connect to an Elasticsearch data source in ToolJet, you can either click the **+ Add new data source** button on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page in the ToolJet dashboard. + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. +::: + +To connect to your Elasticsearch cluster, the following details are required: +- **Host** +- **Port** +- **Username** +- **Password** + +
    + Elastic Connect +
    + +ToolJet also supports SSL certificate-based connections: +- You can use either CA or Client certificates. + +
    + Elastic SSL Connect +
    + +
    + +## Querying Elasticsearch + +1. Click the **+ Add** button in the query manager at the bottom of the editor and select the Elasticsearch data source added earlier. +2. Choose the operation you want to perform on your Elasticsearch cluster. + +:::tip +Query results can be transformed using transformations. Refer to our transformations documentation for more details: **[link](/docs/tutorial/transformations)** +::: + +
    + +
    + +## Supported Operations + +ToolJet supports the following Elasticsearch operations: + +- **[Search](#search)** +- **[Index a Document](#index-a-document)** +- **[Get a Document](#get-a-document)** +- **[Update a Document](#update-a-document)** +- **[Delete a Document](#delete-a-document)** +- **[Bulk Operation](#bulk-operation)** +- **[Count Documents](#count-documents)** +- **[Check Document Existence](#check-document-existence)** +- **[Multi Get](#multi-get)** +- **[Scroll Search](#scroll-search)** +- **[Clear Scroll](#clear-scroll)** +- **[Get Cat Indices](#get-cat-indices)** +- **[Get Cluster Health](#get-cluster-health)** + +### Search + +This operation executes a search query and returns matching search hits. For more details, see the Elasticsearch search guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-search.html)**. + +#### Required Parameter +- **Index**: The name of the index to search in. +- **Query**: The search query in JSON format. + +#### Optional Parameter +- **Scroll**: Scroll time. + +
    + Elastic search +
    + +#### Example: +```yaml +Index: books +Query: + { + "query": { + "match": { + "title": "The Great Gatsby" + } + }, + "size": 20 + } +Scroll: 1m # Can be in the format of 1m, 1h, 1d. +``` + +### Index a Document + +This operation adds a JSON document to the specified index or data stream. For more details, see the Elasticsearch index guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html)**. + +#### Required Parameter +- **Index**: The name of the index to add the document to +- **Body**: The document body in JSON format + +
    + Elastic index +
    + +#### Example: +```yaml +Index: books +Body: + { + "title": "1984", + "author": "George Orwell", + "year": 1949, + "genre": "Dystopian Fiction" + } +``` + +### Get a Document + +This operation retrieves the specified JSON document from the index. For more details, see the Elasticsearch get guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html)**. + +#### Required Parameter +- **Index**: The name of the index to get the document from +- **Id**: The ID of the document to retrieve + +
    + Elastic get +
    + +#### Example: +```yaml +Index: books +Id: FJXTSZEBsuzUn2y4wZ-W +``` + +### Update a Document + +This operation updates a document using the specified script. For more details, see the Elasticsearch update guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-update.html)**. + +#### Required Parameter +- **Index**: The name of the index containing the document +- **Id**: The ID of the document to update +- **Body**: The update script or partial document in JSON format + +
    + Elastic update +
    + +#### Example: +```yaml +Index: books +Id: FJXTSZEBsuzUn2y4wZ-W +Body: +{ + "doc": { + "title": "1984", + "author": "George Orwell", + "year": 1949, + "genre": "Fiction" + } +} +``` + +### Delete a Document + +This operation removes a JSON document from the specified index. For more details, see the Elasticsearch delete guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-delete.html)**. + +#### Required Parameter +- **Index**: The name of the index containing the document +- **Id**: The ID of the document to delete + +
    + Elastic delete +
    + +#### Example: +```yaml +Index: books +Id: FJXTSZEBsuzUn2y4wZ-W +``` + +### Bulk Operation + +This operation performs multiple index/update/delete operations in a single API call. For more details, see the Elasticsearch bulk guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-bulk.html)**. + +#### Required Parameter +- **Operations**: The bulk operations to perform in JSON format + +
    + Elastic bulk +
    + +#### Example: +```yaml +[ + { "index": { "_index": "books", "_id": "book1" } }, + { + "title": "The Great Gatsby", + "author": "F. Scott Fitzgerald", + "year": 1925 + }, + { "delete": { "_index": "books", "_id": "book2" } }, + { "index": { "_index": "books", "_id": "book3" } }, + { + "title": "Moby-Dick", + "author": "Herman Melville", + "year": 1851 + }, + { "delete": { "_index": "books", "_id": "book4" } } +] +``` + +### Count Documents + +This operation returns the number of matches for a search query. For more details, see the Elasticsearch count guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-count.html)**. + +#### Required Parameter +- **Index**: The name of the index to count documents in. + +#### Optional Parameter +- **Query**: The query to filter documents in JSON format + +
    + Elastic count +
    + +#### Example: +```yaml +{ + "query": { + "range": { + "timestamp": { + "gte": 1901 + } + } + } +} +``` + +### Check Document Existence + +This operation checks if a document exists in an index. For more details, see the Elasticsearch exists guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-get.html#docs-get-api-response-codes)**. + +#### Required Parameter: +- **Index**: The name of the index to check for document existence +- **Id**: The ID of the document to check + +
    + Elastic exists +
    + +#### Example: +```yaml +Index: books +Id: FJXTSZEBsuzUn2y4wZ-W +``` + +### Multi Get + +This operation retrieves multiple documents in a single request. For more details, see the Elasticsearch multi-get guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-multi-get.html)**. + +#### Required Parameter +- **Operations**: The multi-get operations to perform in JSON format + +
    + Elastic multi get +
    + +#### Example: +```yaml +{ + "docs": [ + { "_index": "books", "_id": "book124" }, + { "_index": "books", "_id": "book125" } + ] +} +``` + +### Scroll Search + +This operation retrieves large numbers of results from a single search request. For more details, see the Elasticsearch scroll guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/paginate-search-results.html#scroll-search-results)**. + +#### Required Parameter +- **Scroll ID**: The scroll ID for the search +- **Scroll**: The scroll time + +
    + Elastic scroll +
    + +#### Example: +```yaml +Scroll ID: DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAOWQWYm9vbDItY1NCOUExal9TcTBjeUEyZw +Scroll: 60m +``` + +### Clear Scroll + +This operation clears the search context for a scroll. For more details, see the Elasticsearch clear scroll guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/clear-scroll-api.html)**. + +#### Required Parameter +- **Scroll ID**: The scroll ID to clear + +
    + Elastic clear scroll +
    + +#### Example: +```yaml +Scroll ID: DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAOWQWYm9vbDItY1NCOUExal9TcTBjeUEyZw +``` + +### Get Cat Indices + +This operation provides a compact, column-aligned view of indices in a cluster. For more details, see the Elasticsearch cat indices guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/cat-indices.html)**. + +
    + Elastic cat indices +
    + +
    + **Response Example** +```json +{ + "body": [ + { + "health": "yellow", + "status": "open", + "index": "1", + "uuid": "JQOzqxK7Rdar7ROOlqXwkA", + "pri": "1", + "rep": "1", + "docs.count": "2", + "docs.deleted": "0", + "store.size": "9.2kb", + "pri.store.size": "9.2kb" + }, + { + "health": "yellow", + "status": "open", + "index": "recipes", + "uuid": "eNGdAsG4TMWvs9f0eLERlQ", + "pri": "1", + "rep": "1", + "docs.count": "20", + "docs.deleted": "0", + "store.size": "30kb", + "pri.store.size": "30kb" + }, + { + "health": "yellow", + "status": "open", + "index": "read_me", + "uuid": "EbE4V-5RRE2y-_P4z_auVQ", + "pri": "1", + "rep": "1", + "docs.count": "1", + "docs.deleted": "0", + "store.size": "5.1kb", + "pri.store.size": "5.1kb" + } + ], + "statusCode": 200, + "headers": { + "x-elastic-product": "Elasticsearch", + "content-type": "application/json", + "content-length": "558" + }, + "meta": { + "context": null, + "request": { + "params": { + "method": "GET", + "path": "/_cat/indices", + "body": null, + "querystring": "format=json", + "headers": { + "user-agent": "opensearch-js/1.2.0 (linux 6.5.0-1021-aws-x64; Node.js v18.18.2)" + }, + "timeout": 30000 + }, + "options": {}, + "id": 1 + }, + "name": "opensearch-js", + "connection": { + "url": "http://xx.2xx.183.199:9200/", + "id": "http://xx.2xx.183.199:9200/", + "headers": {}, + "deadCount": 0, + "resurrectTimeout": 0, + "_openRequests": 0, + "status": "alive", + "roles": { + "master": true, + "data": true, + "ingest": true + } + }, + "attempts": 0, + "aborted": false + } +} +``` +
    + +### Get Cluster Health + +This operation retrieves the status of the cluster’s health. For more details, see the Elasticsearch cluster health guide **[here](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-health.html)**. + +
    + Elastic cluster health +
    + +
    + **Response Example** +```json +{ + "body": { + "cluster_name": "docker-cluster", + "status": "yellow", + "timed_out": false, + "number_of_nodes": 1, + "number_of_data_nodes": 1, + "active_primary_shards": 10, + "active_shards": 10, + "relocating_shards": 0, + "initializing_shards": 0, + "unassigned_shards": 3, + "delayed_unassigned_shards": 0, + "number_of_pending_tasks": 0, + "number_of_in_flight_fetch": 0, + "task_max_waiting_in_queue_millis": 0, + "active_shards_percent_as_number": 76.92307692307693 + }, + "statusCode": 200, + "headers": { + "x-elastic-product": "Elasticsearch", + "content-type": "application/json", + "content-length": "405" + }, + "meta": { + "context": null, + "request": { + "params": { + "method": "GET", + "path": "/_cluster/health", + "body": null, + "querystring": "", + "headers": { + "user-agent": "opensearch-js/1.2.0 (linux 6.5.0-1021-aws-x64; Node.js v18.18.2)" + }, + "timeout": 30000 + }, + "options": {}, + "id": 1 + }, + "name": "opensearch-js", + "connection": { + "url": "http://xx.2xx.183.199:9200/", + "id": "http://xx.2xx.183.199:9200/", + "headers": {}, + "deadCount": 0, + "resurrectTimeout": 0, + "_openRequests": 0, + "status": "alive", + "roles": { + "master": true, + "data": true, + "ingest": true + } + }, + "attempts": 0, + "aborted": false + } +} +``` +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/firestore.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/firestore.md new file mode 100644 index 0000000000..2cdb654af0 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/firestore.md @@ -0,0 +1,170 @@ +--- +id: firestore +title: Cloud Firestore +--- + +ToolJet can connect to **Cloud Firestore** databases to read and write data. + +
    + +## Connection + +To establish a connection with the **Cloud Firestore** 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 Cloud Firestore as the data source. + +ToolJet requires the following to connect to your BigQuery: +- **Private key** + +For generating a private key check out **[Firestore's official documentation](https://cloud.google.com/iam/docs/creating-managing-service-account-keys#iam-service-account-keys-create-console)**. + +firestore add ds + +
    + +
    + +## Querying Firestore + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Cloud Firestore** datasource added in previous step. +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. + +firestore QUERY + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +
    + +
    + +## Supported Operations +- **[Get Document](#get-document)** +- **[Query collection](#query-collection)** +- **[Add Document to Collection](#add-document-to-collection)** +- **[Update Document](#update-document)** +- **[Set Document](#set-document)** +- **[Bulk update using document ID](#bulk-update-using-document-id)** +- **[Delete Document](#delete-document)** + +### Get Document + +Use this operation to get the data in a document. + +#### Required Parameters + +- **Path** + +firestore get + +### Query Collection + +Use this operation to query all the documents in a collection. Check firestore doc **[here](https://firebase.google.com/docs/reference/js/v8/firebase.database.Query)**. + +#### Required Parameters + +- **Path** + +#### Optional parameters + +- **Order type** +- **Limit** +- **Field** +- **Operator** +- **Value** + +firestore collection + +### Add Document to Collection + +Use this operation for creating a new document in a collection. + +#### Required Parameters + +- **Collection** +- **Body**. + +#### Example +```json +{ +"Author": "Shubh", +"id": 5 +} +``` + +firestore document + +### Update Document + +Use this operation for updating the existing document in a collection. Also, it only updates fields if they exist, but doesn't replace an entire object like **[set operation](#set-document)**. + +#### Required Parameters + +- **Path** +- **Body** + +#### Example +```json +{ +"Author": "Shubhendra", +"id": 3 +} +``` + +firestore update + +### Set Document + +This operation replaces your chosen object with the value that you provide. So if your object has 5 fields, and you use Set operation and pass object with 3 fields, it will now have 3 fields. + +#### Required Parameters + +- **Path** +- **Body** + +#### Example +```json +{ +"Author": "Shefewfbh", +"id": 9 +} +``` + +firestore set + +### Bulk Update Using Document ID + +Use this operation for bulk updating documents. + +#### Required Parameters + +- **Collection** +- **Key for document ID** +- **Records** + +firestore bulk + +### Delete Document + +Use this operation for deleting a document in a collection. + +#### Required Parameters + +- **Path** + +firestore delete + +
    + +
    + +## Transforming Firestore Query Result for Table Widget + +The Firestore query result is in the form of object so we’ll need to transform it into array. + +```js +return data = Array(data) +``` + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/gcs.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/gcs.md new file mode 100644 index 0000000000..23d92f21e8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/gcs.md @@ -0,0 +1,117 @@ +--- +id: gcs +title: Google Cloud Storage +--- + +ToolJet can connect to GCS buckets and perform various operation on them. + +
    + +## Connection + +To establish a connection with the Google Cloud Storage 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 requires the following to connect to a GCS datasource: +- **JSON Private Key** + +You can follow the [google documentation](https://cloud.google.com/docs/authentication/getting-started) to get started. + +gcs connection + +
    + +
    + +## Querying GCS + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **GCS** datasource added in previous step. +3. Select the Operation. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +#### Supported operations + +- **[Read file](#read-file)** +- **[Upload file](#uplodad-file)** +- **[List buckets](#list-buckets)** +- **[List files in a bucket](#list-files-in-a-bucket)** +- **[Signed url for download](#signed-url-for-download)** +- **[Signed url for upload](#signed-url-for-upload)** + +gcs query + +### Read File + +Reads the content of a file from GCS. + +#### Required Parameter +- **Bucket** +- **File Name** + +gcs query + +### Uplodad File + +Uploads a file to GCS. + +#### Required Parameter +- **Bucket** +- **File name** +- **Upload data** + +#### Optional Parameter +- **Content Type** +- **Encoding** + +gcs query + +### List Buckets + +Retrieves a list of available buckets. + +gcs query + +### List Files in a Bucket + +Lists files within a specific GCS bucket. + +#### Required Parameter +- **Bucket** + +#### Optional Parameter +- **Prefix** + +gcs query + +### Signed URL for Download + +Generates a signed URL for downloading a file. + +#### Required Parameter +- **Bucket** +- **File Name** + +#### Optional Parameter +- **Expires in** + +gcs query + +### Signed URL for Upload + +Generates a signed URL for uploading a file. + +#### Required Parameter +- **Bucket** +- **File name** + +#### Optional Parameter +- **Expires in** +- **Content Type** + +gcs query + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/google.sheets.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/google.sheets.md new file mode 100644 index 0000000000..afca7bb787 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/google.sheets.md @@ -0,0 +1,220 @@ +--- +id: googlesheets +title: Google Sheets +--- + +ToolJet has the capability to establish a connection with Google Sheet for both reading and writing data. By utilizing OAuth 2.0, ToolJet can establish a secure connection with Google Sheet, ensuring that the application's access to a user's account is restricted and limited appropriately. + +
    + +## Self-Hosted Configuration + +If you decide to self-host ToolJet, there are a few additional steps you need to take: + +1. Proceed with the setup steps provided in the [Google OAuth 2.0 guide](/docs/setup/env-vars#google-oauth--optional-) to configure the necessary settings. +2. Assign the corresponding values obtained from the previous step to the following environment variables: + - **GOOGLE_CLIENT_ID** + - **GOOGLE_CLIENT_SECRET** + - **TOOLJET_HOST** +3. Activate the Google Sheets API within the Google Cloud Platform (GCP) console. + +
    + +
    + +## Connection + +To establish a connection with the Google Sheet datasource, 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. + +### Authorization Scopes + +When connecting to a Google Sheets datasource, you can choose between two permission scopes: + +1. **Read Only**: This scope allows you to access and retrieve data from the Google Sheet. +2. **Read and Write**: This scope grants you both read and write permissions, enabling you to retrieve and modify data within the Google Sheet. + +
    + +Google Sheet + +
    + +
    + +
    + +## Querying Google Sheet + +1. Click the **+ Add** button in the query manager located at the bottom panel of the editor. +2. Select the **Google Sheet** datasource under the datasource section. +3. Choose the desired operation from the dropdown. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +Using Google sheets data source you can perform several operations from your applications like: + + 1. **[Create a spreadsheet](#create-a-spreadsheet)** + 2. **[List all sheets of a spreadsheet](#list-all-sheets-of-a-spreadsheet)** + 3. **[Read data from a spreadsheet](#read-data-from-a-spreadsheet)** + 4. **[Append data to a spreadsheet](#append-data-to-a-spreadsheet)** + 5. **[Get spreadsheet info](#get-spreadsheet-info)** + 6. **[Update single row of a spreadsheet](#update-single-row-of-a-spreadsheet)** + 7. **[Delete row from a spreadsheet](#delete-row-from-a-spreadsheet)** + +
    + +Google Sheet Operations + +
    + +:::info +**Spreadsheet ID** can be obtained from the URL of the spreadsheet. For example, in the URL `https://docs.google.com/spreadsheets/d/1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM/edit#gid=0`, the `1W2S4re7zNaPk9vqv6_CqOpPdm_mDEqmLmzjVe7Nb9WM` represents the spreadsheet ID. +::: + +### Create a Spreadsheet + +This operation can be used to create a new spreadsheet. + +#### Required Parameter +- **Title** + +
    + +create a spreadsheet + +
    + +### List All Sheets of a Spreadsheet + +This operation can be used to list all sheets of a spreadsheet. + +#### Required Parameter +- **Spreadsheet ID** + +
    + +create a spreadsheet + +
    + +### Read Data From a Spreadsheet + +This operation allows you to retrieve the table data from a spreadsheet in the form of a JSON object. + +#### Required Parameter +- **Spreadsheet ID** + +#### Optional Parameter +- **Range** +- **Sheet** + +
    + +Google Sheet Operations + +
    + +### Append Data to a Spreadsheet + +Add additional rows to a table by using the append operation. + +#### Required Parameter +- **Spreadsheet ID** +- **Rows** + +#### Optional Parameter +- **Sheet** + +
    + +Google Sheet Operations + +
    + +#### Example +```yaml +[ + { + "name": "John", + "email": "john@tooljet.com", + "date": "2024-09-16", + "status": "Confirmed", + "phone": "+123456789" + }, + { + "name": "Jane", + "email": "jane@tooljet.com", + "date": "2024-09-17", + "status": "Pending", + "phone": "+987654321" + }, + { + "name": "Doe", + "email": "doe@tooljet.com", + "date": "2024-09-18", + "status": "Cancelled", + "phone": "+112233445" + } +] +``` + +### Get Spreadsheet Info + +This operation allows you to retrieve basic information about the spreadsheet, including the number of sheets, theme, time zone, format, and URL, among others. + +
    + +google sheets get info + +
    + +### Update Single Row of a Spreadsheet + +This operation allows you to update existing data in a sheet. + +#### Required Parameters +- **Spreadsheet ID** +- **Where** +- **Operator** +- **Value** +- **Body** + +#### Optional Parameters +- **Range** +- **Sheet** + +
    + +Google Sheet Operations + +
    + +#### Example +```yaml +{ + "id": "456", + "company": "ABC Tech Solutions", + "position": "Product Manager", + "url": "https://abctech.com/careers", + "date-applied": "2024-09-10", + "status": "Application Under Review" +} +``` + +### Delete Row From a Spreadsheet + +This operation allows you to delete a specific row from the sheet. + +#### Required Parameter +- **Spreadsheet ID** +- **Delete row number** + +#### Optional Parameter +- **GID** + +
    + +google sheets delete + +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/graphql.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/graphql.md new file mode 100644 index 0000000000..1f7252bb0f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/graphql.md @@ -0,0 +1,120 @@ +--- +id: graphql +title: GraphQL +--- + +ToolJet can establish connections with GraphQL endpoints, enabling the execution of queries and mutations. + +
    + +## Connection + +To establish a connection with the GraphQL global datasource, you can either click on the **+ Add new global datasource** button located on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page through the ToolJet dashboard. + +
    + +ToolJet - Data source - GraphQL + +
    + +ToolJet requires the following to connect to a GraphQL datasource: + +- **URL**: URL of the GraphQL endpoint. +- **Headers**: Any headers the GraphQL source requires. +- **URL parameters**: Additional query string parameters. +- **Authentication Type**: The method of authentication to use with GraphQL requests. + - **None**: No credentials or tokens are required. + - **Basic**: Requires Username and Password. + - **Bearer**: Requires a token, typically a JSON Web Token (JWT), to grant access. + - **OAuth 2.0**: The OAuth 2.0 protocol mandates the provision of the following parameters: access token URL, access token URL custom headers, client ID, client secret, scopes, custom query parameters, authorization URL, custom authentication parameters, and client authentication. + +
    + +
    + +## Querying GraphQL + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **GraphQL** datasource added in previous step. +3. Add the Query. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +### Required Parameters: +- **Query** + +### Optional Parameters +- **Variable** +- **Headers** + +
    + +ToolJet - Data source - GraphQl + +
    + +#### Example +```yaml +{ + todos { + id + description + } +} +``` + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +
    +## Metadata + +Metadata is additional information about the data returned by the GraphQL query. It includes details such as the request URL, method, headers, and response status code. You can access this information using the `metadata` object. REST API. The metadata can be accessed within queries and components using the `{{queries..metadata}}` syntax. + +:::info +While accessing the properties of the metadata object, which contains a hyphen, you can use the bracket notation. For example, to access the `content-length` property, you can use `{{queries.graphql1.metadata.request.headers["content-length"]}}` or `{{queries.graphql1.metadata.request.headers."content-length"}}`. +::: + +
    +**Example Metadata** + +```json +{ + "request": { + "url": "https://swapi-graphql.netlify.app/.netlify/functions/index?testParam=valueParam", + "method": "POST", + "headers": { + "user-agent": "got (https://github.com/sindresorhus/got)", + "header1key": "Header1value", + "content-type": "application/json", + "content-length": "275", + "accept-encoding": "gzip, deflate, br" + }, + "params": { + "testParam": "valueParam" + } + }, + "response": { + "statusCode": 200, + "headers": { + "access-control-allow-origin": "*", + "age": "0", + "cache-control": "no-cache", + "cache-status": ""Netlify Durable"; fwd=method, "Netlify Edge"; fwd=method", + "content-encoding": "br", + "content-length": "840", + "content-type": "application/json; charset=utf-8", + "date": "Fri, 13 Sep 2024 06:38:27 GMT", + "etag": "W/"18ad-ZANyCoLSJjHWg3k1SaMp6gH/gdQ"", + "netlify-vary": "query", + "server": "[REDACTED]", + "strict-transport-security": "max-age=31536000; includeSubDomains; preload", + "vary": "Accept-Encoding", + "x-nf-request-id": "01J7N1NG25V8Q9GY51RH11ACTN", + "x-powered-by": "Express", + "connection": "close" + } + } +} +``` +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/grpc.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/grpc.md new file mode 100644 index 0000000000..9584b36001 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/grpc.md @@ -0,0 +1,86 @@ +--- +id: grpc +title: gRPC +--- + +
    Self-hosted only
    + +:::caution +Only self-hosted deployments will have access to a gRPC datasource that is capable of handling unary requests and responses. +::: + +
    + +## Setup + +### Step 1: Upgrade ToolJet to the Version 2.5 or Above + +Find instructions on how to do this in the setup guides located here: [ToolJet Setup](/docs/setup/). + +### Step 2: Add Proto Files + +At the root, create a directory named "*protos*" and add a "*service.proto*" file inside it. + + +### Step 3: Mount Volumes + +In the **docker-compose.yml** add the following to the *volumes* sections for **plugins** and **server** + +```bash +./protos:/app/protos +``` + +gRPC: datasource + +gRPC: datasource + +### Step 4: Reboot the Instance + +```bash +docker-compose up -d +``` + +
    + +
    + +## Querying gRPC + +After setting up your proto files, you should be able to establish a connection to gRPC by going to the [global datasource](/docs/data-sources/overview) page. + +### Connect the gRPC Datasource + +ToolJet requires the following to connect to gRPC servers: + +- **Server URL** +- **Authentication type** + - None + - Basic + - Bearer + - API key + +
    + +gRPC: connection + +
    + +Once you have added the gRPC from the global datasource page, you'll find it on the query panel of the application. + +
    + +gRPC: connection + +
    + +### Creating Query + +You can now query a particular RPC method of the added services. + +
    + +gRPC: connection + +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/influxdb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/influxdb.md new file mode 100644 index 0000000000..dec39572ce --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/influxdb.md @@ -0,0 +1,212 @@ +--- +id: influxdb +title: InfluxDB +--- + +ToolJet can connect to InfluxDB databases to read and write data. Use the Token authentication scheme to authenticate to the InfluxDB API. For more info visit [InfluxDB docs](https://docs.influxdata.com/). + +
    + +## Connection + +ToolJet connects to InfluxDB using : + +- **API Token** +- **Host** +- **Port** +- **Protocol** (HTTP/HTTPS) + +:::info +For generating API Token visit [InfluxDB docs](https://docs.influxdata.com/influxdb/cloud/security/tokens/create-token/). +::: + +
    + +influx auth + +
    + +
    + +
    + +## Supported Queries + +- **[Write data](#write-data)** +- **[Query data](#query-data)** +- **[Generate an Abstract Syntax Tree (AST) from a query](#generate-an-abstract-syntax-tree-ast-from-a-query)** +- **[Retrieve query suggestions](#retrieve-query-suggestions)** +- **[Retrieve query suggestions for a branching suggestion](#retrieve-query-suggestions-for-a-branching-suggestion)** +- **[Analyze a Flux query](#analyze-a-flux-query)** +- **[List buckets](#list-buckets)** +- **[Create a bucket](#create-a-bucket)** +- **[Retrieve a bucket](#retrieve-a-bucket)** +- **[Update a bucket](#update-a-bucket)** +- **[Delete a bucket](#delete-a-bucket)** + + +influx operations + + +### Write Data + +This operation writes data to a bucket. + +#### Required Parameters: + +- **Bucket** +- **Organization name or ID** +- **Data** + +#### Optional Parameters: + +- **Precision** + +influx operations + +### Query Data + +Retrieves data from InfluxDB buckets. + +#### Required Parameters: +- **Organization name or ID** +- **Flux query** + +influx operations + +#### Example + +```yaml +from(bucket: "sensor_data") +|> range(start: -1h) +|> filter(fn: (r) => r["_measurement"] == "temperature") +``` + +### Generate an Abstract Syntax Tree (AST) from a Query + +This operation analyzes flux query and generates a query specification. + +#### Required Parameters: + +- **Query** + +influx operations + +#### Example + +```yaml +from(bucket: "website_metrics") + |> range(start: -7d) + |> filter(fn: (r) => r["_measurement"] == "page_views") + |> group(columns: ["url"]) + |> sum(column: "_value") + |> sort(columns: ["_value"], desc: true) +``` + +### Retrieve Query Suggestions + +This query retrieve query suggestions. + +influx operations + +### Retrieve Query Suggestions for a Branching Suggestion + +This operation retrieve query suggestions for a branching suggestion. + +#### Required Parameters: +- **Name** + +influx operations + +### Analyze a Flux Query + +This Analyzes a Flux query. + +#### Required Parameters: + +- **Query** + +influx operations + +#### Example +```yaml +from(bucket: "sensor_data") + |> range(start: -1d) + |> filter(fn: (r) => r["_measurement"] == "humidity") + |> mean(column: "_value") +``` + +### List Buckets + +This operation lists all the buckets in a database. + +influx operations + +### Create a Bucket + +This operation creates a bucket in database. + +#### Required Parameters: + +- **Query** + +influx operations + +#### Example +```yaml +POST http://localhost:8086/api/v2/buckets +Content-Type: application/json +Authorization: Token your_auth_token + +{ + "name": "new_bucket", + "orgID": "your_org_id", + "retentionRules": [ + { + "everySeconds": 3600 + } + ] +} +``` + +### Retrieve a Bucket + +This operation retrieve a bucket in a database. + +#### Required Parameters: +- **Bucket ID** + +influx operations + +### Update a Bucket + +This operaition updates the bucket in database. + +#### Required Parameters: +- **Bucket ID** +- **Query** + +influx operations + +#### Example +```yaml +{ + "name": "updated_bucket_name", + "retentionRules": [ + { + "everySeconds": 7200 + } + ] +} +``` + +### Delete a Bucket + +This operation delete the bucket in database. + +#### Required Parameters: +- **Bucket ID** + +influx operations + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/local-data-sources-migration.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/local-data-sources-migration.md new file mode 100644 index 0000000000..315732e952 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/local-data-sources-migration.md @@ -0,0 +1,50 @@ +--- + +id: local-data-sources-migration +title: Local Data Sources Migration Guide + +--- + +Starting with ToolJet version 3.0.0, **Local Data Sources** have been fully discontinued. These were deprecated in earlier versions, and now support for them has been completely removed. This guide will help you migrate your queries that were connected to Local Data Sources to the new **Data Sources**. + +## Migration Process for Existing ToolJet 3.0.0 Users + +After upgrading to ToolJet 3.0.0, any queries connected to Local Data Sources will display an error message indicating that the Local Data Source is no longer supported. Follow these steps to resolve this issue: + +## Step-by-Step Migration Guide: + +### 1. Identify Queries with Errors: + 1. Navigate to the app where you were using Local Data Sources. + 2. Expand the Query Manager. + 3. Look for queries showing an error message related to Local Data Sources. These queries will only display the error message and the rest of content will be hidden. + +
    +Identify Queries with Errors +
    + +### 2. Create a New Data Source: + 1. Navigate to the **Data Sources** section. + 2. Create a new Data Source of the same type (e.g., if you were using a PostgreSQL Local Data Source, create a PostgreSQL Data Source). + 3. Fill in the correct required details and save the new Data Source. + +
    +Create a New Data Source +
    + +### 3. Reconnect Your Queries: + 1. Return to your app where the queries were previously using Local Data Sources. + 2. Open the query that was showing an error. + 3. You will see a dropdown under the **Source** field. + 4. Select the newly created Data Source of the same type from the dropdown. + 5. Your query will now be reconnected and functional. + +
    +Reconnect Query with Data Source +
    + +### 4. Test Your Queries: + 1. Run each updated query to ensure everything is working as expected. + +
    +Test Your Queries +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/mailgun.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mailgun.md new file mode 100644 index 0000000000..8c966906c7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mailgun.md @@ -0,0 +1,63 @@ +--- +id: mailgun +title: Mailgun +--- + +ToolJet can connect to your Mailgun account to send emails. + +:::info +The Mailgun API Datasource supports for interaction with the mail endpoint of the [Mailgun API](https://documentation.mailgun.com/en/latest/api-intro.html#authentication-1). +::: + +
    + +## Connection + +To establish a connection with the **Mailgun** data source, 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 requires the following to connect to your Mailgun: +- **API key** + +ToolJet - Data source - Mailgun + +:::tip +Mailgun API key is required to create an Mailgun datasource on ToolJet. You can generate API key by visiting [Mailgun account page](https://app.mailgun.com/app/account/security/api_keys). +::: + +
    + +
    + +## Supported Operations + +### Email Service + +#### Required parameters: + +- **Send email to** +- **Send email from** +- **Subject** +- **Body as text** + +#### Optional parameters: + +- **Body as HTML** + +ToolJet - Data source - Mailgun Query + +:::info +**Send mail to** - accepts a single email id. +For example: +`{{"dev@tooljet.io"}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. + +**Send multiple individual emails to multiple recipients** - set Multiple recipients field to `{{true}}` and the `Send mail to` field will be split into multiple emails and send to each recipient. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/mariadb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mariadb.md new file mode 100644 index 0000000000..9e1e7abcfb --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mariadb.md @@ -0,0 +1,192 @@ +--- +id: mariadb +title: MariaDB +--- + +ToolJet can connect to both self-hosted and cloud-based MariaDB servers to read and write data. + +
    + +## Connection + +To establish a connection with the MariaDB global datasource, you can either click on the **+ Add new global datasource** button located on the query panel or navigate to the **[Global Datasources](/docs/data-sources/overview)** page through the ToolJet dashboard. + +**ToolJet requires the following connection details to connect to MariaDB:** + +- **Host:** The hostname or IP address of the MariaDB server. +- **Username:** The username for the MariaDB account. +- **Password:** The password for the MariaDB account. +- **Connection Limit:** The maximum number of concurrent connections allowed to the MariaDB server. +- **Port:** The port number of the MariaDB server. +- **Database:** The name of the database that you want to connect to. +- **SSL:** Whether or not to use SSL to connect to the MariaDB server. +- **SSL Certificate:** There are three options for the SSL Certificate connection detail: + - **CA Certificate:** This option allows you to use a certificate issued by a Certificate Authority (CA). This is the most secure option, as it ensures that the identity of the MariaDB server has been verified by a trusted third party. + - **Self-Signed Certificate:** This option allows you to use a self-signed certificate. This is less secure than using a CA certificate, as it does not ensure the identity of the MariaDB server has been verified by a trusted third party. However, it is a good option if you do not have access to a CA certificate. + - **None:** This option does not use SSL. This is the least secure option, as it allows anyone to intercept your communications with the MariaDB server. + +MariaDB + +
    + +
    + +## Querying MariaDB + +Once you have connected to the MariaDB datasource, follow these steps to write queries and interact with a MariaDB database from the ToolJet application: + +1. Click the **+ Add** button to open the list of available datasources. +2. Select **MariaDB** from the global datasource section. +3. Enter the SQL query in the editor. +4. Click **Preview** to view the data returned from the query or click **Run** to execute the query. + +:::tip +Query results can be transformed using Transformation. For more information on transformations, please refer to our documentation at **[link](/docs/tutorial/transformations)**. +::: + +
    + +MariaDB query + +
    + +
    + +
    + +## CRUD Queries + +Suppose there exists a MariaDB database named *customers*. We can create an example table called *users* with the following columns: + +- **id** (integer, auto-increment) +- **name** (varchar) +- **age** (integer) +- **email** (varchar) + +```sql +CREATE TABLE user( + id INT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50), + age INT, + email VARCHAR(100) +); +``` + +The above command will create the *users* table within the *customers* database. Now, let's explore the CRUD commands for this table in MariaDB: + +### Create (Insert) + +#### To Insert a Single User: + +```sql +INSERT INTO user (name, age, email) +VALUES ('John Doe', 25, 'john@example.com'); +``` + +
    + +MariaDB query + +
    + +#### To Insert Multiple Users: + +```sql +INSERT INTO user (name, age, email) +VALUES + ('John Doe', 25, 'john@example.com'), + ('Jane Smith', 30, 'jane@example.com'), + ('Bob Johnson', 35, 'bob@example.com'); +``` + +
    + +MariaDB query + +
    + +### Read (Select) + +#### To Retrieve All Users: + +```sql +SELECT * FROM user; +``` + +
    + +MariaDB query + +
    + +#### To Retrieve Specific Columns From Users: + +```sql +SELECT name, age, email FROM user; +``` + +
    + +MariaDB query + +
    + +#### To Add Conditions and Filters to the Selection: + +```sql +SELECT name, age, email +FROM user +WHERE age > 25; +``` + +
    + +MariaDB query + +
    + +### Update + +#### To Update the Age of a User: + +```sql +UPDATE user +SET age = 26 +WHERE id = 1; +``` + +
    + +MariaDB query + +
    + +### Delete + +#### To Delete a User: + +```sql +DELETE FROM user WHERE id = 1; +``` + +
    + +MariaDB query + +
    + +Remember to adjust the values and conditions based on your specific needs. These commands will allow you to create the table, insert data, retrieve data, update data, and delete data in the *users* table in MariaDB. + +
    + +
    + +## Troubleshooting Tips +If you are having trouble connecting a MariaDB data source to ToolJet, try the following: +- Make sure that your MariaDB server is running and accessible from the ToolJet server. +- 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://tooljet.com/slack) for assistance. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/minio.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/minio.md new file mode 100644 index 0000000000..36faeeca6e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/minio.md @@ -0,0 +1,135 @@ +--- +id: minio +title: MinIO +--- + +ToolJet can connect to minio and perform various operation on them. + +
    + +## Connection + +To establish a connection with the MinIo data source, 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 requires the following to connect to your DynamoDB: + +- **Host** +- **Port** +- **Access key** +- **Secret key** + +miniIo connect + +
    + +
    + +## Querying Minio + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the data source added in the previous step as the data source. +3. Select the operation that you want to perform. +4. Click on the **Run** button to run the query + +miniIo query + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +
    + +
    + +## Supported Operations + +- **[Read object](#read-object)** +- **[Put object](#put-object)** +- **[Remove object](#remove-object)** +- **[List buckets](#list-buckets)** +- **[List objects in a bucket](#list-objects-in-a-bucket)** +- **[Presigned url for download](#presigned-url-for-download)** +- **[Presigned url for upload](#presigned-url-for-upload)** + +minIo Operations + +### Read Object + +Retrieve an object from a bucket. + +#### Required Parameter: +- **Bucket** +- **Object Name** + +minIo read object + +### Put Object + +Upload or update an object in a bucket. + +#### Required Parameter: +- **Bucket** +- **Object Name** +- **Upload data** + +#### Optional Parameter: +- **Content Type** + +minIo put object + +### Remove Object + +Delete an object from a bucket. + +#### Required Parameter: +- **Bucket** +- **Object Name** + +minIo remove object + +### List Buckets + +Retrieve a list of all buckets. + +minIo list bucket + +### List Objects in a Bucket + +List objects within a specified bucket. + +#### Required Parameters +- **Bucket** + +#### Optional Parametes +- **Prefix** + +minIo list objects in a bucket + +### Presigned URL for Download + +Generate a presigned URL for downloading an object. + +#### Required Parameter: +- **Bucket** +- **Object Name** + +#### Optional Parameter: +- **Expires in** + +minIo presigned url for download + +### Presigned URL for Upload + +Generate a presigned URL for uploading an object. + +#### Required Parameter: +- **Bucket** +- **Object Name** + +#### Optional Parameter: +- **Expires in** + +minIo presigned url for download + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/mongodb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mongodb.md new file mode 100644 index 0000000000..6a64b3f090 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mongodb.md @@ -0,0 +1,534 @@ +--- +id: mongodb +title: MongoDB +--- + +ToolJet can connect to MongoDB to read and write data. + +
    + +## Manual Connection + +To establish a manual connection with the **MongoDB** data source, 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. + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. +::: + +ToolJet requires the following to connect to your MongoDB. + +- **Host** +- **Port** +- **Username** +- **Password** + +**Note:** It is recommended to create a new MongoDB user so that you can control the access levels of ToolJet. + +ToolJet - Mongo connection + +### Secure Sockets Layer (SSL) + +- **SSL Certificate**: SSL certificate to use with MongoDB. Supported Types: + - **None**: No SSL certificate verification. + - **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. + +MongoDB - SSL Certificate + +
    + +
    + +## Connect Using Connecting String + +You can also use a **Connection String** by switching the method from the dropdown. You will be prompted to enter the details of your MongoDB connection. + +ToolJet requires the following to connect to your MongoDB using Connecting String: +- **Connection String** + +:::info +The connection string typically looks like this: `mongodb+srv://${username}:${password}@${cluster}/{database}`. + +For example: `mongodb+srv://tooljettest:dummypassword@cluster0.urul7.mongodb.net/hrms` +::: + +ToolJet - Mongo connection + +**Note:** Make sure to replace username, password, cluster, and database with your actual MongoDB details. If your MongoDB instance requires additional connection options, you can usually append these options to the connection string. + +
    + +
    + +## Querying MongoDB + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor and select the database added in the previous step as the data source. +2. Select the operation that you want to perform and click **Save** to save the query. +3. Click on the **Run** button to run the query. + +ToolJet - Mongo query + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +
    + +## Supported Operations + +- **[List Collections](#list-collections)** +- **[Find One](#find-one)** +- **[Find Many](#find-many)** +- **[Total Count](#total-count)** +- **[Count](#count)** +- **[Distinct](#distinct)** +- **[Insert One](#insert-one)** +- **[Insert Many](#insert-many)** +- **[Update One](#update-one)** +- **[Update Many](#update-many)** +- **[Replace One](#replace-one)** +- **[Find One and Update](#find-one-and-update)** +- **[Find One and Replace](#find-one-and-replace)** +- **[Find One and Delete](#find-one-and-delete)** +- **[Aggregate](#aggregate)** +- **[Delete One](#delete-one)** +- **[Delete Many](#delete-many)** +- **[Bulk Operations](#bulk-operations)** + +### List Collections + +Returns list of collections + +ToolJet - Mongo DB List Collection + +### Find One + +Return a document which satisfy the given filter and options. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/findOne) + +#### Required Parameters: +- **Collection** + +#### Optional Parameters: +- **Filter** +- **Option** + +ToolJet - Mongo DB Find One + +### Find Many + +Return list of documents which satisfy the given filter and options. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/find/) + +#### Required Parameters: +- **Collection** + +#### Optional Parameters: +- **Filter** +- **Option** + +ToolJet - Mongo DB Find Many + +### Total Count + +Returns an estimation of the number of documents in the collection based on collection metadata. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#estimateddocumentcount) + +#### Required Parameters: +- **Collection** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Total Count + +### Count + +Returns the number of documents based on the filter. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#countdocuments) + +#### Required Parameters: +- **Collection** + +#### Optional Parameters: +- **Filter** +- **Option** + +ToolJet - Mongo DB Count + +### Distinct + +Retrieve a list of distinct values for a field based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/distinct/) + +#### Required Parameters: +- **Collection** +- **Field** + +#### Optional Parameters: +- **Filter** +- **Option** + +ToolJet - Mongo DB Find One + +### Insert One + +Insert a document. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/insertOne/) + +#### Required Parameters: +- **Collection** +- **Document** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Insert One + +#### Example: +```json +{ + "name": "John Doe", + "age": 30 +} +``` + +### Insert Many + +Insert list of documents. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/insertMany/) + +#### Required Parameters: +- **Collection** +- **Document** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Insert Many + +#### Example +```json +[ + { + "name": "Product1", + "price": 100 + }, + { + "name": "Product2", + "price": 150 + } +] +``` + +### Update One + +Update a document based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/updateOne/) + +#### Required Parameters: +- **Collection** +- **Filter** +- **Update** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Update One + +#### Example +##### Filter +```json +{ + "name": "John Doe" +} +``` + +##### Update +```json +{ + "$set": { + "age": 31 + } +} +``` + +### Update Many + +Update many documents based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/updateMany/) + +#### Required Parameters: +- **Collection** +- **Filter** +- **Update** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Update Many + +#### Example +##### Filter +```json +{ + "status": "pending" +} +``` + +##### Update +```json +{ + "$set": { + "status": "completed" + } +} +``` + +### Replace One + +Replace a document based on filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/replaceOne/) + +#### Required Parameters: +- **Collection** +- **Filter** +- **Replacement** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Find One + +#### Example +##### Filter +```json +{ + "product_id": 123 +} +``` + +##### Replacement +```json +{ + "product_id": 123, + "name": "New Product", + "price": 200 +} +``` + +### Find One and Update + +If your application requires the document after updating, use this instead of **Update One**. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneandupdate) + +#### Required Parameters: +- **Collection** +- **Filter** +- **Update** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Find One and Update + +#### Example +##### Filter +```json +{ + "employee_id": 456 +} +``` + +##### Update +```json +{ + "$inc": { + "salary": 5000 + } +} +``` + +### Find One and Replace + +If your application requires the document after updating, use this instead of **Replace One**. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneandreplace) + +#### Required Parameters: +- **Collection** +- **Filter** +- **Replacement** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Find One and Replace + +#### Example +##### Filter +```json +{ + "product_id": 789 +} +``` + +##### Replacement +```json +{ + "product_id": 789, + "name": "Updated Product", + "price": 300 +} +``` + +### Find One and Delete + +If your application requires the document after deleting, use this instead of **Delete One**. [Reference](https://mongodb.github.io/node-mongodb-native/4.0/classes/collection.html#findoneanddelete) + +#### Required Parameters: +- **Collection** +- **Filter** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Find One and Delete + +#### Example +```json +{ + "order_id": 101 +} +``` + +### Aggregate + +Aggregation operations are expressions you can use to produce reduced and summarized results. [Reference](https://docs.mongodb.com/drivers/node/v4.0/fundamentals/aggregation/) + +#### Required Parameters: +- **Collection** +- **Pipeline** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Aggregate + +#### Example +```json +[ + { + "$match": { + "status": "completed" + } + }, + { + "$group": { + "_id": "$product_id", + "totalSales": { + "$sum": "$amount" + } + } + } +] +``` + +### Delete One + +Delete a record based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/deleteOne/) + +#### Required Parameters: +- **Collection** +- **Filter** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Find One + +#### Example +```json +{ + "user_id": 123 +} +``` + +### Delete Many + +Delete many records based on the filter. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/deleteMany/) + +#### Required Parameters: +- **Collection** +- **Filter** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Find One + +#### Example +```json +{ + "status": "cancelled" +} +``` + +### Bulk Operations + +Perform bulk operations. [Reference](https://docs.mongodb.com/drivers/node/v4.0/usage-examples/bulkWrite/) + +#### Required Parameters: +- **Collection** +- **Operations** + +#### Optional Parameters: +- **Option** + +ToolJet - Mongo DB Bulk Operations + +#### Example +```json +[ + { + "insertOne": { + "document": { + "item": "apple", + "quantity": 50 + } + } + }, + { + "updateOne": { + "filter": { + "item": "orange" + }, + "update": { + "$set": { + "quantity": 100 + } + } + } + }, + { + "deleteOne": { + "filter": { + "item": "banana" + } + } + } +] +``` + +
    + +
    + +## Dynamic Queries + +Dynamic queries in MongoDB can be used to create flexible and parameterized queries. + +#### Example + +```javascript +{ amount: { $lt: '{{ components.textinput1.value }}' }} + +// Dates +// supported: Extended JSON syntax +{ createdAt: { $date: '{{ new Date('01/10/2020') }}'} } +// not supported: MongoDB classic syntax +{ createdAt: new Date('01/10/2020') } +``` + +Reference on [mongodb extended JSON](https://docs.mongodb.com/manual/reference/mongodb-extended-json/) supported data types. + +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/mssql.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mssql.md new file mode 100644 index 0000000000..0d427cad57 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mssql.md @@ -0,0 +1,129 @@ +--- +id: mssql +title: MS SQL Server / Azure SQL Databases +--- + +ToolJet can connect to MS SQL Server & Azure SQL databases to read and write data. + +
    + +## Connection + +To establish a connection with the MS SQL Server data source, 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. + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. +::: + +ToolJet requires the following to connect to your PostgreSQL database. + +- **Host** +- **Port** +- **Username** +- **Password** +- **Connection Options** +- **Azure** (Select this option if you are using Azure SQL databases) + +**Note:** It is recommended to create a new database user so that you can control the access levels of ToolJet. + +ToolJet - Redis connection + +### Connection Options + +You can add optional configurations in **key-value pairs** for the MS SQL data source connection. + +#### Example: +| Key | Value | +|:--------------------------|:--------| +| trustServerCertificate| true | + +These options allow you to fine-tune the connection, such as enabling encryption when using a self-signed certificate. + +### Enabling Encryption with a Self-Signed Certificate + +To enhance security during data transfer, encryption can be enabled even with a self-signed certificate. + +#### Server-Side Configuration +1. **Create and Install a Self-Signed Certificate:** + - Generate a self-signed certificate and install it on the SQL Server instance. +2. **Force Encryption:** + - Configure the SQL Server instance to force encrypted connections. + - For Azure SQL databases, turn on the **Encryption** toggle in the Azure portal. + +#### Client-Side Configuration +1. Set the connection option `trustServerCertificate` to `true`. + - This bypasses certificate chain validation and is necessary when using a self-signed certificate. + +
    + +
    + +## Querying SQL Server / Azure SQL Databases + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the database added in the previous step as the data source. + +Once the SQL data source is added, you can create queries to read and write data to the database. You can create queries from the **[Query Panel](/docs/app-builder/query-panel#query-manager)** located at the bottom panel of the app builder. + +### SQL Mode + +SQL mode can be used to query MS SQL Server / Azure SQL Databases using SQL queries. + +1. Select **SQL mode** from the dropdown. +2. Enter the SQL query in the editor. +3. Click on the **Run** button to run the query. + +#### Example +```sql +SELECT * FROM users +``` + +ToolJet mssql sql mode + +#### Parameterized queries: + +ToolJet offers support for parameterized SQL queries, which enhance security by preventing SQL injection and allow for dynamic query construction. To implement parameterized queries: + +1. Use `:parameter_name` as placeholders in your SQL query where you want to insert parameters. +2. In the **Parameters** section below the query editor, add key-value pairs for each parameter. +3. The keys should match the parameter names used in the query (without the colon). +4. The values can be static values or dynamic values using the `{{ }}` notation. + +
    +Postgresql parameterized SQL queries +
    + +##### Example: +```yaml +Query: SELECT * FROM users WHERE username = :username +SQL Parameters: + Key: username + Value: oliver // or {{ components.username.value }} +``` + +#### Query Timeout + +You can set the timeout duration for SQL queries by adding the `PLUGINS_SQL_DB_STATEMENT_TIMEOUT` variable to the environment configuration file. By default, it is set to 120,000 ms. + +### GUI Mode + +GUI mode can be used to query MS SQL Server / Azure SQL Databases without writing queries. + +1. Select **GUI mode** from the dropdown. +2. Choose the operation **Bulk update using the primary key**. +3. Enter the **Table** name and **Primary key** column name. +4. In the editor, enter the records in the form of an array of objects. +5. Click on the **Run** button to run the query. + +#### Example +```json +{{ [ {id: 1, channel: 33}, {id: 2, channel: 24} ] }} +``` + +ToolJet mssql gui mode + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: [link](/docs/tutorial/transformations) +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/mysql.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mysql.md new file mode 100644 index 0000000000..9b0923fb4b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/mysql.md @@ -0,0 +1,137 @@ +--- +id: mysql +title: MySQL +--- + +ToolJet can connect to MySQL databases to read and write data. + +
    + +## Connection + +To establish a connection with the MySQL 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. + +
    + +MySQL data source + +
    +
    + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. +::: + +**ToolJet requires the following to connect to your MySQL database:** + +- **Username** +- **Password** +- **Database Name** +- **Connection Type** + +If you are using **Hostname** as the connection type, you will need to provide the following information: + +- **Host/IP** +- **Port** +- **SSL** +- **SSL Certificate**: + - **CA Certificate** + - **Self-signed Certificate** + - **None** + +If you are using **Socket** as the connection type, you will need to provide the following information: + +- **Socket Path** + +**Note:** It is recommended to create a new MySQL database user so that you can control the access levels of ToolJet. + +
    + +mysql + +
    + +
    + +
    + +## Querying MySQL + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the database added in the previous step as the data source. + +Once the MySQL data source is added, you can create queries to read and write data to the database. You can create queries from the **[Query Panel](/docs/app-builder/query-panel#query-manager)** located at the bottom panel of the app builder. + +### SQL Mode + +SQL mode can be used to query MySQL database using SQL queries. + +1. Select **SQL mode** from the dropdown. +2. Enter the SQL query in the editor. +3. Click on the **Run** button to run the query. + +**Example:** + +```sql +SELECT * FROM users +``` + +
    + +mysql + +
    + +#### Parameterized queries: + +ToolJet offers support for parameterized SQL queries, which enhance security by preventing SQL injection and allow for dynamic query construction. To implement parameterized queries: + +1. Use `:parameter_name` as placeholders in your SQL query where you want to insert parameters. +2. In the **Parameters** section below the query editor, add key-value pairs for each parameter. +3. The keys should match the parameter names used in the query (without the colon). +4. The values can be static values or dynamic values using the `{{ }}` notation. + +
    +mysql +
    + +##### Example: + +```yaml +Query: SELECT * FROM users WHERE username = :username +SQL Parameters: + Key: username + Value: oliver // or {{ components.username.value }} +``` + +#### Query Timeout + +You can set the timeout duration for SQL queries by adding the `PLUGINS_SQL_DB_STATEMENT_TIMEOUT` variable to the environment configuration file. By default, it is set to 120,000 ms. + +### GUI Mode + +GUI mode can be used to query MySQL database without writing queries. + +1. Select **GUI mode** from the dropdown. +2. Choose the operation **Bulk update using primary key**. +3. Enter the **Table** name and **Primary key column** name. +4. In the editor enter the records in the form of an array of objects. +5. Click on the **Run** button to run the query. + +**Example:** + +```json +{{ [ {id: 1, channel: 33}, {id:2, channel:24} ] }} +``` + +
    + +mysql + +
    + +:::tip +Query results can be transformed using transformations. Learn more about transformations [here](/docs/tutorial/transformations). +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/n8n.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/n8n.md new file mode 100644 index 0000000000..efdc669060 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/n8n.md @@ -0,0 +1,73 @@ +--- +id: n8n +title: n8n +--- + +ToolJet can trigger n8n workflows using webhook URLs. Please refer [this](https://docs.n8n.io/) to know more about n8n. + +
    + +## Connection + +To establish a connection with the n8n data source, 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. + +Webhooks in n8n can be configured to operate with or without **Authentication**. If no authentication is required, select `None` as the **Authentication type**. For webhooks that require authentication, choose the appropriate method from the dropdown and provide the corresponding credentials. + +### Authentication Types +- **Basic Auth**: To connect your n8n webhooks using basic auth you'll need to provide the following credentials: + - **Username** + - **Password** + +
    + +n8n basicauth + +
    + +- **Header Auth**: To connect your n8n webhooks using header auth the following fields are required: + - **Name / Key** + - **Value** + +
    + +n8n headerauth + +
    + +:::tip +Webhook credentials and instance credentials are different. Please use the credentials that you use with the webhook trigger. Know more: **[Webhook Authentication](https://docs.n8n.io/nodes/n8n-nodes-base.webhook/#:~:text=then%20gets%20deactivated.-,Authentication,-%3A%20The%20Webhook%20node)**. +::: + +
    + +
    + +## Trigger Workflow + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the database added in the previous step as the data source. + +Once the n8n data source is added, you can trigger a workflow with `GET/POST` URL. + +### GET Method + +Choose the GET Method from the dropdown. + +#### Optional Parameter: + - **URL parameters** + +n8n query + +### POST Method + +Choose the POST Method from the dropdown. + +#### Required Parameter: + - **Body** + +#### Optional Parameter: + - **URL parameters** + +n8n query + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/notion.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/notion.md new file mode 100644 index 0000000000..5e281ad038 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/notion.md @@ -0,0 +1,463 @@ +--- +id: notion +title: Notion +--- + +ToolJet can connect to a Notion workspace to do operations on notion pages, databases, users and blocks. + +
    + +## Connection + +To establish a connection with the Notion data source, 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. + +For integrating Notion with ToolJet we will need the API token. The API token can be generated from your Notion workspace settings. Read the official Notion docs for [Creating an internal integration with notion API](https://www.notion.so/help/create-integrations-with-the-notion-api). + +
    + +notion api + +
    + +
    + +
    + +## Querying Notion + +Notion API provides support for: + +- **[Database](#querying-notion-database)** +- **[Page](#querying-notion-page)** +- **[Block](#querying-notion-blocks)** +- **[User](#querying-notion-user)** + +notion querying + +:::info +**Database ID**, **View ID** and **Page ID** can be found using notion workspace URL. + +For example: + +URL: `https://www.notion.so/workspace/XXX?v=YYY&p=ZZZ` + +Here: +- `XXX` is the **Database ID** +- `YYY` is the **View ID** +- `ZZZ` is the **Page ID** + +::: + +:::tip + +Before querying Notion, you must share the database with your integration. Click the share button in your database view, find your integration name select it. + +notion share + +::: + +
    + +
    + +## Querying Notion Database + +On database resource you can perform the following operations: + +- **[Retrieve a database](#retrieve-a-database)** +- **[Query a database](#query-a-database)** +- **[Create a database](#create-a-database)** +- **[Update a database](#update-a-database)** + +notion db + +### Retrieve a Database + +This operations retrieves a Database object using the ID specified. + +#### Required Parameters: + +- **Database ID** + +notion db retrieve + +### Query a Database + +This operation gets a list of **Pages** contained in the database, filtered and ordered according to the filter conditions and sort criteria provided in the query. + +#### Required Parameters: + +- **Database ID** + +#### Optional Parameters: + +- **Filter** +- **Sort** +- **Limit** +- **Start Cursor** + +notion db query + +### Create a Database + +This operation creates a database as a subpage in the specified parent page, with the specified properties. + +#### Required Parameters: + +- **Database ID** +- **Page ID** +- **Properties** + +#### Optional Parameters: + +- **Title** +- **Icon type** +- **Icon value** +- **Cover type** +- **Cover value** + +notion db create + +#### Example: +##### Title +```yaml +[ + { + "type": "text", + "text": { + "content": "Project Tasks Database", + "link": null + } + } +] +``` + +##### Properties +```yaml +{ + "Task Name": { + "title": {} + }, + "Due Date": { + "date": {} + }, + "Completed": { + "checkbox": {} + } +} +``` + +### Update a Database + +This operation updates an existing database as specified by the parameters. + +#### Required Parameters: + +- **Database ID** + +#### Optional Parameters: + +- **Title** +- **Properties** +- **Icon type** +- **Icon value** +- **Cover type** +- **Cover value** + +notion db update + +#### Example: +##### Title +```yaml +[ + { + "type": "text", + "text": { + "content": "Updated Tasks Database" + } + } +] +``` + +##### Properties +```yaml +{ + "Priority": { + "select": { + "options": [ + { "name": "High", "color": "red" }, + { "name": "Medium", "color": "yellow" }, + { "name": "Low", "color": "green" } + ] + } + }, + "Assigned To": { + "people": {} + } +} +``` + +
    + +
    + +## Querying Notion Page + +On page resource you can perform the following operations: + +- **[Retrieve a page](#retrieve-a-page)** +- **[Create a page](#create-a-page)** +- **[Update a page](#update-a-page)** +- **[Retrieve a page property](#retrieve-a-page-property-item)** +- **[Archive a page](#archive-delete-a-page)** + +notion page + +### Retrieve a Page + +This operation retrieves a **Page** object using the ID specified. + +#### Required Parameters: + +- **Page ID** + +notion page retrieve + +### Create a Page + +This operation creates a new page in the specified database or as a child of an existing page. If the parent is a database, the property values of the new page in the properties parameter must conform to the parent database's property schema. If the parent is a page, the only valid property is title. + +#### Required Parameters: + +- **Parent Type** +- **Page/Database ID** +- **Properties** + +#### Optional Parameters: +- **Children (Blocks)** +- **Icon type** +- **Icon value** +- **Cover type** +- **Cover value** + +notion page create + +#### Example: +```yaml +{ + "Title": { + "title": [ + { + "type": "text", + "text": { + "content": "New Page Title" + } + } + ] + } +} +``` + +### Update a Page + +This operation updates page property values for the specified page. Properties that are not set via the properties parameter will remain unchanged. + +#### Required Parameters: + +- **Page ID** +- **Properties** + +#### Optional Parameters + +- **Icon type** +- **Icon value** +- **Cover type** +- **Cover value** + +notion page update + +#### Example: +```yaml +{ + "Title": { + "title": [ + { + "type": "text", + "text": { + "content": "Updated Page Title" + } + } + ] + }, + "Status": { + "select": { + "name": "In Progress" + } + } +} +``` + +### Retrieve a Page Property Item + +This operation retrieves a property_item object for a given page ID and property ID. Depending on the property type, the object returned will either be a value or a paginated list of property item values. See Property item objects for specifics. + +#### Required Parameter: + +- **Page ID** + +#### Optional Parameters: + +- **Property ID** +- **Limit** +- **Start cursor** + +notion page retrieve page property + +### Archive (delete) a Page + +This operation archive or un archive the page specified using Page ID. + +#### Required Parameters: + +- **Page ID** +- **Archive** + +notion page retrieve page property + +
    + +
    + +## Querying Notion Blocks + +The following operations can be performed on the block resource: + +- **[Retrieve a block](#retrieve-a-block)** +- **[Append block children](#append-new-block-children)** +- **[Retrieve block children](#retrieve-block-children)** +- **[Update a block](#update-a-block)** +- **[Delete a block](#delete-a-block)** + +notion block + +:::info +To get the id for blocks, simply click on the menu icon for the block and click "Copy link". Afterwards, paste the link in the browser and it should look like this: `https://www.notion.so/Creating-Page-Sample-ee18b8779ae54f358b09221d6665ee15#7fcb3940a1264aadb2ad4ee9ffe11b0e` the string after **#** is the block id i.e. `7fcb3940a1264aadb2ad4ee9ffe11b0e`. +::: + +### Retrieve a Block + +This operation retrieves a **Block** object using the ID specified. + +#### Required parameters: + +- **Block ID** + +notion block retrieve + +### Append New Block Children + +This operation creates and appends new children blocks to the parent block_id specified. + +#### Required parameters: + +- **Block ID** +- **Children** + +notion block append + +### Retrieve Block Children + +This operation retrieves a paginated array of child block objects contained in the block using the ID specified. + +#### Required parameters: + +- **Block ID** + +#### Optional Parameters: + +- **Limit** +- **Start cursor** + +notion block append + +### Update a Block + +This operation updates the content for the specified block_id based on the block type. + +#### Required parameters: + +- **Block ID** + +#### Optional Parameters: + +- **Properties** +- **Archive** + +notion block update + +#### Example +```yaml +{ + "Title": { + "title": [ + { + "type": "text", + "text": { + "content": "Updated Page Title" + } + } + ] + }, + "Status": { + "select": { + "name": "In Progress" + } + } +} +``` + +### Delete a Block + +#### Required Parameters: + +- **Block ID** + +notion block delete + +
    + +
    + +## Querying Notion User + +The following operations can be performed on the user notion resource: + +- **[Retrieve a user from current workspace](#retrieve-a-user-from-current-workspace)** +- **[Retrieve list of users of a workspace](#retrieve-list-of-users-of-a-workspace)** + +notion user + +### Retrieve a User From Current Workspace + +This operation retrieves a User using the ID specified. + +#### Required Parameters: + +- **User ID** + +notion user retrieve a user + +### Retrieve List of Users of a Workspace + +This operation returns a paginated list of Users for the workspace. + +#### Optional Parameters: + +- **Limit** +- **Start cursor** + +notion user list all user + +[Read more about notion API](https://developers.notion.com/reference/intro) + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/openapi.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/openapi.md new file mode 100644 index 0000000000..427c3e94ca --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/openapi.md @@ -0,0 +1,42 @@ +--- +id: openapi +title: OpenAPI +--- + +OpenAPI is a specification for designing and documenting RESTful APIs. Using OpenAPI datasource, ToolJet can generate REST API operations from OpenAPI Specs. + +
    + +## Connection + +To establish a connection with the OpenAPI datasource, 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. + +Connections are created based on OpenAPI specifications. The available authentication methods currently supported are Basic Auth, API Key, Bearer Token, and OAuth 2.0. It is also possible to use specifications that require multiple authentications. Learn more [here](https://swagger.io/docs/specification/authentication/). + +:::info +OpenAPI datasource accepts specifications only in **JSON** and **YAML** formats. +::: + +OpenAPI + +
    + +
    + +## Querying OpenAPI + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **OpenAPI** datasource added in previous step. +3. Select the desired operation. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +**Note**: Operations will be automatically generated from the specifications, and each operation will be distinct from others. + +### Fields + +- **Host** +- **Operation** + +OpenAPI + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/oracledb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/oracledb.md new file mode 100644 index 0000000000..b38728d2ef --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/oracledb.md @@ -0,0 +1,113 @@ +--- +id: oracledb +title: Oracle DB +--- + +ToolJet can connect to Oracle databases to read and write data. + +
    + +## Connection + +To establish a connection with the OracleDB datasource, 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 requires the following to connect to a OracleDB datasource: + +- **Host** +- **Port** +- **SID / Service Name** (Database name must be a SID / Service Name) +- **Database Name** +- **SSL** +- **Username** +- **Password** +- **Client Library Path** + +ToolJet - Data source - OracleDB + +:::info +ToolJet includes Oracle Instant Client versions 21.10 and 11.2. If you need to use a different client library version: +- For cloud deployments: You can add a custom client library to a directory of your choice or mount it as a volume in the container. +- For local setups: You can specify the path to your custom Oracle Client Library. + +This allows ToolJet to locate and use the specific drivers for Oracle database connections. +::: + +### Client Versions and Compatibility + +ToolJet runs Oracle DB connections in thick mode. By default, ToolJet includes Oracle instant client versions 21.10 and 11.2. These client versions determine which Oracle Database versions you can connect to. + +#### Available Client Versions +- Oracle Instant Client 21.10 +- Oracle Instant Client 11.2 + +#### Compatibility +The instant client version affects which Oracle Database versions you can connect to: + +- Oracle Instant Client 21.10 is compatible with Oracle Database 11.2 and later versions. +- Oracle Instant Client 11.2 is compatible with Oracle Database 10.2 and later versions. + + +
    + +
    + +## Querying Oracle DB + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **OracleDB** datasource added in previous step. +3. Select the desired query mode. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +
    + +
    + +## Supported Operations + +- **[SQL mode](/docs/data-sources/oracledb#sql-mode)** +- **[GUI mode](/docs/data-sources/oracledb#gui-mode)** + +ToolJet - Data source - OracleDB + +### SQL mode + +SQL mode can be used to write raw SQL queries. + +```sql +SELECT first_name, last_name, email +FROM employees +WHERE department_id = 10 +ORDER BY last_name; +``` + +ToolJet - Data source - OracleDB + +### GUI mode + +GUI mode can be used to query Oracle database without writing queries. + +1. Select GUI mode from the dropdown. +2. Choose the operation **Bulk update using primary key**. +3. Enter the **Table** name and **Primary key** column name. +4. In the editor, enter the records in the form of an array of objects. + +```json +[ + { + "id": 1, + "channel": 33 + }, + { + "id": 2, + "channel": 24 + } +] +``` + +ToolJet - Data source - OracleDB + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/overview.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/overview.md new file mode 100644 index 0000000000..ff485a7209 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/overview.md @@ -0,0 +1,144 @@ +--- +id: overview +title: Overview +--- + +# Data Sources : Overview + +Data Sources pull in and push data to any source including databases, external APIs, or services. Once a data source is connected to a workspace, the connection can be shared with any app of that workspace. + +:::caution +Data Source page is available only on **ToolJet version 2.3.0 and above**. +::: + +
    + +Data Sources: Overview + +
    + +## Connecting data sources + +1. **Create a new app** from the dashboard, and Click on the **+ Add new** button from the query panel. +
    + + Data Sources: Overview + +
    + + Or you can directly go to the **Data Sources** page from the left sidebar of the dashboard. + +2. Within the **Data Sources** page, you'll find various categories of data sources on the left side, including Databases, APIs, Cloud Storages, and plugins. Click on each category to view the list of accessible data sources. As you hover over the desired data source, an `Add` button will appear. Upon clicking this button, the selected data source will be integrated into the workspace. + +
    + + Overview of Data Sources + +
    + +3. Once the data source is added, you'll be required to input the configuration details for establishing a connection. + + ***Note: For paid plans, configuration entry and saving are necessary to enable availability across [multiple environments](/docs/development-lifecycle/environment/self-hosted/multi-environment).*** + +
    + + Overview of Data Sources + +
    + +4. Returning to the dashboard, proceed to generate a new application. The recently added data source will be accessible within the query panel under the **Available data sources** section. Data Sources that have been added can now be utilized in both **existing applications** and **newly created applications**. + +
    + + Overview of Data Sources + +
    + +5. At this point, you can create queries to the connected data sources. Within these queries, the option exists to switch between **distinct connections** associated with the same data source, in cases where multiple connections have been established. + +
    + + Overview of Data Sources + +
    + +## Default data sources + +By default, 4 data sources will be available on every app on ToolJet: +- **[ToolJet Database](/docs/tooljet-db/tooljet-database/)** +- **[RestAPI](/docs/data-sources/restapi/)** +- **[Run JavaScript Query](/docs/data-sources/run-js/)** +- **[Run Python Query](/docs/data-sources/run-py/)** + +
    + +Data Sources: Overview + +
    + +## User Permissions + +Changing the **Permissions** for Data Sources is a privilege reserved for **Admins** and **[Super Admins](/docs/user-management/role-based-access/super-admin)** within the workspace. + +To configure these permissions, navigate to **Workspace Settings** -> **Groups Settings**. Admins and Super Admins have the authority to assign the following permissions to user groups: + +
    + +#### Creation and Deletion of data sources within the workspace + +| Permission | Description | +|:---|:---| +| **Just Create** | Add new data sources and modify existing ones. Delete button will not be visible on hovering over the connected data source. | +| **Just Delete** | Remove connected data sources from the workspace. Delete button will show up on hovering over the connected data source. | +| **Both Create and Delete** | Add new data sources and remove connected data sources from the workspace. | +| **Neither Create nor Delete** | No access to the Data Sources page from the Dashboard. Error toast will popup on trying to access the Data Sources page using URL. | + +
    + +Data Sources: Overview + +
    + +
    + +#### Authorization to View or Edit permitted data sources from the data source page + +| Permission | Description | +|:---|:---| +| **View** | Connect to authorized data sources for their user group. Users can't update the credentials of authorized data sources. | +| **Edit** | Users can update the credentials of authorized data sources. | + +
    + +Data Sources: Overview + +
    + +
    + +## Changing scope of data sources on an app created on older versions of ToolJet + +On ToolJet versions below 2.3.0, the data source connection was made from within the individual apps. To make it backward compatible, we added an option to change the scope of the data sources and make it global data source. + +1. When dealing with apps that were created using ToolJet versions prior to 2.3.0, you will notice the presence of the data source manager in the left sidebar of the App Builder. +
    + + Data Sources: Overview + +
    + +2. To change the scope, locate the kebab menu situated next to the connected data source. From this menu, select the **change scope** option. +
    + + Data Sources: Overview + +
    + +3. Once you change the scope of the data source and make it global, you'll see that the **data source manager** is removed from the left sidebar and now you'll find the data source on the **query panel** under Global Data sources. You can now configure the data source from the Data Sources page on the **dashboard**. +3. Once you have successfully changed the scope of the data source, thereby transforming it into a global data source, you will observe that the **data source manager** from the left sidebar is removed. Subsequently, the data source will be accessible within the **query panel** under the Available data sources section. Now you can configure this data source from the Data Sources page located on the **Dashboard**. + +
    + + Data Sources: Overview + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/postgresql.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/postgresql.md new file mode 100644 index 0000000000..61c16427ac --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/postgresql.md @@ -0,0 +1,117 @@ +--- +id: postgresql +title: PostgreSQL +--- + +ToolJet has the capability to connect to PostgreSQL databases for data retrieval and modification. + +
    + +## Establishing a Connection + +To establish a connection with the PostgreSQL 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 PostgreSQL as the data source. + +ToolJet offers two connection types to connect to your PostgreSQL database: + +- **[Manual connection](#manual-connection)** +- **[Connection string](#connection-string)** + +### Manual Connection + +To connect to PostgreSQL using Manual connection parameters, select **Manual connection** as the connection type and provide the following details: + +- **Host** +- **Port** +- **SSL** +- **Database Name** +- **Username** +- **Password** +- **Connection Options** +- **SSL Certificate** + +PG connection + +### Connection String + +To connect to PostgreSQL using a connection string, select **Connection String** as the connection type and provide the following details: + +- **Connection String** + +PG connection string + +

    + +**Note:** We recommend creating a new PostgreSQL database user to have control over ToolJet's access levels. + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. +::: + +
    + +
    + +## Querying PostgreSQL + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **PostgreSQL** datasource added in previous step. +3. Select the query mode from 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. + +PG connection + +### SQL Mode + +To execute SQL queries, select the SQL mode from the dropdown and enter your query in the editor. + +PG connection + +#### Parameterized Queries: + +ToolJet offers support for parameterized SQL queries, which enhance security by preventing SQL injection and allow for dynamic query construction. To implement parameterized queries: + +1. Use `:parameter_name` as placeholders in your SQL query where you want to insert parameters. +2. In the **Parameters** section below the query editor, add key-value pairs for each parameter. +3. The keys should match the parameter names used in the query (without the colon). +4. The values can be static values or dynamic values using the `{{ }}` notation. + +Postgresql parameterized SQL queries + +##### Example: + +```yaml +Query: SELECT * FROM users WHERE username = :username +SQL Parameters: + Key: username + Value: oliver // or {{ components.username.value }} +``` + +#### Query Timeout + +You can set the timeout duration for SQL queries by adding the `PLUGINS_SQL_DB_STATEMENT_TIMEOUT` variable to the environment configuration file. By default, it is set to 120,000 ms. + +### GUI Mode + +Choose the GUI mode from the dropdown and select the operation **Bulk update using primary key**. Provide the **Table** name and the **Primary key column** name. Then, in the editor, input the **records** as an array of objects. + +PG connection + +```json +[ + { + "customer_id": 1, + "country": "India" + }, + { + "customer_id": 2, + "country": "USA" + } +] +``` + +:::tip +- You can apply transformations to the query results. Refer to our transformations documentation for more details: **[Transformation Tutorial](/docs/tutorial/transformations)** +- Check out this how-to guide on **[bulk updating multiple rows](/docs/how-to/bulk-update-multiple-rows)** from a table component. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/redis.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/redis.md new file mode 100644 index 0000000000..b5fab26f70 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/redis.md @@ -0,0 +1,101 @@ +--- +id: redis +title: Redis +--- + +ToolJet enables you to execute Redis commands on your Redis instances. + +
    + +## Connecting to Redis + +To establish a connection with the Redis 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 Redis as the data source. + +Redis Connection + +To connect ToolJet with Redis, you need to provide the following connection details: + +- **Host**: The address or hostname of the Redis server. +- **Port**: The port number used by the Redis server (default is 6379). +- **Username**: The username used for authentication. +- **Password**: The password used for authentication. +- **TLS**: Toggle to enable/disable TLS connection. +- **TLS Certificate**: Choose the type of TLS certificate (None, CA certificate, or Client certificate). + +Depending on the TLS certificate option selected, you may need to provide additional information: +- For **CA certificate**: + - **CA Cert**: The CA certificate for TLS connection. +- For **Client certificate**: + - **CA Cert**: The CA certificate for TLS connection. + - **Client Key**: The client key for TLS connection. + - **Client Cert**: The client certificate for TLS connection. + +
    + +
    + +## Querying Redis + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Redis** datasource added in previous step. +3. Enter the query. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +Here are some examples of Redis commands and their usage. You can refer to the [Redis Official Documentation](https://redis.io/commands) for a complete list of supported commands. + +### PING Command + +The `PING` command is used to test the connection to Redis. If the connection is successful, the Redis server will respond with **PONG**. + +```shell +PING +``` + +Redis Connection + +### SET Command + +The `SET` command is used in Redis to assign a value to a specific key. + +```shell +SET key value +``` + +#### Example +When the input value contains spaces, you should encode the value before providing it as an input: + +```shell +SET products {{encodeURI('John Doe')}} +``` + +Redis Example Encode + +### GET Command + +The `GET` command is used in Redis to retrieve the value associated with a specific key. + +```shell +GET key +``` + +#### Example +To retrieve a value that was previously encoded while setting, you can use transformations. + +1. Enter the GET command in the editor: + ```shell + GET products + ``` + +2. Enable Transformations (JS) and use `decodeURI`: + + ```js + return JSON.parse(decodeURI(data)); + ``` + +
    + + Redis Example Decode + +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/authentication.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/authentication.md new file mode 100644 index 0000000000..68435a6888 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/authentication.md @@ -0,0 +1,115 @@ +--- +id: authentication +title: Authentication +--- + +ToolJet’s REST API data source supports various authentication types to authenticate the user with the REST API service. The supported authentication types are Basic, Bearer, and OAuth 2.0. + +## Basic Authentication + +ToolJet’s REST API data source supports Basic Authentication as the authentication type. Basic Authentication is a simple authentication scheme built into the HTTP protocol. + +### Configuring REST API Data Source with Basic Authentication + +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. +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 + + + +## Bearer Token Authentication + +ToolJet’s REST API data source supports Bearer Token as the authentication type. Bearer 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. + +### Configuring REST API Data Source with Bearer Token + +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. +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 + + 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. + +### Authenticating REST API + +Create a query to make a `GET` request to the URL, and it will return a success message if the token is valid. + +
    + +ToolJet - Data source - REST API + +
    + +## OAuth 2.0 Authentication + +ToolJet’s REST API data source supports OAuth 2.0 as the authentication type. Supported OAuth 2.0 grant types are Authorization Code and Client Credentials. + +- **Authorization Code Grant Type**: This grant type is used by confidential and public clients to exchange an authorization code for an access token. +- **Client Credentials Grant Type**: This grant type is used by clients to obtain an access token outside of the context of a user. + +### Setting up Google Cloud Platform + +:::info +Before setting up the REST API data source in ToolJet, we need to configure the **Google Cloud Platform** to gather the API keys required for the authorization access. +::: + +Google Cloud Platform provides access to more than 350 APIs and Services that can allow us to access data from our Google account and its services. Let's create an OAuth application that can be given permission to use our Google profile data such as Name and Profile picture. + +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. +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.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 + +6. Now save and then you’ll get the **Client ID and Client secret** for your application. + +ToolJet - How To - REST API authentication using OAuth 2.0 + +### Configuring ToolJet Application with Google's OAuth 2.0 API + +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. +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.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 + +### Authenticating REST API + +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 diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/configuration.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/configuration.md new file mode 100644 index 0000000000..d4a1c5073c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/configuration.md @@ -0,0 +1,82 @@ +--- +id: configuration +title: Configuration +slug: /data-sources/restapi/ +--- + +ToolJet can establish connections with any available REST API endpoint, allowing you to create queries and interact with external data sources seamlessly. + +## Setting up a REST API Data Source + +
    + +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 requires the following to connect to a REST API data source: + +- **[Credentials](#credentials)** +- **[Authentication](#authentication)** +- **[Secure Sockets Layer (SSL)](#secure-sockets-layer-ssl)** + +
    + +### Credentials + +- **Base URL**: The base URL specifies the network address of the API service. +- **Headers**: Key-value pairs to include as headers with REST API requests. +- **URL Parameters**: Key-value pairs to include as URL parameters with REST API requests. +- **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 + +
    + +
    + +### Authentication + +:::info +For a detailed explanation of the authentication types supported by REST API data sources, refer to the **[Authentication](/docs/data-sources/restapi/authentication)** section. +::: + +ToolJet supports the following authentication types for REST API data sources: + +- **None**: No authentication required. +- **Basic**: Requires Username and Password. +- **Bearer**: Requires a token, typically a JSON Web Token (JWT), to grant access. +- **OAuth 2.0**: Supports both Authorization Code and Client Credentials grant types. Required parameters vary based on the selected grant type and service provider. + - Access token URL + - Access token URL custom headers + - Client ID + - Client secret + - Scopes + - Custom query parameters + - Authorization URL + - Custom authentication parameters + - Client authentication method + +REST API - Authentication + +
    + +
    + +### Secure Sockets Layer (SSL) + +- **SSL Certificate**: SSL certificate to use with REST API requests. Supported Types: + - **None**: No SSL certificate verification. + - **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 + +
    + +:::info +To interact with SOAP APIs, refer to the [SOAP API Documentation](/docs/data-sources/soap-api). +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/metadata-and-cookies.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/metadata-and-cookies.md new file mode 100644 index 0000000000..d10609a995 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/metadata-and-cookies.md @@ -0,0 +1,78 @@ +--- +id: metadata-and-cookies +title: Metadata and Cookies +--- + +## Metadata + +Metadata is additional information about the data returned by the REST API. This information includes the request URL, method, headers, and response status code, headers, and body. The metadata can be accessed within queries and components using the `{{queries..metadata}}` syntax. + +:::info +While accessing the properties of the metadata object, which contains a hyphen, you can use the bracket notation. For example, to access the `user-agent` property, you can use `{{queries.restapi1.metadata.request.headers["user-agent"]}}` or `{{queries.restapi1.metadata.request.headers."user-agent"}}`. +::: + +
    +**Example Metadata** + +```json +{ + "request": { + "url": "https://dummyjson.com/users", + "method": "GET", + "headers": { + "user-agent": "got (https://github.com/sindresorhus/got)", + "tj-x-forwarded-for": "103.171.99.41", + "accept-encoding": "gzip, deflate, br" + }, + "params": {} + }, + "response": { + "statusCode": 200, + "headers": { + "server": "[REDACTED]", + "report-to": "{"group":"heroku-nel","max_age":3600,"endpoints":[{"url":"https://nel.heroku.com/reports?ts=1726207652&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=1ICCahr5yl4s1cOLwZ5JI7Le2a5Hp57L8DugEP6oEZQ%3D"}]}", + "reporting-endpoints": "heroku-nel=https://nel.heroku.com/reports?ts=1726207652&sid=e11707d5-02a7-43ef-b45e-2cf4d2036f7d&s=1ICCahr5yl4s1cOLwZ5JI7Le2a5Hp57L8DugEP6oEZQ%3D", + "nel": "{"report_to":"heroku-nel","max_age":3600,"success_fraction":0.005,"failure_fraction":0.05,"response_headers":["Via"]}", + "connection": "close", + "access-control-allow-origin": "*", + "x-dns-prefetch-control": "off", + "x-frame-options": "SAMEORIGIN", + "strict-transport-security": "max-age=15552000; includeSubDomains", + "x-download-options": "noopen", + "x-content-type-options": "nosniff", + "x-xss-protection": "1; mode=block", + "x-ratelimit-limit": "100", + "x-ratelimit-remaining": "99", + "date": "Fri, 13 Sep 2024 06:07:32 GMT", + "x-ratelimit-reset": "1726207656", + "content-type": "application/json; charset=utf-8", + "etag": "W/"7d39-+rQ7kyHBCLIn9tjTeKVf4oegWkQ"", + "vary": "Accept-Encoding", + "content-encoding": "gzip", + "transfer-encoding": "chunked", + "via": "1.1 vegur" + } + } +} +``` +
    + +## Cookies + +In addition to the data source level cookies, you can add query-specific cookies in the Query builder. These cookies will be sent only with the specific query created using this data source instance. + +To add cookies: + +1. In the Query builder, navigate to the **Setup** tab. +2. Find the **Cookies** section. +3. Add your cookies as key-value pairs. + +You can use both static values and dynamic values for cookie values. + +
    +ToolJet - Query Builder - REST API Cookies +
    + +:::info +Query-specific cookies will override data source level cookies with the same name for that particular query. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/querying-rest-api.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/querying-rest-api.md new file mode 100644 index 0000000000..2ee52e7c23 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/restapi/querying-rest-api.md @@ -0,0 +1,169 @@ +--- +id: querying-rest-api +title: Querying REST API +--- + +## Creating Queries + +Once you have connected to the REST API data source, you can easily write queries and interact with the REST API in the ToolJet application. Follow these steps to get started: + +1. Click on the **+ Add** button in the query manager at the bottom panel of the editor. +2. Select **REST API** from the Data Source section. +3. Enter the required query parameters. +4. Click **Preview** to view the data returned from the query or click **Run** to execute the query. + +:::tip +You can also transform the query results using the **[Transformations](/docs/tutorial/transformations)** feature. +::: + +ToolJet supports the following REST HTTP methods: +- **GET** +- **POST** +- **PUT** +- **PATCH** +- **DELETE** + +ToolJet - Data source - REST API + +
    + +### Additional header + +Whenever a request is made to the REST API, a **tj-x-forwarded-for** header is added to the request, the value of the header will be the IP address of the user who is logged in to the ToolJet application. This header can be used to identify the user who is making the request to the REST API. + +ToolJet - Data source - REST API + +
    + + +## Request/Content Types + +REST API sends a **JSON** formatted body by default. If you want to send a different type of body, you can enter the appropriate headers in the **Headers** section. + +For example, to send a **multipart/form-data** body, you can add the following header: + +```javascript + Content-Type: multipart/form-data; +``` + +ToolJet - Data source - REST API + +ToolJet - Data source - REST API +

    + +:::info Handling OAuth Token via REST API +To obtain an OAuth token via REST API, add the following custom header:
    +`Content-Type: application/x-www-form-urlencoded` +::: + +## Response Types and Handling + +REST APIs can return data in a variety of formats, including **JSON** and **Base64**. JSON is a common format used for data exchange in REST APIs, while Base64 is often used for encoding binary data, such as images or video, within a JSON response. +When the response **content-type** is **image**, the response will be a **base64** string. + +
    +**Example JSON response** + +```json +[ + { + "id": 1, + "title": "Fjallraven - Foldsack No. 1 Backpack, Fits 15 Laptops", + "price": 109.95, + "description": "Your perfect pack for everyday use and walks in the forest. Stash your laptop (up to 15 inches) in the padded sleeve, your everyday", + "category": "men's clothing", + "image": "https://fakestoreapi.com/img/81fPKd-2AYL._AC_SL1500_.jpg", + "rating": { + "rate": 3.9, + "count": 120 + } + }, + { + "id": 2, + "title": "Mens Casual Premium Slim Fit T-Shirts ", + "price": 22.3, + "description": "Slim-fitting style, contrast raglan long sleeve, three-button henley placket, light weight & soft fabric for breathable and comfortable wearing. And Solid stitched shirts with round neck made for durability and a great fit for casual fashion wear and diehard baseball fans. The Henley style round neckline includes a three-button placket.", + "category": "men's clothing", + "image": "https://fakestoreapi.com/img/71-3HjGNDUL._AC_SY879._SX._UX._SY._UY_.jpg", + "rating": { + "rate": 4.1, + "count": 259 + } + }, + { + "id": 3, + "title": "Mens Cotton Jacket", + "price": 55.99, + "description": "great outerwear jackets for Spring/Autumn/Winter, suitable for many occasions, such as working, hiking, camping, mountain/rock climbing, cycling, traveling or other outdoors. Good gift choice for you or your family member. A warm hearted love to Father, husband or son in this thanksgiving or Christmas Day.", + "category": "men's clothing", + "image": "https://fakestoreapi.com/img/71li-ujtlUL._AC_UX679_.jpg", + "rating": { + "rate": 4.7, + "count": 500 + } + }, + { + "id": 4, + "title": "Mens Casual Slim Fit", + "price": 15.99, + "description": "The color could be slightly different between on the screen and in practice. / Please note that body builds vary by person, therefore, detailed size information should be reviewed below on the product description.", + "category": "men's clothing", + "image": "https://fakestoreapi.com/img/71YXzeOuslL._AC_UY879_.jpg", + "rating": { + "rate": 2.1, + "count": 430 + } + } +] +``` + +The JSON response can be easily loaded on the components like **table** and **listview** using `{{queries..data}}` + +
    + +You can also use JS methods like **map** to load data on components like **dropdown** using **`{{queries.restapi1.data.map(i => i.title)}}`** + +ToolJet - Data source - REST API + +
    +**Example base64 response** +```base64 +iVBORw0KGgoAAAANSUhEUgAAAOEAAADhCAMAAAAJbSJIAAAA/FBMVEVAYt79/f1AYt/9/f79/ftAY9s/Y93v/P89ZNv8/v38/f/9/vj9/vr+/Pz//P49ZNw8ZddUb86QpMlCYOX1//9AYeI6XdaXp+C1x+nL2fj+/vU2WMZVb8iPnsU3Xt00WNY7ZtU0WMuJncs8W8JDY801W986V9BTacRleMF+kNClt+CsvuFtiNYvVMRcedaZq9Lb5/eCl9K8zOJJWcqlr9xdb8C6w+w7XsCmvt3S5fs5ac1whs7l8v/6//B9j8wvVLrO2+o+Y7t6kMODotxPbL0+WOLf3/aesdVmfbvL5PentOmDl99RbtdMXcGOnNqTqdp+luIyVrLr7Pq/2/3mMzS8AAAKxUlEQVR4nO2cC1vbthrHLVmWJUuW3dlywWYkIRAorG1K6SgjgV5g3a3jbOf7f5fzygngcCvbeobN8/7a8rQl7eO/Jf3fiyV7HoIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIIgCIL8H+CBI0kSzj3OA5Gm9V8EQojAsw99dV8DUMg5tzYDLLWgktbAb4CHvrqvwWwM6zETMJJpmgqRwg9qLeXiMUisFcK4cZifqxsbvXMKmtlHpNDrjarNrWdPt3d2luZ8JzzL004rdGvNERSD5y9eLo9DMkc7yDfrAYxr8MAX+XdxvunWmfPLwf6r3VASIiVjMYkJ/IzhK/mmECLrrEKPJmm/vy5sb3i4O5FRzMg1uq2QOmMRxej13liWpWKxeWwKnXfa3ovtEPQxwvwoemwKPS6qN9+HqixjYyLHo1IIJpMV+29DCbOTMOVm6XV9XVTo4h73wD8Tz1ZnIZGRE8ZqHo/CIEhFElTfHeRSkxtm5iNQmP4gNl7v5ErFxpfSRb/HpVCAh1aHk7zUxhg91ezRKYRM5vV2Pi1Bn/HZzQbTSYVgnlDtwQB6xQ9jaUzMyrLU0Q1R/gKfkA+FCLKgGwrTxEKVIIQdHYXEj30ia//0b1EXRQxuA/ku5WC8XagtKOTZnqvcs9FZLu+cmBcKGajfTD3riYe++ntBaZCmCaXPvydTJV3h8AWdkrBS58cCbk43Jilk2Wk/Fe8PdBzrmYbaQ28zGqYNm8p3VRcm6JwAbGb9/UGuiGlG+dvWIVMmLuV2QR/6uu8PLKji/YGMIqXmqmQjVviMRX5z3rLSN2V+tNoJhbCQXDaa2c1JTPxIsplCJiM11eO1N09enB3kGuLjZWyUxDCp2eT9Q1/7/eFBulFBGFyYiFJOXg0Lm9nB8GUOsaG5Jk2sS7JbPfR13w+oJayl6XBZl5crEEYpVuGbDYgFaSq86izXrKnfmHIqj2wnJil4jLVeMlxmoEk2FJr8Q5GlPF3vwwwevpOqqdCt18l+1hmFXnq8k8NKK7XvX0QIOd7niQD1NIOJuiZVvKCQkbdVK8fQXdP8ocOcwKNi+BHK3CiS9eidx4OdHuUW5mia9pPiDdELCmUsT1rZCqYZFQIGhQ6qwWhQOYaD0fGHUF4NfYy8LJLUlRpQcFBvhUC8uPxubNTSIG3lGEL9zr3R52c7yw0gGlxLXpjeGdnz50pUHBK1cAtYfrgqaCsVJnTwfu9PKbUq6868Zlorra8KhJg+Oc4srzVQWr2UC7NU5u+q7KG13Ai1XvUxJE4TY1o5Yqa0jK4k2j6sw/zVwNLZIKZ/jBe9VOZbvcy2MeemdLgkQRJoAkCYjHy//u3VdegbGZ4EM4V8/YMslbn4BNyOn0c2pS1TSF0d7w13ZclchyKGWVp3CSHXNjd0KyKj1MFm4W6KV2z9GU/PFcInYU4/O7X9llkpzdJ1TqvvCVGs7l+fd0ChkPevVUlQIhpd5pO1/UFRHB+F7hOzWQpVhVTkx+e2bSMIK1CIZHhG3Hh9oQs6V65Vnufjt5/ejqPmFGYxfOOoeGg9V6EeDaitPkifKPWlPu8MpWB16lKD7ZaNIfYlDP7y/kMLugaYvqDFYVi7p38/hRqSz3JaSskgWrJZtsPg7qh4ctLK3gwvPo/rBprv31a5L+CEgeeC386fOs3+lR9ruTd4aDE3we1gj6j6KZl/d5u3lgdOEysF4vyYXaxbxiT8EVJy58uzHLcd0CQBl6FbOcyx6F7jdy5o4Y++0XCH1DTcKtq2S4jzhHM+3M2Z+SsCrw+sli6EbFde0rJIkXC3p+KnUM4LpL8JK6UxSv+8T2nbHlUIDgIHu1DD/kOFviFy8p5n7VOYQAKyImNtIA/9BwqVgVz1MF21om21L7iMV237cWx8yD/dZp/4fMvPPYHlC2FGxiQ/G0F2K9L22GiN6NtsM3T1EqsLQlan3sb4vpQ37bC4Thzp6dQ3U/1LL6n/y5Yp9FKe/RpeI/eZi3j3mZ8liSDzZvnusdey+VlDsyD1fjtZucpTQspS3U8hjDozcnmYijbuCKYZTUUg6Oo5s72+We/bHOra+1gP064DrA72My5a2X3i1BOCpw04FyJNh9/m7IuVlMtr/MiHSH+wX1ietHEMvZTaQCT1luxgvjHbbbrg2fDbO/eSOHyXqYMdKbI8zGgAJVgbx7DuRHjzveezn/Uv6w3W8hJKjdsdNYJcFKoLJuXS/motrp0CbwFm7/CbHIr+Ut+m0Jdag9FMIRkNvFa2R2/k/EIFzfhw7U5HZYoZCKL5WWVtG+PEzVyMBKzEzA5qR731aTbECS0nTwb9fvqQ1/w3qX2Dg6MSdrtCn+jdz6c27bctF70der7/3nPOKpI7HRWybZiiG+7sCE14J2wGErjMZQCXtnG3o0ods6erwcWxhNbjLtSd5uGurTEbkrsdNVJOYWcmaP1kBpIZqGHT/nlD8G5HjRTrlkKv3uW8QbnbfzDjbkftlMJ6TqaJ5dWvK+40z7wTcbejyg4pnFkF5KjH2/n4xIOJOpPI3Yav2lFv2kwKCklHFFIL6Tf3RNZbIkaNV/ru/CC/dFQKjqpcJ2Zhz0UcO4VFJxR6roSCL71fpCGxnGyKdO6oNTNHlQYyGLOgUMvOKAygRqS297vURkdK/7iZWueoc4XgqN5wTfpQSiwqhAKyI7PUc3u4OX8RljFzYRwmKhWXjprWjvrJGWrzkFrs2lW/d0Qh5Fw8PV6GtcZkvTt0stlwVFE76lYOCnVjezcojMizrii0VKy/IjKXkfadzrJ2VDHfJ8WdyidhqV1PNbpUaAzZ6kjhlNr++v6YESn9+rESY/5kxSbNrgR9Ehq28MjJ9aDCzW7s0ONpJtaPmp013+STTds8S2BBoSYLh0V9ow8Gqw932X8BnlpbLTd3d0FlpMZPmi1eN4ZaNhVGpJRnvVY+074CrZ9ArYSzfTMzCayMVf6f4m6FchoOW7ev5Gao109eLZS6vlH505G4TWH9FWLF3qDfyh7pFdzB8/76LjNmdt4Hph9jJv9Y9a86zeUY+u5UkByvix9sFyRCOLB/TAxziadSzEDIV5OjChK3xmcuFYLRGshvGAu3NsT6bJa23VB5kJ1IwzSLIohxUNDny5sDzwbNFlpzDCEswt3IfyoyLjoSLfjqM1lHu9ht22Ph09enGU0WbLKpMNJlSSY/VVmW8NNOKPSC3ieoAN0zFqV1tDQsAtci9LIb1mGdD+RKHmxuQCLUmU5pMFrSsdsuJPNwaWsEhYVLvPk1p6lzmpgwOdmrYAFCRSK6InHwzm3Dk2R8tjIKkoSvur6iaE7TVVBI3HEnyOv+3DsZ9hPIzGlmk9a7jOdK/OzzRJPw3aeV54V75QWft4abSTVkbao+7zNZ2no+8gJeb/PuTKc0efLfnVcrw4F7Z8lsb/O1z8AYlpHMD9ZOKtoN/2zC+/1qULjn2zaZr6trGmAdynz3qCq4O5Lxb1/hP8Zt/QLTSO56O9dKuHsyPLX1C8v+zWv7OoBpBvVLulwmessA/Xb4mvJT1xZPu6eQu/d0uQNB1rvlAL17jlGcZn337jk+exLTrZlKvfmL5O78DKUBP//44+TRCkMQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEEQBEGQr8n/ABGyzAUL7/lcAAAAAElFTkSuQmCC +``` +
    + +Read the guide on **[loading base64 data](/docs/how-to/loading-image-pdf-from-db)**. + +ToolJet - Data source - REST API + + +## Retry on Network Errors + +ToolJet provides an option to automatically retry REST API requests in case of certain network errors or specific HTTP status codes. By default, this feature is enabled and will retry the request up to 3 times in case of failure. This feature can be toggled on or off at both the data source level and the individual query level. When enabled, retries will occur for the following scenarios: + +1. Specific HTTP status codes: 408, 413, 429, 500, 502, 503, 504, 521, 522, 524. +2. Network errors: + - **ETIMEDOUT**: One of the timeout limits was reached. + - **ECONNRESET**: Connection was forcibly closed by a peer. + - **EADDRINUSE**: Could not bind to any free port. + - **ECONNREFUSED**: Connection was refused by the server. + - **EPIPE**: The remote side of the stream being written has been closed. + - **ENOTFOUND**: Couldn't resolve the hostname to an IP address. + - **ENETUNREACH**: No internet connection. + - **EAI_AGAIN**: DNS lookup timed out. + +You can configure this feature at two levels: + +### Data Source Level + In the REST API data source configuration, you'll find a toggle for **Retry on network errors** This sets the default behavior for all queries using this data source. + +ToolJet - Data source - REST API + +### Query Level + In the query builder for each REST API query, you'll find a similar toggle for for **Retry on network errors** under the **Settings** tab. This sets the behavior for that specific query. + +ToolJet - Data source - REST API + +:::info +If the data source-level configuration is enabled but a specific query has it disabled, the query-level setting takes precedence. +::: diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/rethinkdb.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/rethinkdb.md new file mode 100644 index 0000000000..df26fe970e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/rethinkdb.md @@ -0,0 +1,228 @@ +--- +id: rethinkdb +title: RethinkDB +--- +# RethinkDB + +ToolJet can connect to RethinkDB databases to read and write data. For more info visit this [Rethink Docs](https://rethinkdb.com/api/javascript). + +
    + +## Connection + +To establish a connection with the RethinkDB 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 requires the following to connect to a RethinkDB data source: + +- **Database** +- **Host** +- **Username** +- **Password** +- **Port** + + + +
    + +
    + +## Querying RethinkDB + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the RethinkDB data source added in the previous step. +3. Select the desired operation. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + + + +
    + +
    + +## Supported Queries + +- **[Create database](#create-database)** +- **[Create table](#create-table)** +- **[Delete database](#delete-database)** +- **[Delete table](#delete-table)** +- **[List all database](#list-all-database)** +- **[List all table](#list-all-table)** +- **[List all documents](#list-all-documents)** +- **[Insert document](#insert-document)** +- **[Retrieve document by key](#retrieve-document-by-key)** +- **[Update document using ID](#update-document-using-id)** +- **[Update all documents](#update-all-documents)** +- **[Delete document using ID](#delete-document-using-id)** +- **[Delete all documents](#delete-all-documents)** + +:::info +NOTE: The name field in all operations is the database name if not given will take the default database used for the connection. +::: + +### Create Database + +Creates a new database in RethinkDB. + +#### Required Parameter +- **Database Name** + + + + +### Create Table + +Creates a new table in a specified database. + +#### Required Parameter +- **Database Name** +- **Tablename** + + + + +### Delete Database + +Deletes an existing database in RethinkDB. + +#### Required Parameter +- **Database Name** + + + + +### Delete Table + +Deletes a table from a specified database. + +#### Required Parameter +- **Database Name** +- **Tablename** + + + + +### List All Database + +Lists all available databases. + + + + +### List All Table + +Lists all tables in a specified database. + +#### Required Parameter +- **Database Name** + + + + +### List All Documents + +Retrieves all documents from a specified table. + +#### Required Parameter +- **Database Name** +- **Tablename** + + + + +### Insert Document + +Inserts a new document into a specified table. + +#### Required Parameter +- **Database Name** +- **Tablename** +- **Data** + + + +#### Example + +```yaml +{ +  "name": "John Doe", +  "age": 30 +} +``` + + +### Retrieve Document by Key + +Fetches a document from a specified table by its key. + +#### Required Parameter +- **Database Name** +- **Tablename** +- **Primary key** + + + + +### Update Document Using ID + +Updates a specific document in a table using its ID. + +#### Required Parameter +- **Database Name** +- **Tablename** +- **Primary key** +- **Data** + + + +#### Example + +```yaml +{ +  "age": 31 +} +``` + + +### Update All Documents + +Updates all documents in a specified table. + +#### Required Parameter +- **Database Name** +- **Tablename** +- **Data** + + + +#### Example + +```yaml +{ +  "verified": true +} +``` + + +### Delete Document Using ID + +Deletes a specific document in a table using its ID. + +#### Required Parameter +- **Database Name** +- **Tablename** +- **Primary key** + + + + +### Delete All Documents + +Deletes all documents from a specified table. + +#### Required Parameter +- **Database Name** +- **Tablename** + + + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/run-py.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/run-py.md new file mode 100644 index 0000000000..eea9c64b68 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/run-py.md @@ -0,0 +1,205 @@ +--- +id: run-py +title: Run Python Code +--- + +In ToolJet, custom **Run Python Code** can be used to interact with components and queries, making it possible to customize actions and data handling. + +Run Python code + +
    + +## Using Python Code to Trigger Component Specific Actions + +1. Drag a **Text** component onto the canvas. We will set the text on the Text component using the Python query. +2. Create a query and select **Run Python code** from the available data sources +3. Paste the below code in the code editor and save the query: + +```python +class Person: + def __init__(self, name, age): + self.name = name + self.age = age + + def myfunc(self): + return "Hello my name is " + self.name + +p1 = Person(tj_globals.currentUser.firstName, 36) + +components.text1.setText(p1.myfunc()) +``` + +4. The above code has a function `myfunc` which returns a string and we are using a **[Component Specific Action](/docs/tooljet-concepts/component-specific-actions)** to set the Text Component's value from the Python query. + +:::tip +- As of now, Run Python code only supports the [Python standard library](https://docs.python.org/3/library/). +- Check **[RunPy Limitations](/docs/contributing-guide/troubleshooting/runpy-limitations)** to go through the limitations with using Python code +::: + +
    + +
    + +## Trigger Queries Using Run Python Code + +To trigger queries in Python, you can use the below functions: + +```py +actions.runQuery('getSalesData') +#replace getSalesData with your query name +``` +Or +```py +queries.getSalesData.run() +#replace getSalesData with your query name +``` + +
    + +
    + +## Get Query Data + +To immediately access the data returned by a query in **Run Python code**, you can use the below functions: + +### Trigger a Query and Retrieve its Data + +```py +await queries.getSalesData.run() +#replace getSalesData with your query name + +value = queries.getSalesData.getData() +#replace getSalesData with your query name + +value +``` + +### Trigger a Query and Retrieve its Raw Data + +```py +await queries.getCustomerData.run() +#replace getCustomerData with your query name + +value = queries.getCustomerData.getRawData() +#replace getCustomerData with your query name + +value +``` + +### Trigger a Query and Retrieve its Loading State + +```py +await queries.getTodos.run() +#replace getTodos with your query name + +value = queries.getTodos.getLoadingState() +#replace getTodos with your query name + +value +``` + +
    + +
    + +## Get Variables + +To set and access variables or page variables in **Run Python code**, you can use the below functions: + +### Set a Variable + +```py +actions.setVariable('color','blue') +#replace color with your desired variable name +``` + +### Immediately Retrieve a Variable After Setting it + +```py +actions.setVariable('mode','dark') +#replace mode with your desired variable name + +actions.getVariable('mode') +#replace mode with your desired variable name +``` + +### Set a Page-Specific Variable + +```py +actions.setPageVariable('version', 1) +#replace version with your desired variable name +``` + +### Immediately Retrieve a Page-Specific Variable After Setting it + +```py +actions.setPageVariable('number',1) +#replace number with your desired variable name + +actions.getPageVariable('number') +#replace number with your desired variable name +``` + +
    + +
    + +## Using Transformations With Python + +**Run Python code** can be used to transform the data that is fetched in the queries. To test transformations using Python, create a new **REST API** query, leave the method as *GET* and enter the below url under the **URL** property. + +```yaml +https://dummyjson.com/products +``` + +Click on the **Run** button and check the preview of the returned data, below is the data structure of the response: + +```js +products_data = { + "products": [ + {"title": "iPhone 9", ...}, + {"title": "iPhone X", ...}, + # Additional products... + ] +} +``` + +### Filter the Titles From the Response + +To extract a list of product titles from the given data structure, we iterate through the *products* list and collect each product's *title* using the below code. Enable **Transformations** in the Query Editor and use the below code: + +```python +return [product["title"] for product in data["products"]] +``` + +### Filter Products by Category + +To filter products by a specific category, such as *smartphones*, and extract their titles. Enable **Transformations** in the Query Editor and use the below code: + +```python +return [product["title"] for product in data["products"] if product["category"] == "smartphones"] +``` + +### Calculate Average Price of a Category + +To calculate the average price of products within the *laptops* category. Enable **Transformations** in the Query Editor and use the below code: + +```python +return sum(product["price"] for product in data["products"] if product["category"] == "laptops") / len([product for product in data["products"] if product["category"] == "laptops"]) if len([product for product in data["products"] if product["category"] == "laptops"]) > 0 else 0 +``` + +
    + +
    + +## Refer Python Query Data in Components + +Just like other dynamic values, you can refer the data returned by **Run Python code** queries using double curly braces`{{}}`. + +For instance, if you have a **Run Python code** query named *updatedProductInfo*, you can pass `{{queries.updatedProductInfo.data}}` under the **Data** property of a Table component to populate it with the data returned by the *updatedProductInfo* query. + +:::info +Issues with writing custom Python code? Ask in our [Slack community](https://www.tooljet.com/slack). +::: + +
    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 new file mode 100644 index 0000000000..6517794bf4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/s3.md @@ -0,0 +1,181 @@ +--- +id: s3 +title: Amazon S3 +--- + +ToolJet can connect to **Amazon S3** buckets and perform various operations on them. + +
    + +## Connection + +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**. + +If you are using **IAM Access Keys**, you will need to provide the following details: + +- **Region** +- **Access key** +- **Secret key** + +**Note:** It is recommended to create a new IAM user for the database so that you can control the access levels of ToolJet. + +aws s3 modal + +To connect to AWS S3 using **AWS Instance Credentials**, select the **Use AWS Instance Credentials**. This will use the IAM role attached to the EC2 instance where ToolJet is running. + +To access the metadata service of an ECS container and the EC2 instance, we use the WebIdentityToken parameter which is obtained from a successful login with an identity provider. + +aws s3 modal + +If you are using **AWS ARN Role**, you will need to provide the following details: + +- **Region** +- **Role ARN** + +aws s3 modal + +:::tip +You can now connect to **[different S3 Hosts using custom endpoints](/docs/how-to/s3-custom-endpoints)**. +::: + +
    + +
    + +## Querying AWS S3 + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Amazon AWS S3** datasource added in previous step. +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. + +aws s3 query + +:::info +Query results can be transformed using transformations. Read our [transformations documentation](/docs/tutorial/transformations). +::: + +
    + +
    + +## 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)** + +### Create a New Bucket + +You can create a new bucket in your S3 by using this operation. + +#### Required Parameters + +- **Bucket Name** + +Create a new bucket - S3 operation + +### Read Object + +You can read an object in a bucket by using this operation. + +#### Required Parameters + +- **Bucket** +- **Key** + +aws s3 read object + +### Upload Object + +You can use this operation to upload objects(files) to your S3 bucket. + +#### Required Parameters + +- **Bucket** +- **Key** +- **Content Type** +- **Upload data** + +aws s3 upload + +### Remove Object + +You can use this operation to remove an object from your S3 bucket. + +#### Required Parameters + +- **Bucket** +- **Key** + +Create a new bucket - S3 operation + +### List Buckets + +This operation will list all the buckets in your S3. This does not require any parameter. + +aws s3 bucket + +### List Objects in a Bucket + +This operation will fetch the list of all the files in your bucket. It requires the following parameters: + +#### Required Parameters + +- **Bucket** + +#### Optional Parameters + +- **Prefix** +- **Max keys** +- **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**.
    +The **Next Continuation Token** is used to list the next set of objects in a bucket. It is returned by the API when the response is truncated. The results will contain **Next Continuation Token** if there are more keys in the bucket that satisfy the list query. To get the next set of objects, set the **Next Continuation Token** parameter and run the query again.
    +The results will continue from where the last listing finished. +::: + +aws s3 list object + +### 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. + +#### Required Parameters + +- **Bucket** +- **Key** +- **Expires in** + +aws s3 signed download + +### 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. + +#### Required Parameters + +- **Bucket** +- **Key** +- **Expires in** +- **Content Type** + +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/)**. +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/sample-data-sources.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/sample-data-sources.md new file mode 100644 index 0000000000..1189754cdb --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/sample-data-sources.md @@ -0,0 +1,75 @@ +--- +id: sample-data-sources +title: Sample Data Sources +--- + +# Sample Data Source in ToolJet + +ToolJet includes a built-in PostgreSQL sample data source that allows you to familiarize yourself with its features and components before connecting your own data. This database contains example tables and data for hands-on experimentation. The sample data source is a shared PostgreSQL connection available across all workspaces and applications. This means any changes or updates made to the data will be reflected in real-time for all users, regardless of the application or workspace. If are using ToolJet Cloud, the sample data resets daily at midnight. However, if you are using a self-hosted version of ToolJet, the data will not be reset. + + +### Getting Started with Sample Data Sources + +When you create a new application, the empty state will guide you on the next steps for connecting a data source. If you don't have your own data source ready, you can immediately start exploring and building by connecting to our sample data source. + +Canvas View + +## Connecting to Sample Data Sources + +You can connect to the sample data source in three different ways, depending on your requirements: + +### 1. Connect the Sample Data Source to a Newly Created Application. + +This method allows you to add a sample data source to an existing application that is in an empty state (i.e., has no pre-existing components) + + 1. Select/Create the application you want to connect to the sample data source. + 2. Once you select/create the new application, the empty state guides you through the initial setup for connecting the sample data source. + 3. Click on the **Connect to sample data source** button. This will create a query in the query panel which will retrieve all the tables names from the sample data source. + + + +
    + Connect via Canvas +
    + + +### 2. Connect the Sample Data Source to an Existing Application. + +This method allows you to connect the sample data source to an existing application from the query panel. + + 1. Open the **Query Panel** of the application you want to connect to the **Sample Data Source**. + 2. In the **Query Panel**, click on the **+Add** button to add a new query, and select **Sample Data Source**. + 3. This will create a new empty query. You can now write your SQL query to retrieved data from the sample data source. You can checkout the sample data source [schema](#sample-data-source-schema) to understand the tables and columns available in the sample data source. + + + +
    + Connect via query manager +
    + + +### 3. Create a Sample Application Using the Sample Data Source. + +This method enables the creation of a sample application with a pre-configured connection to the sample data source. The data will be already visualized on the application's canvas upon creation. + + 1. Navigate to the Data Sources page within the dashboard's left-hand sidebar. + 2. Under the **DATA SOURCES ADDED** section in the sidebar, you will find the **Sample Data Source (postgres)**. This is a default data source and cannot be deleted. + 3. Select **Sample Data Source (postgres)**. You can click on the **Test Connection** button to test your connection to your sample database. + 4. Click **Create sample application** to generate the new application. This application automatically includes the sample data source. + 5. By default, this application will feature a table component with tabs. These tabs will visually display the data retrieved from your sample data source. + +
    + Create Sample App +
    + + ## Sample Data Source Schema + +The sample data source contains various tables with different data types. + +| Table Name | Column Names| Number of Rows | +|:-------|:---------|:---------------| +| `public.sample_data_organizations` | `index`, `organization_id`, `name`, `website`, `country`, `description`, `founded`, `industry`, `number_of_employees` | 100 | +| `public.sample_data_country_gdp` | `country`, `area_sq_km, population`, `exports`, `imports, gdp`, `gdp_per_capita`, `gdp_real_growth_rate`, `inflation_rate_consumer_prices`, `investment_gross_fixed_of_gdp`, `labor_force`, `unemployment_rate` | 263 | +| `public.sample_data_users` | `first_name`, `last_name`, `company_name`, `address`, `city`, `county`, `state`, `zip`, `phone1`, `phone2`, `email`, `web` | 499 | +| `public.sample_data_orders` | `row_id`, `order_id`, `order_date`, `ship_date`, `ship_mode`, `customer_id`, `customer_name`, `segment`, `country`, `city`, `state`, `postal_code`, `region`, `product_id`, `category`, `sub_category`, `product_name`, `sales`, `quantity`, `discount`, `profit` | 500 | +| `public.sample_data_product_cars` | `car`, `mpg`, `cylinders`, `displacement`, `horsepower`, `weight`, `acceleration`, `model`, `origin` | 406 | diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/saphana.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/saphana.md new file mode 100644 index 0000000000..6cd00a7c69 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/saphana.md @@ -0,0 +1,47 @@ +--- +id: saphana +title: SAP HANA +--- + +ToolJet can connect to SAP HANA databases to read and write data. + +
    + +## Connection + +To establish a connection with the SAP HANA datasource, 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 requires the following to connect to your SAP HANA database: + +- **Host** +- **Port** +- **Username** +- **Password** + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. +::: + +ToolJet - Data source - SAP HANA + +
    + +
    + +## Querying SAP HANA + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **SAP HANA** datasource added in previous step. +3. Add the Query. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +saphana query + +```sql +select * from PRODUCTS +``` + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/sendgrid.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/sendgrid.md new file mode 100644 index 0000000000..cae87d87d4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/sendgrid.md @@ -0,0 +1,70 @@ +--- +id: sendgrid +title: SendGrid +--- + +ToolJet can connect to your SendGrid account to send emails. + +
    + +## Connection + +To establish a connection with the SendGrid datasource, 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 requires the following to connect to your SendGrid database: +- **SendGrid API key** + +ToolJet - Data source - SendGrid + +:::info +The SendGrid API Datasource supports for interaction with the mail endpoint of the [SendGrid v3 API](https://docs.sendgrid.com/api-reference/how-to-use-the-sendgrid-v3-api/authentication). +::: + +
    + +
    + +## Querying SendGrid + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **SendGrid** datasource added in previous step. +3. Select **Email service** 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 create and trigger the query. + +
    + +
    + +## Supported Operations + +### Email Service + +#### Required Parameters +- **Multiple recipients** +- **Send email to** +- **Send email from** +- **Subject** +- **Body as text** + + +#### Optional Parameter +- **Body as HTML** + +ToolJet - Query SendGrid + +:::info +**Send mail to** - accepts an array/list of emails separated by comma. +For example: +`{{["dev@tooljet.io", "admin@tooljet.io"]}}`. + +**Send mail from** - accepts a string. +For example: `admin@tooljet.io` +::: + +:::tip +**Send a single email to multiple recipients** - The `Send mail to` field can contain an array of recipients, which will send a single email with all of the recipients in the field. + +**Send multiple individual emails to multiple recipients** - set Multiple recipients field to `{{true}}` and the `Send mail to` field will be split into multiple emails and send to each recipient. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/slack.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/slack.md new file mode 100644 index 0000000000..57b99777ff --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/slack.md @@ -0,0 +1,76 @@ +--- +id: slack +title: Slack +--- + +ToolJet can connect to your Slack workspace to send messages. + +
    + +## Connection + +To establish a connection with the **Slack** datasource, 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. + +Slack datasource: ToolJet + +
    + +Slack datasource: ToolJet + +
    + +:::note +The App (which credentials are provided) needs to be installed in the workspace to use the Slack data source, and it needs to be added to the channel where you want to post the message. +::: + +
    + +
    + +## Querying Slack + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Slack** datasource added in previous step. +3. Select the desired operation. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to create and trigger the query. + +Slack datasource: ToolJet + +
    + +
    + +## Supported Operations + +1. **[List Members](#list-members)** +2. **[Send Message](#send-message)** +3. **[List Messages From a Channel](#list-messages)** + +### List Members + +This operation will return the data of all the members in your slack workspace. + +Slack datasource: ToolJet + +### Send Message + +This operation will send/post the message to a specified channel or posting to direct messages (also known as DMs or IMs) in your slack workspace. + +#### Required Parameters +- **Channel** +- **Message** + +Slack datasource: ToolJet + +### List Messages + +This operation will get the messages from a specified channel. + +#### Required Parameters +- **Channel** +- **Limit** +- **Next Cursor** + +Slack datasource: ToolJet + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/smtp.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/smtp.md new file mode 100644 index 0000000000..cd760e95f1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/smtp.md @@ -0,0 +1,74 @@ +--- +id: smtp +title: SMTP +--- + +The SMTP datasource facilitates the connection between ToolJet applications and email servers, enabling the apps to send emails. + +
    + +## Connection + +To establish a connection with the SMTP 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 SMTP as the data source. + +ToolJet requires the following to connect to SMTP server: + +- **Host** +- **Port** +- **Username** +- **Password** + +### Finding Configuration Details + +The SMTP configuration details like host and port can usually be obtained from your email service provider. Here are some general settings for the most commonly used email providers: + +- **Gmail** + - **Host**: smtp.gmail.com + - **Port**: 587 or 465 (SSL) + - **Username**: Your Full Gmail Address + - **Password**: Your Gmail Password + +- **Yahoo Mail** + - **Host**: smtp.mail.yahoo.com + - **Port**: 465 (SSL) + - **Username**: Your Yahoo Email Address + - **Password**: Your Yahoo Mail Password + +- **Outlook.com/Hotmail** + - **Host**: smtp.office365.com + - **Port**: 587 or 465 (SSL) + - **Username**: your Outlook.com/Hotmail email address + - **Password**: your Outlook.com/Hotmail password. + + +smtp connect + +
    + +
    + +## Querying SMTP + +To create a query for sending an email, follow these steps: + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **SMTP** datasource added in previous step. +3. Enter the required parameters. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +#### Required Parameter + - **From**: Email address of the sender. + - **To**: Recipient's email address. + - **Subject** : Subject of the email. + - **Body** : You can enter the body text of the email in either raw text or html format, in their respective fields. + +#### Optional Parameter + - **From Name** : Name of the sender. + - **CC mail to** : Email address of the recipients that will receive a copy of the email, and their email addresses will be visible to other recipients. + - **BCC mail to** : Email address of the recipients that will receive a copy of the email but the email addressed will be hidden to other recipients. + - **Attachments** : You can add attachments to an SMTP query by referencing the file from the File Picker component in the attachments field. + - For instance, you can set the `Attachments` field value to `{{ components.filepicker1.file }}` or pass an object `{{ name: 'filename.jpg', dataURL: '......' }}` to include attachments. + +smtp connect + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/snowflake.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/snowflake.md new file mode 100644 index 0000000000..c4b17ad7c1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/snowflake.md @@ -0,0 +1,53 @@ +--- +id: snowflake +title: Snowflake +--- + +ToolJet can connect to Snowflake databases to read and write data. + +
    + +## Connection + +To establish a connection with the Snowflake 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 Snowflake as the data source. + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. + +You can find snowflake docs on network policies **[here](https://docs.snowflake.com/en/user-guide/network-policies.html)**. +::: + +ToolJet requires the following to connect to Snowflake database. + +- **Account** +- **Username** +- **Password** + +:::info +You can also configure for **[additional optional parameters](https://docs.snowflake.com/en/user-guide/nodejs-driver-use.html#additional-connection-options)**. +::: + +ToolJet - Snowflake connection + +
    + +
    + +## Querying Snowflake + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Snowflake** datasource added in previous step. +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 + +```sql +select * from "SNOWFLAKE_SAMPLE_DATA"."WEATHER"."DAILY_14_TOTAL" limit 10; +``` + +:::tip +Query results can be transformed using transformations. Read our [transformations](/docs/tutorial/transformations) documentation to learn more. +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/soapapi.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/soapapi.md new file mode 100644 index 0000000000..8b0984e43c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/soapapi.md @@ -0,0 +1,62 @@ +--- +id: soap-api +title: SOAP API +--- + +ToolJet can establish connections with SOAP APIs using its REST API integration. + +
    + +## Setting up a SOAP API Data Source + +To establish a connection with a SOAP API data source, you will need to add a REST API data source, as ToolJet handles SOAP APIs using REST API configurations. + +You can refer to [REST API Configuration Documentation](/docs/data-sources/restapi/) for more information. + +
    + +
    + +## Querying SOAP API + +Once you have connected to the REST API data source, you can easily write queries and interact with the SOAP API in the ToolJet application. Follow these steps to get started: + +1. Click on the **+ Add** button in the query manager at the bottom panel of the editor. +2. Select **REST API** from the Data Source section. +3. Select the **POST** Method and enter your SOAP API endpoint. +4. Add Headers + - **Content-Type** : **text/xml** (Specifies that the request body is XML.) + - Include any other required headers (e.g., Authorization, SOAPAction). +5. Add Request **Body** in XML format. +6. Click **Preview** to view the data returned from the query or click **Run** to execute the query. + +:::tip +You can also transform the query results using the **[Transformations](/docs/tutorial/transformations)** feature. +::: + +**API Endpoint URL Example:** `http://www.dneonline.com/calculator.asmx` + +SOAP API Headers + +**Request Body Example:** + +```xml + + + + + 100 + 5 + + + +``` + +SOAP API Headers + +**Additional Notes:** +- SOAP APIs typically use the POST method. Using a different method can cause errors. +- Ensure that you have added Content-Type: text/xml header. The server requires the correct header to interpret the request as SOAP. +- Include the SOAPAction header if specified in the API documentation. + +
    \ 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 new file mode 100644 index 0000000000..2352956053 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/stripe.md @@ -0,0 +1,197 @@ +--- +id: stripe +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/)** +::: + +
    + +## Connection + +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 + +You can get the Stripe API key from the dashboard of your Stripe account. Go to the Stripe account dashboard, click on the **Developers** on the top right, then on the left-sidebar go to the **API Keys**, you can simple reveal the **Secret Key** and copy-paste on ToolJet. + +ToolJet - Data source - Stripe + +
    + +
    + +## Querying Stripe + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Stripe** datasource added in previous step. +3. Select the desired operation form the dropdown and enter the required parameter. +4. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +
    + +
    + +## Supported Operations + +You can check out the some of the operations mentioned below. All the operations for Stripe are available and can be performed from ToolJet. Check out the **[Stripe API documentation](https://stripe.com/docs/api/)** for the detailed information about each operation. + +

    Account Operations

    + +| **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 | + +

    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 | + +

    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 | + +

    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 | + +

    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 | + +

    Other Account Operations

    + +| **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 | + +

    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 | + +

    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 | + +

    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| + +

    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 | + +

    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 | + +

    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 | + +

    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| + +

    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| + +

    Application Fee Refunds (Specific)

    + +| **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/data-sources/twilio.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/twilio.md new file mode 100644 index 0000000000..1ccaf075eb --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/twilio.md @@ -0,0 +1,57 @@ +--- +id: twilio +title: Twilio +--- + +ToolJet can connect to Twilio account to send sms. + +
    + +## Connection + +To establish a connection with the Twilio 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 Twilio as the data source. + +ToolJet requires the following to connect to Twilio: +- **Auth Token** +- **Account SID** +- **Messaging Service SID** + +You can get the **Auth Token and Account SID** on the dashboard of your Twilio account. + +ToolJet - Data source - Twilio + +For **Messaging Service SID**, you'll need to create a messaging service first from the Services under Messaging in the left-sidebar. + +ToolJet - Data source - Twilio + +ToolJet - Data source - Twilio + +
    + +
    + +## Querying Twilio + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Twilio** datasource added in previous step. +3. Select **Send SMS** 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. + +
    + +
    + +## Supported operations + +### Send message + +This operation will send the specified message to specified mobile number. + +#### Required Parameters +- **To Number** +- **Body** + +ToolJet - Data source - Twilio + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/typesense.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/typesense.md new file mode 100644 index 0000000000..3f37573ea5 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/typesense.md @@ -0,0 +1,147 @@ +--- +id: typesense +title: TypeSense +--- + +ToolJet can connect to your TypeSense deployment to read and write data. + +
    + +## Connection + +To establish a connection with the Typesense 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 Typesense as the data source. + +:::info +Please make sure the **Host/IP** of the database is accessible from your VPC if you have self-hosted ToolJet. If you are using ToolJet cloud, please **whitelist** our IP. +::: + +ToolJet requires the following to connect to TypeSense deployment: +- **Host** +- **Port** +- **API Key** +- **Protocol** + +typesense connect + +
    + +
    + +## Querying TypeSense + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Typesence** datasource added in previous step. +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. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +
    + +
    + +## Supported Operations + +### Create a Collection + +With this operation you can easily create `Collections` in your TypeSense cluster. In the schema field, you'll need to define the schema for creating a new collection. Check out TypeSense docs to know more about collections **[here](https://typesense.org/docs/0.22.2/api/collections.html#create-a-collection)** + +#### Required Parameter +- **Schema** + +typesense collection + +#### Example + +```yaml +[ + { "name": "id", "type": "string" }, + { "name": "name", "type": "string" }, + { "name": "price", "type": "float" } +] +``` + +### Index a Document + +Use this operation to index a document to your collection. You'll need to specify the **Collection Name** where you want your document to be indexed and also provide the document data according the schema defined in the collection. Read more about Indexing a document in TypeSense **[here]( +https://typesense.org/docs/0.22.2/api/documents.html#index-a-single-document)**. + +#### Required Parameter +- **Collection** +- **Document** + +typesense index + +```yaml +{ + "id": "1", + "name": "Laptop", + "price": 999.99 +} +``` + +### Search + +Use this operation to perform a search within the specified collection. Know more about the search parameters in the TypeSense doc **[here](https://typesense.org/docs/0.22.2/api/documents.html#search)**. + +#### Required Parameter +- **Collection** + +typesense search + +```yaml +{ + "filter_by": "price:<1000", + "sort_by": "price:desc", + "per_page": 10 +} +``` + +### Get a Document + +Use this operation to fetch an individual document in a collection by providing the `id` of the document. Read more about it **[here](https://typesense.org/docs/0.22.2/api/documents.html#retrieve-a-document)**. + +#### Required Parameter +- **Collection** +- **Id** + +typesense get + + +### Update a Document + +Use this operation to update an individual document by providing the **Collection Name** and **Id** of the document. You'll need to provide the updated document data in the form of specified schema. Check out the TypeSense's doc on updating a document **[here](https://typesense.org/docs/0.22.2/api/documents.html#update-a-document)**. + +#### Required Parameter +- **Collection** +- **Id** +- **Document** + +typesense update + +```yaml +{ + "name": "Gaming Laptop", + "price": 1199.99 +} +``` + +### Delete a Document + +Delete a document from collection by providing the `Id` of the document. Check out the TypeSense's doc on deleting documents **[here](https://typesense.org/docs/0.22.2/api/documents.html#delete-documents)**. + +#### Required Parameter +- **Collection** +- **Id** + +typesense delete + +

    + +:::tip +Make sure that you supply JSON strings instead of JavaScript objects for any document or schema that is being passed to the server, in any of the above operations. +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/woocommerce.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/woocommerce.md new file mode 100644 index 0000000000..246b12f92b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/woocommerce.md @@ -0,0 +1,90 @@ +--- +id: woocommerce +title: WooCommerce +--- + +ToolJet can connect to WooCommerce databases to read and write data. + +
    + +## Connection + +To establish a connection with the WooCommerce 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 WooCommerce as the data source. + +ToolJet requires the following to connect to WooCommerce +- **Host** +- **Consumer key** +- **Consumer secret** + +ToolJet - Data Source - Woocommerce + +:::info +NOTE: For generating keys visit admin dashboard of woocommerce , more info: https://woocommerce.github.io/woocommerce-rest-api-docs/?javascript#authentication +::: + +
    + +
    + +## Querying WooCommerce + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **WooCommerce** datasource added in previous step. +3. Select the desired resource from the dropdown and then select the desired operation 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. + +:::tip +Query results can be transformed using transformations. Read our transformations documentation to see how: **[link](/docs/tutorial/transformations)** +::: + +
    + +
    + +## Resource + +### Customer + +#### Supported Operations + +- **list customer** +- **update customer** +- **delete customer** +- **batch update customer** +- **create customer** +- **retrieve customer** + +### Product + +#### Supported Operations + +- **list product** +- **update product** +- **delete product** +- **batch update product** +- **create product** +- **retrieve product** + +### Order + +#### Supported Operations + +- **list order** +- **update order** +- **delete order** +- **batch update order** +- **create order** +- **retrieve order** + +### Coupon + +#### Supported Operations + +- **list coupon** +- **create coupon** + +:::info +NOTE: For more info visit https://woocommerce.github.io/woocommerce-rest-api-docs/?javascript. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/data-sources/zendesk.md b/docs/versioned_docs/version-3.0.0-LTS/data-sources/zendesk.md new file mode 100644 index 0000000000..1fc7574516 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/data-sources/zendesk.md @@ -0,0 +1,116 @@ +--- +id: zendesk +title: Zendesk +--- + +ToolJet can connect to Zendesk APIs to read and write data using OAuth 2.0, which helps us to limit an application's access to a user's account. + +
    + +## Connection + +To establish a connection with the Zendesk 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 Zendesk as the data source. + +ToolJet connects to your Zendesk app using : +- **Zendesk Sub-domain** +- **Client ID** +- **Client Secret** + +### Authorization Scopes + +You can create a Zendesk data source with one of either of the two permission scopes : +- **Read Only** +- **Read and Write** + +:::info +You must first be a verified user to make Zendesk API requests. This is configured in the Admin Center interface in **Apps and integrations > APIs > Zendesk APIs.** For more information, see Security and Authentication in the [Zendesk Support API reference](https://developer.zendesk.com/api-reference/ticketing/introduction/#security-and-authentication) or [check out Zendesk's docs](https://support.zendesk.com/hc/en-us/articles/4408845965210). +::: + +
    + +
    + +## Querying Zendesk + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the **Zendesk** datasource added in previous step. +3. Select the desired operation 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. + +ToolJet - Data source - Zendesk + +
    + + +
    + +## Supported Operations + +- **[List Tickets](#list-tickets)** +- **[List requested Tickets](#list-requested-tickets)** +- **[Show a Ticket](#show-tickets)** +- **[Update a Ticket](#update-tickets)** +- **[List Users](#list-users)** +- **[Get User](#get-user)** +- **[Search](#search)** + + +### List Tickets +Lists all the tickets in your Zendesk account. + +ToolJet - Data source - Zendesk + +### List Requested Tickets +Lists all the tickets requested by the user. + +#### Required Parameter +- **User ID** + +ToolJet - Data source - Zendesk + +### Show Tickets +Gets a ticket's properties with the given ID, though not the ticket comments. + +#### Required Parameter +- **Ticket ID** + +ToolJet - Data source - Zendesk + +### Update Tickets +Updates a ticket's properties with the given ID. + +#### Required Parameter +- **Ticket ID** +- **Body** + +ToolJet - Data source - Zendesk + +### List Users +Lists all the users in your Zendesk account. + +ToolJet - Data source - Zendesk + +### Get User +Gets a user's profile with the given ID. + +#### Required Parameter +- **User ID** + +ToolJet - Data source - Zendesk + +### Search + +The Search Query uses Zendesk's Search API to return tickets, users, and organizations with defined filters. + +#### Required Parameter +- **Query** + +Common filters include: +- `type:ticket` +- `type:user` +- `type:organization` +- `type:ticket organization:12345 status:open` + +ToolJet - Data source - Zendesk + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/backup/gitsync-backup.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/backup/gitsync-backup.md new file mode 100644 index 0000000000..8f72c6543e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/backup/gitsync-backup.md @@ -0,0 +1,16 @@ +--- +id: gitsync-backup +title: GitSync Backup +--- + +GitSync enables users to back up their applications by pushing changes to a Git repository, ensuring a secured history. Whenever a change is pushed to the git repository, a commit is created. And this changes can be restored in ToolJet easily ensuring smooth back-up and restoring process. For details on configuring GitSync, refer to the **[GitSync Configuration](/docs/development-lifecycle/gitsync/gitsync-config)** guide. + +**Note**: Only the latest pushed version of the application is stored in the git repository, i.e. whenever a new version is pushed to the git repository, only the latest version is stored and all the previous versions are overridden. + +To know how to push changes to a git repository using GitSync, please refer to **[Push Changes to Git Repo](/docs/development-lifecycle/gitsync/push)** guide. + +## Restore Application + +Changes can be pulled from the git repository to restore an application. To know how to pull changes from a git repository using GitSync, please refer to **[Pull Changes from Git Repo](/docs/development-lifecycle/gitsync/pull)** guide. + +**Note:** A restored application from the git repository can't be edited. To edit the application you will need to create a clone of the application. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/cloud/example.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/cloud/example.md new file mode 100644 index 0000000000..dc0fda0597 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/cloud/example.md @@ -0,0 +1,30 @@ +--- +id: example-configuration +title: Example Configuraiton +--- + +This guide will walk you through setting up a multi-environment in ToolJet with a practical example. Imagine **Nexora Enterprises**, a company building an internal application using ToolJet. + +## Configuring Data Source + +In ToolJet, you can configure data sources for each environment, allowing your application to connect to different databases or APIs based on the environment. + +In this case, the company uses data from a Postgres data source for their ToolJet apps, with separate databases for development, staging, and production environments. They need to configure the Postgres data source for each environment in the Data Sources section. For more details, refer to the [Data Source](/docs/data-sources/overview) Documentation. + +self-hosted-env-concept + +## Configuring Constants + +The company also uses different global and secret constants for each environment. Global Constants are reusable values that can be applied consistently across the product, while Secrets are used for securely storing sensitive data. These can be configured in the Workspace Constants section. For more details, check the [Workspace Constants and Secrets](/docs/security/constants/) Documentation. + +self-hosted-env-concept + +## Multi-Environment Setup in ToolJet +- The company can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. +- Now developers can start building applications in the **development environment**, where they create and iterate on new features. In this environment, they have access to the development database, which is configured during data source setup. +- Once the application is ready, it moves to the **staging environment**, where the QA team tests it thoroughly. If any bugs or feedback arise, developers create a new version, implement the necessary changes, and promote the updated application back to staging for further testing. +- The data sources for each environment will be connected based on the configuration set in the previous step. +- For details on managing versions, check the **Version Control Documentation**. +- After successful testing, the application is promoted to **production** and released, making it available to end users. This environment uses the production database set up during data source configuration. + +self-hosted-env-concept \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/cloud/multi-environment.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/cloud/multi-environment.md new file mode 100644 index 0000000000..20d39a31f6 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/cloud/multi-environment.md @@ -0,0 +1,68 @@ +--- +id: multi-environment +title: Multi-Environment +--- + + +Environments in ToolJet help manage different stages of application development, ensuring smooth transitions between development, testing, and production. This guide covers what environments are, their purpose, and how they function in ToolJet. + +Environments make it easier to develop and deploy applications without disrupting production. They keep changes isolated, so testing and debugging can happen without affecting live users. Teams can collaborate more efficiently, as different environments allow them to work independently. + +### What are Environments? + +An environment in ToolJet represents a separate configuration space where **applications**, **data** **sources**, and **constants** can be defined and managed. + +By default, ToolJet provides three environments: + +- **Development**: The Development environment is where application development and initial testing take place. It is a dedicated space for ToolJet developers to build, configure, and experiment with application features. Changes in this environment do not affect live users, allowing for frequent updates and debugging. + +- **Staging**: The Staging environment acts as a pre-production space where applications undergo thorough testing before deployment. It closely resembles the Production environment and helps ensure that all features, performance, and security aspects function as expected. Teams such as QA and product managers use this environment to validate and approve changes before releasing them to end-users. + +- **Production**: The Production environment is the final, live version of the application where end users interact with it. This environment is stable and optimized for performance after thorough testing in the Development and Staging environments. + + +### Multi-Environment Support in ToolJet + +ToolJet provides environment management across different components: + +#### Applications + +Each application has development, staging, and production environments. Developers build the application in the development environment and then move it to staging for testing. Your testing team can review the application in staging, and once it's thoroughly tested, you can promote it to production and release it to your end users. + +#### Data Sources + +Data sources can be configured separately for each environment, allowing applications to connect to different databases or APIs depending on the environment. This ensures secure and structured access to relevant data during each stage of development. + +#### Constants + +Constants such as API keys, credentials, or other configuration variables can be defined uniquely for each environment. This helps maintain security and prevents misconfigurations across different deployment stages. + +### Application Life cycle + +The application lifecycle in ToolJet involves managing applications across different environments development, staging, and production. You can build the application in development environment and promote it to staging for testing. After testing you can promote it to production and release the app for your end-users. + +You can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. + +- **Development** – Developers build and test the application in the ToolJet app builder. + +- **Staging** – The testing or product team validates requirements and tests the application using staging data. Apps and queries cannot be edited in this environment. + +- **Production** – After thorough testing in staging, the application is promoted to production. This can serve as a pre-release environment where you test with production data and constants before releasing the application to end users. Refer to [Release](/docs/development-lifecycle/release/release-rollback) documentation to learn more. + +self-hosted-env-concept + + +### Impacted behavior with environment permission + +Each environment has a different impact on your application. Please refer the following table for details. + +| Action | Development | Staging | Production | +|--------------------|------------|---------|------------| +| Edit versions | ✅ | ❌ | ❌ | +| Rename versions | ✅ | ❌ | ❌ | +| Delete versions | ✅ | ❌ | ❌ | +| Create new versions | ✅ | ❌ | ❌ | +| Promote | ✅ | ✅ | - | + + +Checkout the [Environment-Example](/docs/development-lifecycle/environment/cloud/example-configuration) guide to learn about multi-environment in ToolJet with a practical example. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/example.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/example.md new file mode 100644 index 0000000000..5879783254 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/example.md @@ -0,0 +1,30 @@ +--- +id: example-configuration +title: Example Configuraiton +--- + +This guide will walk you through setting up a multi-environment in ToolJet with a practical example. Imagine **Nexora Enterprises**, a company building an internal application using ToolJet. + +## Configuring Data Source + +In ToolJet, you can configure data sources for each environment, allowing your application to connect to different databases or APIs based on the environment. + +In this case, the company uses data from a Postgres data source for their ToolJet apps, with separate databases for development, staging, and production environments. They need to configure the Postgres data source for each environment in the Data Sources section. For more details, refer to the [Data Source](/docs/data-sources/overview) Documentation. + +self-hosted-env-concept + +## Configuring Constants + +The company also uses different global and secret constants for each environment. Global Constants are reusable values that can be applied consistently across the product, while Secrets are used for securely storing sensitive data. These can be configured in the Workspace Constants section. For more details, check the [Workspace Constants and Secrets](/docs/security/constants/) Documentation. + +self-hosted-env-concept + +## Multi-Environment Setup in ToolJet +- The company can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. +- Now developers can start building applications in the **development environment**, where they create and iterate on new features. In this environment, they have access to the development database, which is configured during data source setup. +- Once the application is ready, it moves to the **staging environment**, where the QA team tests it thoroughly. If any bugs or feedback arise, developers create a new version, implement the necessary changes, and promote the updated application back to staging for further testing. +- The data sources for each environment will be connected based on the configuration set in the previous step. +- For details on managing versions, check the [Version Control Documentation](/docs/development-lifecycle/release/version-control). +- After successful testing, the application is promoted to **production** and released, making it available to end users. This environment uses the production database set up during data source configuration. + +self-hosted-env-concept \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-environment.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-environment.md new file mode 100644 index 0000000000..c0cdb39bb8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-environment.md @@ -0,0 +1,68 @@ +--- +id: multi-environment +title: Multi-Environment +--- + + +Environments in ToolJet help manage different stages of application development, ensuring smooth transitions between development, testing, and production. This guide covers what environments are, their purpose, and how they function in ToolJet. + +Environments make it easier to develop and deploy applications without disrupting production. They keep changes isolated, so testing and debugging can happen without affecting live users. Teams can collaborate more efficiently, as different environments allow them to work independently. + +### What are Environments? + +An environment in ToolJet represents a separate configuration space where **applications**, **data** **sources**, and **constants** can be defined and managed. + +By default, ToolJet provides three environments: + +- **Development**: The Development environment is where application development and initial testing take place. It is a dedicated space for ToolJet developers to build, configure, and experiment with application features. Changes in this environment do not affect live users, allowing for frequent updates and debugging. + +- **Staging**: The Staging environment acts as a pre-production space where applications undergo thorough testing before deployment. It closely resembles the Production environment and helps ensure that all features, performance, and security aspects function as expected. Teams such as QA and product managers use this environment to validate and approve changes before releasing them to end-users. + +- **Production**: The Production environment is the final, live version of the application where end users interact with it. This environment is stable and optimized for performance after thorough testing in the Development and Staging environments. + + +### Multi-Environment Support in ToolJet + +ToolJet provides environment management across different components: + +#### Applications + +Each application has development, staging, and production environments. Developers build the application in the development environment and then move it to staging for testing. Your testing team can review the application in staging, and once it's thoroughly tested, you can promote it to production and release it to your end users. + +#### Data Sources + +Data sources can be configured separately for each environment, allowing applications to connect to different databases or APIs depending on the environment. This ensures secure and structured access to relevant data during each stage of development. + +#### Constants + +Constants such as API keys, credentials, or other configuration variables can be defined uniquely for each environment. This helps maintain security and prevents misconfigurations across different deployment stages. + +### Application Life cycle + +The application lifecycle in ToolJet involves managing applications across different environments development, staging, and production. You can build the application in development environment and promote it to staging for testing. After testing you can promote it to production and release the app for your end-users. + +You can configure data sources and constants for each environment, and ToolJet will automatically use the appropriate ones based on the target environment. + +- **Development** – Developers build and test the application in the ToolJet app builder. + +- **Staging** – The testing or product team validates requirements and tests the application using staging data. Apps and queries cannot be edited in this environment. + +- **Production** – After thorough testing in staging, the application is promoted to production. This can serve as a pre-release environment where you test with production data and constants before releasing the application to end users. Refer to [Release](/docs/development-lifecycle/release/release-rollback) documentation to learn more. + +self-hosted-env-concept + + +### Impacted behavior with environment permission + +Each environment has a different impact on your application. Please refer the following table for details. + +| Action | Development | Staging | Production | +|--------------------|------------|---------|------------| +| Edit versions | ✅ | ❌ | ❌ | +| Rename versions | ✅ | ❌ | ❌ | +| Delete versions | ✅ | ❌ | ❌ | +| Create new versions | ✅ | ❌ | ❌ | +| Promote | ✅ | ✅ | - | + + +Checkout the [Environment-Example](/docs/development-lifecycle/environment/self-hosted/example-configuration) guide to learn about multi-environment in ToolJet with a practical example. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-instance/example.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-instance/example.md new file mode 100644 index 0000000000..b2e5291045 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-instance/example.md @@ -0,0 +1,81 @@ +--- +id: example-configuration +title: Example Configuration +--- + + +In this guide, you'll learn how to migrate applications using GitSync in a multi-instance ToolJet setup through a practical example. + +Vertex Solutions, a company building internal applications with ToolJet, has three ToolJet instances for **development, staging, and production** environments. They have configured Gitsync in all the three instances with GitHub by following the setup instructions given in the [GitSync](/docs/development-lifecycle/gitsync/overview) documentation. + +## Creating the App + +The company wants to create an **Inventory Management System**. A developer starts by clicking **Create New App** on the dashboard. In the modal that appears, they enter the app name and select the **Commit changes** checkbox to save the app to the configured Git repository. Upon clicking **Create App**, the app will be added to your Git repository with a commit message. + +self-hosted-env-concept + +self-hosted-env-concept + +- Developers then build the app in the App Builder by dragging and dropping components and adding relevant queries. Once the changes are complete, they can use the GitSync button in the top bar to push a commit to the Git repository. + +self-hosted-env-concept + + +- Once committed, the updates appear in the Git repository, showing the commit message, author, and timestamp. +self-hosted-env-concept +- The development is done and the app is ready to be pulled into the staging instance for testing. + + +## Importing the App in Staging + +After configuring GitSync for the staging instance with the same Git repository as the development instance, testers can import the app by following these steps: + +- Navigate to the **ToolJet dashboard** of the staging instance. + +- Click on the **three dots** next to the **Create New App** button. +- Select **Import from Git Repository** to pull the app. + self-hosted-env-concept +- Choose the app from the dropdown list. The app name and last commit details appear. + +- Click **Import App** to import it into the staging instance. +self-hosted-env-concept + +- Once the apps are imported into the staging instance, all data sources are imported as well. However, for security reasons, passwords and secrets in the data source configuration are not included. +- To ensure the app functions properly in the staging instance and can be tested with staging data, users must re-enter these details in the configuration. +- After adding the data source configuration, testers can verify the app's features and functionality. The app will open in view-only mode. + +### Iterating and Fixing Issues + +If testers find bugs or require modifications, developers create a **new version** in the development instance. + +self-hosted-env-concept + +When committing a new version via **GitSync**: + +- The JSON file inside the app folder is updated with the version name. + +- The **meta.json** file in the .meta folder is modified with the new version ID and name. +self-hosted-env-concept + +After implementing necessary changes, developers commit the updates to the Git repository. + +### Pulling Updates in Staging + +Testers in the **staging instance** update the app by: + +- Clicking the **GitSync** button in the top bar. + +- A modal appears with an option to **Check for Updates**. +self-hosted-env-concept + +- Clicking **Check for Updates** fetches the latest changes from the Git repository. + +- Commit details (message, author, date) are displayed. + +- Clicking **Pull Changes** syncs the latest updates into the staging instance. + +self-hosted-env-concept + +### Deploying to Production + +Once the application passes testing in staging, it is imported into the **production instance** using the same GitSync process. The application is then released, making it available to end users. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment.md new file mode 100644 index 0000000000..ea4e933e91 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment.md @@ -0,0 +1,29 @@ +--- +id: instance-as-environment +title: Instance as Enviroment +--- + + +In this guide, you will learn to manage a Multi-Instance ToolJet deployment. A Multi-Instance setup allows you to deploy multiple isolated ToolJet instances, each functioning as a separate environment, such as development, staging, and production, to support a structured Software Development Life Cycle (SDLC). In this setup each instance operates independently with a strict isolation of resources, users, and applications. + +## Setting Up Multi-Instance Environments + +To enable a multi-instance setup, you need to deploy separate ToolJet instances on your self-hosted infrastructure. Refer to the [setup](/docs/setup/try-tooljet) guide to learn about ToolJet self-hosted deployments. + +## Migrate applications between Instances + +ToolJet’s GitSync feature helps to migrate applications between instances by pushing and pulling changes through a Git repository. It supports Git providers such as GitHub, GitLab, Gitea and Bitbucket. For setup instructions, refer to the [GitSync documentation](/docs/development-lifecycle/gitsync/overview).With GitSync, users can effortlessly transfer applications between instances by committing and pushing changes to a shared repository. This ensures that once an application is developed in development instance, it can be easily synchronized with other instances like staging and production. + +## Pushing and Pulling Apps Between Instances via GitSync + +### Pushing Changes + +GitSync enables users to commit and push updates from your instance to your Git repository. New apps, renames, and version creations are auto-committed and you can also manually commit changes using the GitSync button in the App Builder. Refer to [Push-Gitsync](/docs/development-lifecycle/gitsync/push) doc to learn more. + +### Pulling Changes + +GitSync allows you to pull updates from a Git repository into your instance. You can import apps from Git through the ToolJet dashboard. Once pulled, the app will be in view-only mode. You can also check for updates, which fetches the latest commits with details like author and date. If updates are available, you can pull changes and sync them. Refer to [Pull-Gitsync](/docs/development-lifecycle/gitsync/pull) doc to learn more.Here is the diagram showing how you can use gitsync to migrate your apps across instances. + +self-hosted-env-concept + +Checkout the [Multi-Instance-Example](/docs/development-lifecycle/environment/self-hosted/multi-instance/example-configuration) guide to learn how to use GitSync for multi-instance setup in ToolJet with a practical example. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/delete-gitsync.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/delete-gitsync.md new file mode 100644 index 0000000000..65daf8c753 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/delete-gitsync.md @@ -0,0 +1,24 @@ +--- +id: delete-gitsync +title: Delete GitSync Configuration +--- + +In ToolJet, GitSync can be enabled, disabled, or deleted based on your requirements. + +- **Enabled**: When GitSync is enabled the users will be able to commit changes to the git repository. +- **Disabled**: + - **Non-Admin Users**: The users will not be able to commit changes to the git repository. They will see a dialogue box that the GitSync feature is not configured and they need to contact the admin to configure it. + - **For admin users**: The users will see a dialogue box with a link to configure the GitSync feature. +- **Delete GitSync Configuration**: Deleting the GitSync configuration will not delete the apps from the git repository. The apps will still be available in the git repository in the same state as they were before the GitSync configuration was deleted. + +## Enable/Disable GitSync + +To enable or disable the GitSync feature, go to the **Configure git** tab on the **Workspace settings** page, and toggle on/off the **Connect** switch. This is only available if the GitSync feature is configured. + +GitSync + +## Delete GitSync Configuration + +To delete the GitSync configuration, go to the **Configure git** tab on the **Workspace settings** page, and click on the **Delete configuration** button. This will delete the SSH key from the ToolJet configuration and the GitSync feature will be disabled. + +GitSync diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/gitsync-config.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/gitsync-config.md new file mode 100644 index 0000000000..1757510dac --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/gitsync-config.md @@ -0,0 +1,72 @@ +--- +id: gitsync-config +title: Configure GitSync +--- + +In this guide, we will explore how to configure GitSync using GitHub as the repository manager. By default GitSync is configured for the **master** branch, but this can be configured to a different branch as well, refer to **[Configuring GitSync on a Different Branch](#configuring-gitsync-on-a-different-branch)** section for more information. + +For more information on using other repository managers, such as GitLab or Gitea, refer to the **[SSH Configuration for Git Repo Manager](/docs/development-lifecycle/gitsync/ssh-config)** guide. + +## Setting up GitSync in ToolJet + +Role Required: **Admin** + +1. **Create a New Repository**
    + Create a new repository on your GitHub. The repository can be public or private. You can also use an existing repository. Make sure that the repository is empty. + GitSync + +2. **Obtain the SSH URL**
    + When a repository is created, GitHub shows a screen with the SSH URL. + GitSync + + OR + + If you are using an existing repository, then you can obtain the URL by clicking on the **Code** button. + GitSync + + To generate the SSH URL for other git repository manager, such as GitLab and Gitea, follow the **[SSH Configuration](/docs/development-lifecycle/gitsync/ssh-config#generating-ssh-url)** guide. + +3. Go to the **Workspace settings**, and click on the **Configure git** tab.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/configure-git`) + + GitLab Repo + +4. Enter the **SSH URL** of the repository in the **Git repo URL** field. + +5. Click on the **Generate SSH key** button, and copy the SSH key that is generated. The SSH key is used to authenticate ToolJet with the repository. + + GitSync + + There are two types of generated SSH keys: + - **ED25519**: This is a secure and efficient algorithm that is used for generating SSH keys. It is recommended to use this key type. VCS providers like GitHub and GitLab recommend using this key type + - **RSA**: This is an older algorithm that is used for generating SSH keys. It is not recommended to use this key type. Providers like Bitbucket recommend using this key type.

    + + GitSync + +6. Go to the **Settings** tab of the GitHub repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. + GitSync + +7. Enter a title for the SSH key in the **Title** field. + +8. Paste the SSH key generated from the ToolJet. + +9. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). + +10. Finally, click on the **Add key** button. + GitSync + + To deploy the SSH key for other git repository manager, such as GitLab and Gitea, follow the **[SSH Configuration](/docs/development-lifecycle/gitsync/ssh-config#deploy-the-ssh-key)** guide. + +11. After deploying the SSH Key, go to the **Configure git** tab on ToolJet, and click on the **Finalize setup** button. If the SSH key is configured correctly, you will see a success message. + GitSync + +## Configuring GitSync on a Different Branch + +Starting from version **v3.5.3-ee-lts**, GitSync in ToolJet supports custom branches. This feature is available only in the Self-Hosted version of ToolJet. The custom branch for GitSync is configured at the instance level via an environment variable. + +Different repositories can be configured for different workspaces, but the custom branch set in the **.env** file must be present in all configured repositories to ensure smooth operation. The branch specified in the **.env** file will apply to all workspaces with GitSync support. + +To configure a custom branch for GitSync, you need to set the following environment variable in your **.env** file:
    +`GITSYNC_TARGET_BRANCH` = **branch-name** + +**Note:** **Existing GitSync users** who want to use a custom Git branch must first create a new custom branch from the master branch in the Git repository manager. Then, they must configure the branch name in the **.env** file to ensure all operations work smoothly. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/overview.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/overview.md new file mode 100644 index 0000000000..779f42aa80 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/overview.md @@ -0,0 +1,26 @@ +--- +id: overview +title: GitSync Overview +--- + +
    + Icon + Paid feature +
    + +The GitSync feature in ToolJet allows seamless synchronization of workspace applications with a Git repository, enhancing version control, environment migration, and backup management. It supports both cloud-based and self-hosted Git providers offering flexibility in managing application development and deployment. GitSync can also be configured for a custom branch. Refer to **[Configure GitSync](/docs/development-lifecycle/gitsync/gitsync-config)** guide for more information. + +## Key Use-Cases + +### Application Migration + +GitSync can be used to facilitate the movement of application across different ToolJet instances such as from development to staging to production. Users can effortlessly transfer their applications across instances by pushing changes to a Git repository. This means that once an application is developed in one instance, it can be easily moved to another by simply syncing with the repository, ensuring a smooth transition without the need for manual configurations. Refer to the **[multi-instance](/docs/development-lifecycle/gitsync/gitsync-config)** guide for detailed steps. + +### Backup of Apps + +GitSync provides a straightforward solution for creating backups of your applications. By pushing changes to a Git repository, users can ensure a secure and versioned history of their application. This serves as a reliable backup mechanism, safeguarding against accidental application/version deletion or corruption. Refer to **[GitSync Backup](/docs/development-lifecycle/backup/gitsync-backup)** guide for more information. diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/pull.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/pull.md new file mode 100644 index 0000000000..ff8e42bd87 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/pull.md @@ -0,0 +1,34 @@ +--- +id: pull +title: Pull Changes from Git Repo +--- + +Once the GitSync is configured and the changes are committed to the git repository, after that the changes can be pulled from the git repository to restore the application or to use multi instance as multi environment. + +## Restore Application + +To restore an application from a git repository, click on the kebab menu (three dots) on the right side of the **Create new app** button on the dashboard. Click on the **Import from git repository** option. + +GitSync + +On clicking the **Import from git repository** option, a modal will open with the dropdown to select the app to be imported from the git repository. Once the app is selected, the app name and the last commit will be displayed. Click on the **Import app** button to import the app from the git repository. + +GitSync + +**Note**: +- The app imported from the git repository cannot be edited. To edit the application, you will need to clone it. +- The app imported from the Git repository should have a unique name. If the app's name is the same as that of an existing app in the workspace, the user will need to either rename the existing app or delete it to successfully import another app with the same name. +- Workspace constants are not synced with the git repository. After pulling the app, if the app throws an error, the user will need to manually add the workspace constants. + +## Pull Changes + +You can check for updates and pull changes from the git repository by following these steps: + +1. Click on the **GitSync** button, a modal will open with the option to **Check for updates**. + +2. Click on the **Check for updates** button to check for updates in the git repository. If there are any updates, you will see the details of the updates such as commit message, author, and the date in the modal. + +3. Click on the **Pull changes** button to pull the changes from the git repository. + + GitSync + diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/push.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/push.md new file mode 100644 index 0000000000..31d359c11d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/push.md @@ -0,0 +1,134 @@ +--- +id: push +title: Push Changes to Git Repo +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +Once the GitSync feature is configured, you can start pushing changes to the git repository on following points: + +- [App Creation](#app-creation) +- [Manual Commit Using GitSync Button](#manual-commit-using-gitsync-button) +- [Auto Commit on App Rename](#auto-commit-on-app-rename) +- [App Version Update](#app-version-update) +- [Auto Commit on Promoting Environment](#auto-commit-on-promoting-environment) +- [App Deletion](#app-deletion) + +## App Creation + +Whenever you create a new app, you will see an option to select the **Commit changes**. If you select the **commit changes** option, the changes will be committed to the git repository. + +**Note**: If the app name is same as the name of an existing app in the git repo, it will overwrite the existing app in the git repo. + +GitLab SSH Key + +Selecting the **Commit changes** option will create a new commit in the git repository. The commit message will be `App creation` and the author will be the user who created the app. + +During app creation, a **.meta** folder is generated, containing a **meta.json** file with details of the last commit. Then, an app folder is also created, storing **v1.json**, which holds app-specific details of v1 version. + + + + + + GitSync + + + + + + GitSync + + + + + +## Manual Commit Using GitSync Button + +Whenever a user makes a change in an app, they can make a commit to the git repository by following these steps: + +1. After making the changes, click on the **GitSync** button on the topbar. + GitSync Button + +2. On clicking the **GitSync** button, a modal will open with the option to enter the commit message. + GitSync Commit Message + +3. Enter the commit message and click on the **Commit changes** button to commit the changes to the git repository. + +Along with the commit message, the user can also see the connected **Git repo URL** and the last commit details. **Last commit details** helps the user to know the last commit message, author, date, and time. This helps the user to know the last commit details and make the commit message accordingly. + +Once the changes are committed, the user can see the commit message, author, and date in the git repository. + + + + + + GitSync + + + + + + GitSync + + + + + +## Auto Commit on App Rename + +Whenever an app is renamed, the changes will be automatically committed to the git repository. The commit message will be `App is renamed` and the author will be the user who renamed the app. Similarly an auto commit is generated whenever the version is renamed. + + + + + + GitSync + + + + + + GitSync + + + + + +## App Version Update + +Whenever a user creates a new version of an app, there will be an option to select **Commit changes**. If the user selects **commit changes** option, the new version of the app will be committed to the git repository and the old version will be overridden. + +GitLab SSH Key + +The **JSON** file in the app folder will be replaced with the new version of the app, the **meta.json** file in the **.meta** folder gets updated with the new version id and version name. The commit message will be **Version creation** and the author will be the user who created the new version of the app. + + + + + + GitSync + + + + + + GitSync + + + + + +## Auto Commit on Promoting Environment + +When you promote an environment, from **Development to Staging**, the changes will be automatically committed to the git repository. The commit message will be ` Version of promoted from to `. The author will be the user who promoted the environment. When you promote an environment, from **Staging to Production**, no changes will be committed to the git repository. + +GitSync + +This option can be enabled or disabled from the **Configure git** tab on the **Workspace settings** page. By default, this option is disabled. + +GitSync + +## App Deletion + +Whenever a user delete an app from the workspace, the app will not be deleted from the git repository. The app will be available in the git repository in the same state as it was before the app was deleted. diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/ssh-config.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/ssh-config.md new file mode 100644 index 0000000000..7968b77f3f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/gitsync/ssh-config.md @@ -0,0 +1,119 @@ +--- +id: ssh-config +title: SSH Configuration for Git Repo Manager +--- + +To configure a Git Manager with ToolJet using GitSync, you need the SSH URL from the Git Manager and then deploy the SSH key generated by ToolJet. You can use any Git Manager (cloud-based or self-hosted) that follows standard Git protocols. In this guide, we will cover the configuration for GitHub, GitLab, and Gitea. + +## Generating SSH URL + +### GitHub + +1. **Create a New Repository**
    + Create a new repository on your GitHub. The repository can be public or private. You can also use an existing repository. Make sure that the repository is empty and the default branch name should be **master**. + GitSync + +2. **Obtain the SSH URL**
    + When a repository is created, GitHub shows a screen with the SSH URL. + GitSync + + OR + + If you are using an existing repository, then you can obtain the URL by clicking on the **Code** button. + GitSync + +### GitLab + +1. **Create a New Repository**
    + Create a new repository on your GitLab. The repository can be public or private. You can also use an existing repository. Make sure that the repository is empty and the default branch name should be **master**. + GitSync + +2. **Obtain the SSH URL**
    + On GitLab, you can obtain the URL by clicking on the **Clone** button and selecting the **SSH** option. + GitSync + +### Gitea + +1. **Create a New Repository**
    + Create a new repository on your Gitea. You can also use an existing repository. Make sure that the repository is empty and the default branch name should be **master**. + GitSync + +2. **Obtain the SSH URL**
    + When a repository is created, Gitea shows a screen with the SSH URL. + GitSync + + +## Deploy the SSH Key + +### GitHub + +1. Go to the **Settings** tab of the GitHub repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. + GitSync + +2. Enter a title for the SSH key in the **Title** field. + +3. Paste the SSH key generated from the ToolJet. + +4. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). + +5. Finally, click on the **Add key** button. + GitSync + +### GitLab + +You have two options for adding the SSH key to GitLab, you can either add it globally to access all your repositories or deploy it for a specific repository. + +#### Option 1: Add as a User-Wide SSH Key + +Use this option for access to all your repositories. + +1. Click on your avatar in the top-left corner and select **Edit Profile**. + +2. Navigate to the **SSH Keys** tab and click the **Add new key** button. + GitLab SSH Key + +3. In the **Key** field, paste the SSH key you generated from the ToolJet. + +4. Give your key a descriptive title. + +5. Set **Usage type** to **Authentication & signing**. + +6. Optionally, set an expiration date. + +7. Click **Add key** to save. + GitLab SSH Key + +#### Option 2: Add as a Deploy Key + +Use this option for access to a specific repository only. + +1. Navigate to the repository you want to add the key to. + +2. Click on the **Settings** tab and select **Repository**. + +3. Once you are in the **Repository Settings**, expand the **Deploy Keys** section. + +4. Click on the **Add new deploy key** button. + +5. Give your key a descriptive title. + +6. In the **Key** field, paste the SSH key you generated in ToolJet's Configure Git tab during the previous step. + +7. Enable the **Grant write permissions to this key** checkbox. We need this permission to push changes to the repository. + +8. Click **Add key** to save. + GitLab Deploy Key + +### Gitea + +1. Go to the **Settings** tab of the Gitea repository, and click on the **Deploy keys** tab. Click on the **Add deploy key** button. + GitSync + +2. Enter a title for the SSH key in the **Title** field. + +3. Paste the SSH key generated from the ToolJet. + +4. Make sure that the **Allow write access** checkbox is checked, especially when configuring the GitSync feature to [push changes to Git](/docs/development-lifecycle/gitsync/push). However, it is not mandatory to check this option when setting up the GitSync feature for [pulling changes from Git](/docs/development-lifecycle/gitsync/pull). + +5. Finally, click on the **Add Deploy key** button. + GitSync diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/overview.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/overview.md new file mode 100644 index 0000000000..334eda3073 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/overview.md @@ -0,0 +1,27 @@ +--- +id: overview +title: Overview +--- + +This guide outlines the development life cycle for ToolJet deployments, explaining its importance and how ToolJet manages it efficiently. + +A development life cycle (also known as the software development life cycle or SDLC) is a structured framework that ensures software is built, deployed, and maintained efficiently. It helps teams manage changes, collaborate effectively, and maintain stability in production environments. A well-defined development life cycle enhances software quality, improves efficiency, facilitates better collaboration between teams, reduces costs by catching issues early, and ensures long-term maintainability. + +## Development Life Cycle in ToolJet + +ToolJet enables teams to manage application changes and deployments effectively through its Environment and Version Management system. Key aspects of managing the development life cycle in ToolJet include: + +### Release Management + +Using ToolJet's release management, you can create multiple **[versions](/docs/development-lifecycle/release/version-control)** of your application and easily **[release](/docs/development-lifecycle/release/release-rollback)** the latest version with new features, fixes, and enhancements. ToolJet also enables you to **[roll back](#)** to a previous stable version if needed. Additionally, ToolJet lets you **[share your application](/docs/development-lifecycle/release/share-app)** in multiple ways. + +### GitSync + +In ToolJet, you can use **[GitSync](/docs/development-lifecycle/gitsync/overview)** to maintain a history and **[backup](/docs/development-lifecycle/backup/gitsync-backup)** of your application. By integrating with Git repositories, you can ensure that your application remains secure, organized, and easily manageable over time. + +### Environment Management +ToolJet comes with three predefined environments: **development, staging, and production**. These environments apply to applications, data sources, and constants, ensuring controlled testing before deployment.For more details, refer to the [Environments Documentation](/docs/development-lifecycle/environment/self-hosted/multi-environment) + + +### Multi-Instance Environments +You can deploy multiple ToolJet instances where each acts as a different environment. This setup isolates all resources as well as users across the instances. For more details, refer to the [Multi-Instance Environments](/docs/development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment) Documentation. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/release-rollback.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/release-rollback.md new file mode 100644 index 0000000000..caacf1e544 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/release-rollback.md @@ -0,0 +1,39 @@ +--- +id: release-rollback +title: Release and Rollback +--- + +ToolJet allows you to **[release and share](#release)** your application and **[rollback](#rollback)** to a stable version whenever needed. + +## Release + +Releasing an app in ToolJet makes the selected version available to end users, allowing them to access and use the application for their tasks. This ensures a controlled rollout of features and bug fixes while ensuring that users have access to the latest version of the app. After an application is released it can be accessed in multiple ways, refer to **[Share an Application](/docs/development-lifecycle/release/share-app)** guide for more information. + +### Steps to Release an App + +1. Promote the required version to the **[production environment](/docs/development-lifecycle/environment/self-hosted/multi-environment)**. + +2. Click on the Release button at the top-right corner. + release + +3. A confirmation dialog will popup that prompts you to decide whether to release the current version of the app. Clicking on the **Release** button will release the current version of the app. + release + +## Rollback + +The Rollback feature in ToolJet allows you to revert to a previously stable version of your app whenever needed. Whether fixing bugs, resolving errors, or addressing unexpected issues after a release, rollback ensures minimal disruption to end users. It instantly restores a prior version while keeping the application's URL the same, allowing the team to maintain application stability while debugging the faulty version offline. + +For example, after releasing a new version v1.2.0, users report failures of the form component. Using ToolJet’s version rollback, the team can quickly rollback to the stable version v1.1.0, restoring functionality within minutes. This minimizes downtime, and allows developers to debug the faulty version offline. + +### Steps to Rollback + +1. Go to the **App Version Manager** from the toolbar and click on the dropdown. It will display all the available versions of the app. The released version name will be in green color. + app version + +2. Choose the desired stable version from the dropdown. + +3. Click on the Release button at the top-right corner. + release + +4. A confirmation dialog will popup that prompts you to decide whether to release the current version of the app. Clicking on the **Release** button will release the current version of the app. + release diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/share-app.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/share-app.md new file mode 100644 index 0000000000..eefc5d6c1c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/share-app.md @@ -0,0 +1,30 @@ +--- +id: share-app +title: Share Application +--- + +Once the application is released, it can be shared with the end users in multiple ways, including via a direct URL, through the ToolJet dashboard, or by embedding it into another application. + +## Share Application via URL + +Once the application is released, it can be accessed via a URL, and the URL slug can be customized. ToolJet also provides an option to make the application public or private. + +- **Public Application**: Allows anyone on the internet to access the application without signing up for ToolJet. +- **Private Application**: Private applications are restricted to workspace users with the necessary **[access permissions](/docs/user-management/role-based-access/access-control)**. + +The latest released version of the application is always accessible through the same URL, ensuring a consistent access point across updates. + +Share Application Modal + +## Access Application via Dashboard + +Users can launch the released version of the application from the dashboard. The application can also be hidden from the dashboard for end users. Refer to the **[Access Control](/docs/user-management/role-based-access/access-control)** guide for more details. + +Access Application via Dashboard + +## Embed Application + +ToolJet applications can be embedded into other web applications using iframes. To embed an application, make the app public, after which ToolJet will automatically generate an iframe code snippet for integration. + +Embed application using Iframe + diff --git a/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/version-control.md b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/version-control.md new file mode 100644 index 0000000000..b5c0320ff3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/development-lifecycle/release/version-control.md @@ -0,0 +1,38 @@ +--- +id: version-control +title: Version Control +--- + +Version Control in ToolJet helps you to maintain multiple versions of the application, do iterative development, and deploy updates systematically. It ensures stability, and allows seamless rollout of new features or fixes. + +For example, to experiment a new feature, you can create a new version of the application and try it out, without disturbing the released application. And after through testing you can release this version. This minimizes downtime, and allows developers to experiment and debug the new feature without disrupting users. + +Each version is isolated from the others and can have different environments, such as development, staging, or production. Check out the **[Multi-Environment](/docs/development-lifecycle/environment/self-hosted/multi-environment)** guide for more information. Versions can also be used to rollback to a stable version if needed, checkout **[release and rollback](/docs/development-lifecycle/release/release-rollback)** guide for more information. + +## Creating a Version + +You can create new versions from App Version Manager in the top. It displays the current version of the app and can be used to switch between the different versions of the app. To create a new version: + +1. Go to the **App Version Manager** from the toolbar and click on the dropdown. It will display all the available versions of the app. The released version name will be in green color. + app version + +2. Click on **Create new version** button at the bottom of the dropdown and a modal will pop-up. + +3. Enter a **Version Name**. + +4. Select the **Create version from** dropdown that will include all the versions of the app, choose a version from the dropdown that you want to use for your new version or ToolJet will automatically select the last created version. + +5. Click on **Create new version** button to add a new version. + modal + +## Renaming a Version + +To change the name of an app version, navigate to the version manager and select the version you wish to rename. From there, you can click on the rename icon located beside the version name. This will open a modal where you can modify the version name to your desired choice. + +version dropdown + +## Deleting a Version + +To remove an app version, go to the version manager and locate the version you wish to delete from the dropdown menu. Next to the version, you will find a delete icon. Click on it to delete the version. Released version cannot be deleted. + +version dropdown diff --git a/docs/versioned_docs/version-3.0.0-LTS/doc-home-page.mdx b/docs/versioned_docs/version-3.0.0-LTS/doc-home-page.mdx new file mode 100644 index 0000000000..fa371c2199 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/doc-home-page.mdx @@ -0,0 +1,343 @@ +--- +description: Home Page +hide_table_of_contents: true +sidebar_label: Home +title: Home +slug: / +--- + +import './homepage.css'; +import { ArrowRight } from 'lucide-react'; +import gettingStartedImage from '../../src/pages/getting-started.png'; +import { + textLabels, + featureCards, + setupCards, + deployOptions, + dataCards, + organizationCards, + releaseCards, + resourceCards, + sectionCards +} from './homePageData'; +import Link from '@docusaurus/Link'; + +{/* // Reusable components */} +export const Card = ({ className = '', href, children }) => { + const cardContent = ( +
    +
    +
    +
    + {children} +
    +
    + ); + + return href ? ( + + {cardContent} + + ) : cardContent; +}; + +export const CardHeader = ({ className = '', children }) => ( +
    + {children} +
    +); + +export const CardContent = ({ className = '', children }) => ( +
    + {children} +
    +); + +export const CardTitle = ({ className = '', children }) => ( +

    + {children} +

    +); + +export const Button = ({ + variant = "default", + className = '', + children, +}) => { + const baseStyles = "cursor-pointer inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 disabled:pointer-events-none ring-offset-background"; + const variantStyles = { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + outline: "border border-input hover:bg-accent hover:text-accent-foreground", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary border-none", + }; + + return ( +
    + +
    + ); +}; + +export const IconCard = ({ icon: Icon, title, content, color, href }) => ( + +
    + +
    + +
    + {title} +
    + +

    {content}

    +
    +
    +
    +); + +export const SmallCard = ({ icon: Icon, title, href }) => ( + +
    +
    +
    + +
    + {title} +
    +
    +
    +); + +export const SectionContainer = ({ title, description, children }) => ( +
    +

    {title}

    +

    {description}

    + {children} +
    +); + +{/* // Main component */} + +# +
    +
    +
    +
    + + {/* Background shapes */} +
    + {/* Child component 1 */} +
    + {/* Child component 2 */} +
    + {/* Child component 3 */} +
    +
    +{/* ToolJet Documentation Section */} +
    +
    +

    + {textLabels.title.prefix} {textLabels.title.highlight} +

    +

    + {textLabels.subtitle} +

    +
    + +
    + {featureCards.map((card, index) => ( + + ))} +
    + + {/* Getting Started Section */} + +
    + {/* Hover Gradient Overlay */} +
    + + {/* Image Container */} +
    + Getting Started +
    + + {/* Text Container */} +
    +

    + {sectionCards.gettingStarted.title} +

    +

    + {sectionCards.gettingStarted.description} +

    +
    +
    + + + +
    +
    + +
    + {/* Setup ToolJet Section */} + +
    + {setupCards.map((card, index) => ( + + ))} +
    +
    + + {/* Deploy on Section */} + +
    + {deployOptions.map((option, index) => ( + + ))} +
    +
    + + {/* Explore more details link */} +
    + + + +
    + + {/* Bring your data to ToolJet section */} + +
    + {dataCards.map((card, index) => ( + + ))} +
    +
    + + {/* Manage your organization section */} + + +
    + {organizationCards.map((card, index) => ( + + ))} +
    +
    + + {/* Manage releases section */} + + +
    + {releaseCards.map((card, index) => ( + + ))} +
    +
    + + {/* Additional resources section */} + + +
    + {resourceCards.map((card, index) => ( + + ))} +
    +
    +
    +
    +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/getting-started/platform-overview.md b/docs/versioned_docs/version-3.0.0-LTS/getting-started/platform-overview.md new file mode 100644 index 0000000000..2853270463 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/getting-started/platform-overview.md @@ -0,0 +1,127 @@ +--- +id: platform-overview +title: Platform Overview +--- +
    + +## What is ToolJet? + +ToolJet is a low-code platform that enables developers to rapidly build and deploy custom internal tools. It has a drag-and-drop app builder with 45 pre-built components, so developers can create complex applications in minutes. ToolJet also connects to most popular data sources and APIs out of the box, and it has a group-based permission system for easy user access management. ToolJet also comes with a lot of other features, but for now, let’s build a basic ToolJet app. + +
    + +
    + +## How ToolJet Works: + +
    + Platform Overview +
    + +**With ToolJet, you can streamline app development with 4 core steps:**
    + +**Connect Data Sources**: Leverage ToolJet's robust integration features to connect with any data source. The platform supports seamless data integration across over 50 different applications, databases, and APIs. + +**Design Stunning Interfaces**: Drag and drop UI components like Tables, Charts, Forms, and more build custom applications in minutes. Integrate these components with data sources and incorporate business logic through JavaScript or Python. + +**Automate Complex Workflows**: Develop multi-step workflows in ToolJet to automate business processes. In addition to building and automating workflows, ToolJet allows for easy integration of these workflows within your applications. + +**Secure and Manage**: Secure your internal tools with detailed permissions settings and audit logs. Maintain quality and consistency with version control, and keep track of performance with comprehensive observability tools. + +
    + +
    + +Below is a detailed overview of ToolJet's key functionalities, demonstrating how ToolJet helps teams to build more with less effort and greater efficiency. + +### Visual App Builder +Enables the creation of visually appealing front-ends with a drag-and-drop interface and pre-built components. + +
    + App-Builder +
    + +
    + +
    + +### Integrations +Offers seamless integration with a wide range of data sources, including over 50 applications, databases, and APIs. + +
    + Integrations +
    + +
    + +
    + +### ToolJet Database +A robust, scalable database solution built atop PostgreSQL. It allows for no-code database management, enabling users to build, manage, and scale databases effortlessly. + +
    + ToolJet Database +
    + +
    + +
    + +### Workflow Automation +Simplifies the automation of complex manual business processes, reducing the engineering effort required. + + +
    + Workflows +
    + +
    + +
    + +### Enterprise-Grade Security +Designed with advanced security features and a scalable infrastructure to meet the needs of enterprise teams. + + +
    + Security +
    + +
    + +
    + +### SSO Support + +Single Sign-On (SSO) capabilities, supporting a variety of providers including Okta, Google, Azure AD, and OpenID Connect. + +
    + SSO Support +
    + +
    + +
    + +### Multiple Environments +Creation and management of multiple environments for efficient application lifecycle management, allowing different stages like development, testing, and production to be handled seamlessly. + +
    + SSO Support +
    + +
    + +
    + +### Multiplayer Editing + +Multiple users can collaboratively work on app development in real-time. Simultaneous edits and contributions from different team members streamlines the development process and fosters a more dynamic and interactive workspace + +
    + Multiplayer Editing +
    + +
    + +Whether you're a seasoned developer or a business professional, ToolJet stands out as a comprehensive solution to fast-track your internal tool development process. \ No newline at end of file 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 new file mode 100644 index 0000000000..134845be9f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/getting-started/quickstart-guide.md @@ -0,0 +1,163 @@ +--- +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)**
    +**[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)**
    +**[6. Use Events to Trigger Queries](#6-use-events-to-trigger-queries)**
    +**[7. Preview, Release and Share](#7-preview-release-and-share)**
    + +
    + + + +### 1. Create Your First Application + +To begin, create a free **[ToolJet](https://www.tooljet.ai/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. + + + +
    + +
    + +### 2. Create a Database Table +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: firstname, lastname, email, phone, department, position, joining, and status. +- Add a few employee records in the database table as placeholder data. + +
    + +
    + +### 3. Create a Query to Fetch Data + +To display employees in the application, you will first have to fetch the data from the database using a query. + +
    + +
    +
    + +- 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. +- To automatically run the query when the app starts, enable the toggle for Run this query on application load? setting. +- Click on the **Run** button to fetch data. + +
    + +
    + +### 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. + +
    + +
    +
    + +- Click on the Table component to open its properties panel. +- Under the Data property, enter the below code: + +```js +{{queries.getEmployees.data}} +``` + +Now the Table component is filled with the data returned by the *getEmployees* query. + +
    + +
    + +### 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. + +
    + +
    +
    + +- 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*. +- Click on **Add Column** to add the required columns. +- Enter the code below for **email** and **firstname** column keys: + +```js +{{components.table1.newRows[0].email}} +{{components.table1.newRows[0].firstname}} +... +``` + +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. + +
    + +
    +
    + +- In the *addEmployees* query's configuration, scroll down and 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. +- 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. + +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. + +
    + +
    + +### 7. Preview, Release, and Share + +The preview, release and share buttons are at the top-right of the App-Builder. + +
    + Preview And Share +
    + +- Click on the **Preview** button on the top-right of app builder to review how your application is coming along during development. +- 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. + +To learn more about how ToolJet works, explore the subjects covered in **[ToolJet Concepts](/docs/tooljet-concepts/what-are-components)**. + +
    + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/homePageData.js b/docs/versioned_docs/version-3.0.0-LTS/homePageData.js new file mode 100644 index 0000000000..97f976f3b3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/homePageData.js @@ -0,0 +1,219 @@ +import { + BrainCircuit, Grid3x3, Database, Workflow, Cog, Target, Scale, + Layers, FileSpreadsheet, Folder, Wand2, LayoutDashboard, Users, UserCheck, + Lock, UserPlus, ScrollText, Megaphone, Gem, Mail, GitBranch, + Box, GitMerge, ShoppingBag, Wand, Flag, ShieldCheck, Cloud, Container, Boxes, Server, Telescope, Globe +} from 'lucide-react'; + +export const featureCards = [ + { + icon: BrainCircuit, + title: "Build with AI", + color: "text-blue-500", + content: "Build applications effortlessly using natural language to generate and customize apps.", + href: "/docs/build-with-ai/overview" + }, + { + icon: Grid3x3, + title: "App Builder", + color: "text-blue-500", + content: "Design and create applications with ToolJet's intuitive app builder, featuring a drag-and-drop interface and powerful pre-built components to streamline development.", + href: "/docs/app-builder/overview" + }, + { + icon: Database, + title: "ToolJet Database", + color: "text-blue-500", + content: "Powered by PostgreSQL, offering a user-friendly UI editor. ToolJet Database allows you to manage, edit, and interact with your data directly within the platform.", + href: "/docs/tooljet-db/tooljet-database" + }, + { + icon: Workflow, + title: "Workflows", + color: "text-blue-500", + content: "Automate processes and define workflows with precision, allowing your apps to handle tasks intelligently.", + href: "/docs/workflows/overview" + } +]; + +export const setupCards = [ + { + icon: Cog, + title: "Try ToolJet", + color: "text-blue-500", + content: "Get started with ToolJet in under 2 minutes by running it with Docker. Experience a seamless setup and explore the full capabilities of ToolJet.", + href: "/docs/setup/try-tooljet" + }, + { + icon: Cog, + title: "System Requirements", + color: "text-blue-500", + content: "Ensure your system meets the requirements for running ToolJet. Check hardware and software specifications to get the best performance.", + href: "/docs/setup/system-requirements" + }, + { + icon: Target, + title: "Choose Your ToolJet", + color: "text-blue-500", + content: "Discover the ideal ToolJet version for your development needs. Choose between our LTS versions or explore Pre-Release versions.", + href: "/docs/setup/choose-your-tooljet/" + }, + { + icon: Scale, + title: "Upgrade to LTS", + color: "text-blue-500", + content: "Upgrade to the Long Term Support (LTS) version of ToolJet for extended support, stability, and access to critical updates.", + href: "/docs/setup/upgrade-to-lts" + } +]; + +export const deployOptions = [ + { icon: Cloud, title: "DigitalOcean", href: "/docs/setup/digitalocean" }, + { icon: Container, title: "Docker", href: "/docs/setup/docker" }, + { icon: Server, title: "AWS EC2", href: "/docs/setup/ec2" }, + { icon: Server, title: "AWS ECS", href: "/docs/setup/ecs" }, + { icon: Server, title: "Openshift", href: "/docs/setup/openshift" }, + { icon: Telescope, title: "Helm", href: "/docs/setup/helm" }, + { icon: Boxes, title: "Kubernetes", href: "/docs/setup/kubernetes" }, + { icon: Globe, title: "Kubernetes (GKE)", href: "/docs/setup/kubernetes-gke" }, + { icon: Globe, title: "Kubernetes (AKS)", href: "/docs/setup/kubernetes-aks" }, + { icon: Globe, title: "Kubernetes (EKS)", href: "/docs/setup/kubernetes-eks" }, + { icon: Globe, title: "Azure Container Apps", href: "/docs/setup/azure-container" }, + { icon: Globe, title: "Google Cloud Run", href: "/docs/setup/google-cloud-run" }, + + +]; + +export const dataCards = [ + { + icon: Layers, + title: "Overview", + color: "text-blue-500", + content: "Gain a broad understanding on connecting various data sources to ToolJet.", + href: "/docs/data-sources/overview" + }, + { + icon: FileSpreadsheet, + title: "Sample Data Source", + color: "text-blue-500", + content: "Explore sample data sources to quickly integrate with ToolJet. Test features and workflows using predefined datasets.", + href: "/docs/data-sources/sample-data-sources" + }, + { + icon: Folder, + title: "Data Source Library", + color: "text-blue-500", + content: "Browse ToolJet's data source library to connect with databases, APIs, and external services seamlessly.", + href: "/docs/tooljet-concepts/what-are-datasources/" + }, + { + icon: Wand2, + title: "Transformation", + color: "text-blue-500", + content: "Leverage ToolJet's transformation capabilities to manipulate and format data from various sources with ease.", + href: "/docs/tutorial/transformations/" + } +]; + +export const organizationCards = [ + { icon: Users, title: "Workspaces", href: "/docs/tj-setup/workspaces" }, + { icon: UserCheck, title: "User authentication", href: "/docs/user-management/authentication/self-hosted/overview" }, + { icon: Lock, title: "Permissions", href: "/docs/user-management/role-based-access/access-control" }, + { icon: UserPlus, title: "Users and groups", href: "/docs/user-management/role-based-access/user-roles" }, + { icon: ScrollText, title: "Audit logs", href: "/docs/security/audit-logs" }, + { icon: Megaphone, title: "White label", href: "/docs/tj-setup/org-branding/white-labeling" }, + { icon: Gem, title: "Super admin", href: "/docs/user-management/role-based-access/super-admin" }, + { icon: Mail, title: "Licensing", href: "/docs/tj-setup/licensing/self-hosted" } +]; + +export const releaseCards = [ + { + icon: GitBranch, + title: "Git Sync", + color: "text-blue-500", + content: "Sync your ToolJet projects with Git repositories, enabling version control and collaboration across teams.", + href: "/docs/development-lifecycle/gitsync/overview" + }, + { + icon: Box, + title: "Multi-Environment", + color: "text-blue-500", + content: "Easily manage and deploy applications across multiple environments, ensuring smooth transitions between development, staging, and production.", + href: "/docs/development-lifecycle/environment/self-hosted/multi-environment" + }, + { + icon: GitMerge, + title: "Versioning and Release", + color: "text-blue-500", + content: "Implement version control and release management to track changes, roll back updates, and maintain stable app deployments.", + href: "/docs/development-lifecycle/release/version-control" + } +]; + +export const resourceCards = [ + { + icon: ShoppingBag, + title: "Marketplace", + color: "text-blue-500", + content: "Discover a variety of plugins, extensions and integrations in ToolJet's marketplace to enhance your app-building experience.", + href: "/docs/marketplace/marketplace-overview" + }, + { + icon: Flag, + title: "Tracking", + color: "text-blue-5000", + content: "ToolJet ensures privacy by acting as a proxy, never storing data, and offers anonymous tracking with feature controls.", + href: "/docs/tracking" + }, + { + icon: ShieldCheck, + title: "Security", + color: "text-blue-500", + content: "ToolJet ensures data security with SOC 2 compliance, encryption, and secure credential handling, never storing your data.", + href: "/docs/security/compliance" + } +]; + +export const textLabels = { + title: { + prefix: "ToolJet", + highlight: "Documentation" + }, + subtitle: "Learn how to get up and running with ToolJet", + gettingStarted: { + title: "Getting Started", + description: "Discover how to create and publish apps within minutes" + }, + setupToolJet: { + title: "Setup ToolJet", + description: "Learn about the different methods you can use to deploy ToolJet" + }, + deployOn: { + title: "Deployment" + }, + exploreMore: "Explore more", + bringData: { + title: "Bring your data to ToolJet", + description: "Learn how to connect your data sources to ToolJet" + }, + manageOrganization: { + title: "Manage your organization", + description: "Learn how to secure your apps and manage user authentication in ToolJet." + }, + manageReleases: { + title: "Manage releases", + description: "Learn how you can efficiently control the release cycle in ToolJet" + }, + additionalResources: { + title: "Additional resources", + description: "Learn more about Marketplace Plugins, ToolJet Copilot, App Performance, and Security." + } +}; + +export const sectionCards = { + gettingStarted: { + title: "Getting Started", + description: "Discover how to create and publish apps within minutes", + link: "/docs/getting-started/quickstart-guide", + } +}; \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/homepage.css b/docs/versioned_docs/version-3.0.0-LTS/homepage.css new file mode 100644 index 0000000000..bd6213e1df --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/homepage.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/how-to/_category_.json new file mode 100644 index 0000000000..cd5b99d44a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "How To", + "position": 8, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/access-cellvalue-rowdata.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/access-cellvalue-rowdata.md new file mode 100644 index 0000000000..3fa4b31a6f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/access-cellvalue-rowdata.md @@ -0,0 +1,81 @@ +--- +id: access-cellvalue-rowdata +title: Dynamically Change Cell Colors in Table +--- +
    + +This guide shows how to change the text color and background color of certain cells in a **Table** component based on specific conditions. + +
    + +
    + +## Create a New Application and Set up the Data Source +- Create a new app and add a **[Table](/docs/widgets/table)** component to the canvas. +- Open the Query Panel at the bottom and click on the `+ Add` button. +- Select REST API as your data source - your query will be named as restapi1 by default. +- Choose GET method and enter the below URL: +``` +https://fakestoreapi.com/products +``` +- To view the data that your query will return, click on the **Preview** button. Click on the **Run** button to execute the query and retrieve the data. + +
    + +
    + +## Display Data on the Table + +- Hide the Query Panel and click on the **Table** component to open its properties panel on the right. +- Under Table Data, enter the below code: +``` +{{queries.restapi1.data}} +``` +
    + Table Component With Data +
    + +
    + +
    + +## Change Text Color Based on Cell Value + +- Select the **Table** component and go to Columns. +- For the `category` column, paste the below code under Text Color to dynamically change the text color based on the value of the cell: + +``` +{{cellValue == 'electronics' ? 'red' : 'green'}} +``` + +Now, if the cell value is `electronics`, the text color will be red; otherwise, it will be green. + +
    + Conditional Text Color +
    + +You can use also Hex color codes for more color options. + +
    + +
    + +## Change Text Color Using Row Data + +- Under Cell Background Color for the `title` column, paste the below code: + +``` +{{rowData.price < 100? 'yellow': 'white'}} +``` + +The `rowData` identifier can be utilized to reference values from any column within the **Table** component. + +Now if the value in the price column is lesser than 100, the cell background color will be yellow or else it will be white. + +
    + Conditional Background Color +
    + +You can use the above methods to change the text and background colors of a cell dynamically. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/access-users-groups.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/access-users-groups.md new file mode 100644 index 0000000000..79e314fcc5 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/access-users-groups.md @@ -0,0 +1,44 @@ +--- +id: access-currentuser +title: Enable/Disable a Component Using Current User's Property +--- +
    + +Let's take a look at the exposed variables of the currentUser property by clicking on the **[inspector](/docs/app-builder/left-sidebar/#inspector)** icon on the left sidebar: + +- **email** : The value can accessed using `{{globals.currentUser.email}}` +- **firstName** : The value can accessed using `{{globals.currentUser.firstName}}` +- **lastName** : The value can accessed using `{{globals.currentUser.lastName}}` +- **groups**: The `groups` attribute is an array representing the groups a user belongs to. By default, every user, including admins, is part of the `all_users` group. Additionally, admins are also part of the `admin` group. To access a specific group name, you need to specify the array index, such as `[0]` for the first group, `[1]` for the second, and so on. For example, you can retrieve the name of the second group a user belongs to with `{{globals.currentUser.groups[1]}}`. +- **metadata** : The value can accessed using `{{globals.currentUser.metadata}}`. + + +
    + +
    + +### Example: Disable a Button if a User is Not Admin + +- Click on the **Button** handle to open its properties. On the **Styles** tab, go to the **Disable** property. + +
    + Properties of button +
    + +- Configure the Disable field with a condition that checks the user's group membership. If the user is not an admin, as determined by the absence of the admin value in the first position (index [1]) of the groups array, the field should be disabled. Use the following JavaScript condition for this purpose: + +```javascript +{{globals.currentUser.groups[1] !== "admin" ? true : false}} +``` + +
    + Disable Property of button +
    + +- Now, when you **release** the app, if the user is not a part of the **admin** group, the button will be disabled. + +
    + Released button disabled when user is not admin +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/access-users-location.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/access-users-location.md new file mode 100644 index 0000000000..1341dea5ef --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/access-users-location.md @@ -0,0 +1,65 @@ +--- +id: access-users-location +title: Accessing User Location with RunJS Query +--- +
    + +In this step-by-step guide we will build a ToolJet application that harnesses the power of the **JavaScript Geolocation API** to retrieve the user's location. The Geolocation API offers access to various geographical data associated with a user's device, utilizing methods such as GPS, WIFI, IP Geolocation, and more. + +:::info +To uphold user privacy, the Geolocation API requests permission before locating the device. Upon permission, you gain access to data like latitude, longitude, altitude, and speed. +::: + +
    + +1. Begin by creating a new application: +
    + How to: Access User's Location +
    + +2. In the app editor, navigate to the query panel at the bottom and create a **[RunJS query](/docs/data-sources/run-js/#runjs-example-queries)** by selecting **Run JavaScript Code** as the datasource: +
    + How to: Access User's Location +
    + +3. Utilize the following JavaScript code to employ the Geolocation API and retrieve the location: + ```js + function getCoordinates() { // Function to get coordinates + return new Promise(function (resolve, reject) { // Promise to get coordinates + navigator.geolocation.getCurrentPosition(resolve, reject); // Get current position + }); + } + + async function getAddress() { // Function to get address + const position = await getCoordinates(); // Await the coordinates + let latitude = position.coords.latitude; // Get latitude + let longitude = position.coords.longitude; // Get longitude + + return [latitude, longitude]; // Return the coordinates + } + + return await getAddress(); // Return the address + ``` + +4. Scroll down the query editor and from **Settings** enable the `Run this query on application load?` option. This ensures that the JavaScript query runs each time the app is opened, providing the user's location. + +5. Upon clicking **Run**, your browser prompts you to grant permission for the ToolJet app to access your location. Allow this permission to receive location data. +
    + How to: Access User's Location +
    + +7. Once the query is succesfully run, the coordinates will be returned and displayed in the **Preview** section of query editor. To inspect the data returned by the query, go to the **Inspector** on the left sidebar, expand queries -> `runjs1` (query name), and then examine the **data**. You'll find the coordinates. +
    + How to: Access User's Location +
    + +8. Utilize these coordinates in the **map component** to display the location. Add a map component to the canvas and edit its properties. In the **Initial location** property, enter: + ```js + {{ {"lat": queries.runjs1.data[0], "lng": queries.runjs1.data[1]} }} + ``` + +
    + How to: Access User's Location +
    + +9. Once the Map component properties are updated, you'll see the location displayed on the **map component**. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/build-dynamic-forms.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/build-dynamic-forms.md new file mode 100644 index 0000000000..aa9777813e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/build-dynamic-forms.md @@ -0,0 +1,86 @@ +--- +id: build-dynamic-forms +title: Build Dynamic Forms +--- + +This guide walks you through the process of building dynamic, interactive forms in ToolJet through validations. + +
    + +## 1. Creating the UI +Let’s get started by setting up your form’s interface. + +Drag and drop a **Form** component on the canvas and place the following input components inside it. + +| Component | Component Name | Label | +|:--------------------------------|:---------------|:-----------------------------------------------------------------| +| Star Rating | *starrating1* | How satisfied are you with our service? | +| Text Input | *textinput1* | What specific issues did you encounter? | +| Text Input | *textinput2* | Email | +| Number Input | *numberinput1* | Contact | +| Button | *button1* | Submit | + +
    + Dynamic Form UI +
    + +
    + +
    + +## 2. Add Validations and Conditions +Now, let’s add some magic with validations and conditions to make your form smart and responsive. + +a. Select the *textinput1* component and navigate to its Visibility condition. Click on **fx** next to the Visibility condition and enter the below code in the input: + +```javascript +{{components.form1.children.starrating1.value<4}} +``` +*This code will ensure that the *textinput1* component is only visible when the start rating is below 4.* + +b. Select the *textinput2* component and navigate to its Custom Validation property. Click on **fx** and enter the following code to test the email format using regex: +```javascript +{{/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(components.form1.children.textinput2.value) +? '' : 'Invalid email'}} +``` + +c. Select the *numberinput1* component and enable the toggle for Make this field mandatory. This setting will display an error when the *numberinput1* component is left blank. + +d. Finally, the *button1* component has to be disabled if the rating, email, and contact fields are not valid. Use the following code in the component's Visibility condition to achieve that: + +```javascript +{{!components.form1.children.textinput2.isValid || +!components.form1.children.starrating1.value || +!components.form1.children.numberinput1.value}} +``` +
    + +
    + +## 3. Test the Functionality + +It’s time to put your form to the test! Check that everything functions smoothly and as expected. + +a. Check whether the *textinput1* is visible and hidden based on the star rating. + +
    + Dynamic Form UI - Test Star Rating +
    + +
    + Dynamic Form UI - Test Star Rating 2 +
    + +
    + +b. Enter incorrect email and contact details to see whether the related components throw an error while disabling the button. + +
    + Dynamic Form UI - Incorrect Email and Contact Test +
    + +
    + +This short guide covers the main validation options that you can use while creating a dynamic form. To explore further, use the Tabs component to create multi-page forms while using the same logic to make it dynamic. + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/build-plugin-for-marketplace.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/build-plugin-for-marketplace.md new file mode 100644 index 0000000000..c6e5a7399a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/build-plugin-for-marketplace.md @@ -0,0 +1,381 @@ +--- +id: build-plugin-for-marketplace +title: Build a new plugin for marketplace +--- + +## Introduction + +ToolJet marketplace is a place where you can find custom plugins and install them in your ToolJet instance. This document will help you to build a new plugin for ToolJet marketplace. + +## Prerequisites +- [Node.js](https://nodejs.org/en/download/) (v18.18.2) +- [npm](https://www.npmjs.com/get-npm) (v9.8.1) + +## Getting started +### 1. Enabling the marketplace for your instance +To enable the marketplace for your instance, you need to set the `ENABLE_MARKETPLACE` environment variable to `true` in your `.env` file. +Marketplace is disabled by default. +Once you set the environment variable, restart your ToolJet instance. You can find the instructions to run ToolJet locally [here](/docs/setup/). +Marketplace can be accessed from '/integrations' route. + +### 2. Installing tooljet-cli +ToolJet marketplace uses [tooljet-cli](https://www.npmjs.com/package/@tooljet/cli) to build and publish plugins. You can install it using npm. +```bash +npm install -g tooljet-cli + +# verify the installation +tooljet --version +``` + +### 3. Creating a new plugin - Github plugin +Let's create a new Github plugin for ToolJet marketplace, which will authenticate a user using Github Personal Access Token and will include basic operations like fetching user details, fetching repositories, fetching issues and fetching pull requests. + +```bash +# create a new plugin +tooljet plugin create github +``` +Provide the plugin name and select the plugin type, which is a `api` in this case. +Select `yes` when asked to create a new plugin for marketplace. + +Provide the repository URL if hosted on GitHub, otherwise leave it blank. + +When you create a plugin using the ToolJet CLI, an object is automatically added to the plugins.json file, which is located in the `ToolJet/server/src/assets/marketplace/` directory. This object contains metadata about the plugin, such as its name, description, version, author, and other details. +This plugins.json file serves as a registry of all the plugins that are available for use in ToolJet. When ToolJet server starts up, it reads this file and loads all the plugins that are listed in it. + +:::note +It's important to note that the plugins.json file should not be manually edited as it is automatically generated by the ToolJet CLI. Any changes made to this file may cause issues with the proper functioning of the plugins in the system. +::: + +All marketplace plugins are stored in the `/marketplace` directory of the ToolJet repository. You can find the Github plugin [here](https://github.com/ToolJet/ToolJet/tree/develop/marketplace/plugins/github). + +The directory structure of a typical ToolJet plugin looks like this: + +```bash +github/ + package.json + lib/ + icon.svg + index.ts + operations.json + manifest.json +``` + +- manifest.json should include information such as the name of plugin, description, etc. +- operations.json should include the metadata of all the operations supported by the plugin. +- index.ts is the main file. It defines a QueryService for the plugin. The QueryService handles running of queries, testing connections, caching connections, etc. +- icon.svg is the icon for the plugin. +- package.json is auto generated by the cli. + + +:::info +**Why do we need a manifest.json file or a operations.json file?** + +The manifest.json files are consumed by a React component to create dynamic UI for connection forms by defining the schema of an API or data source. The schema includes information about the source, such as its name, type, and any exposed variables. It also includes options for authentication and other properties that can be customized by the user. The properties section defines the specific fields and their types that are required for connecting to the API or data source. The React component reads the manifest.json file and generates the necessary UI components based on the schema, allowing users to enter the required information for connecting to the source. This can include text inputs, dropdowns, checkboxes, and other UI elements, depending on the schema defined in the manifest.json file. + +The operations.json file contains a schema definition for a particular data source, for example, Github. It describes the available operations and their parameters that can be used to query the data source. + +A React component uses this schema to create queries in ToolJet applications to generate a UI that allows users to select the desired operation and provide the required parameters. + +The component would use the properties defined in the operations.json file to create various UI elements, such as dropdowns, and input fields, and handle user interactions to create the final query. Once the user has filled in the required parameters, the component would use them to generate a query that can be executed against the data source, and return the results to the user. + +In conclusion, *manifest.json* and *operations.json* files play an important role in creating dynamic UI components in ToolJet applications. These files define the schema for data sources and available operations, which is then consumed by React components to generate the necessary UI elements for users to interact with. By using these files, ToolJet enables users to easily connect to various APIs and data sources, perform queries and retrieve data in a user-friendly way. +::: + + +### 4. Defining the manifest.json file +We need to include the necessary options to construct the connection form. +```json + "properties": { + "credentials": { + "label": "Authentication", + "key": "auth_type", + "type": "dropdown-component-flip", + "description": "Single select dropdown for choosing credentials", + "list": [ + { + "value": "personal_access_token", + "name": "Use Personal Access Token" + } + ] + + }, + "personal_access_token": { + "token": { + "label": "Token", + "key": "personal_token", + "type": "password", + "description": "Enter personal access token", + "hint": "You can generate a personal access token from your Github account settings." + } + } + } +``` +It includes information about authentication options, specifically a dropdown to choose a type of credentials and a field to enter a personal access token. The label, key, type, description, and hint properties are used to define the specific fields and their types required for connecting to the API or data source. + +### 5. Defining the operations.json file +```json + "properties": { + "operation": { + "label": "Operation", + "key": "operation", + "type": "dropdown-component-flip", + "description": "Single select dropdown for operation", + "list": [ + { + "value": "get_user_info", + "name": "Get user info" + }, + { + "value": "get_repo", + "name": "Get repository" + }, + { + "value": "get_repo_issues", + "name": "Get repository issues" + }, + { + "value": "get_repo_pull_requests", + "name": "Get repository pull requests" + } + ] + }, + "get_user_info": { + "username": { + "label": "Username", + "key": "username", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter username", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "Enter username" + } + }, + "get_repo": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + } + }, + "get_repo_issues": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "className": "codehinter-plugins col-4", + "type": "dropdown", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + }, + "get_repo_pull_requests": { + "owner": { + "label": "Owner", + "key": "owner", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter owner name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "developer" + }, + "repo": { + "label": "Repository", + "key": "repo", + "type": "codehinter", + "lineNumbers": false, + "description": "Enter repository name", + "width": "320px", + "height": "36px", + "className": "codehinter-plugins", + "placeholder": "tooljet" + }, + "state": { + "label": "State", + "key": "state", + "type": "dropdown", + "className": "codehinter-plugins col-4", + "description": "Single select dropdown for choosing state", + "list": [ + { + "value": "open", + "name": "Open" + }, + { + "value": "closed", + "name": "Closed" + }, + { + "value": "all", + "name": "All" + } + ] + } + } + } +``` +The operations.json file defines the operations that can be performed on the data source. It includes information about the operation type, the fields required to perform the operation, and the type of each field. The label, key, type, description, and hint properties are used to define the specific fields and their types required for connecting to the API or data source. + +### 6. Add the npm package of GitHub to the plugin dependencies + +```bash +# change directory to the plugin directory and install the npm package +cd plugins/github +npm i octokit --workspace=@tooljet-marketplace/github +``` + +:::info +Steps to install npm package to a plugin + +```bash +npm i --workspace= +``` + +The command `npm i --workspace=` is used to install a specific npm package into a particular workspace of a multi-package repository. + +The *--workspace* flag is used to specify the workspace where the package should be installed. In this case, we are installing the package in the *@tooljet-marketplace/github* workspace. +::: + +### 7. Implement the query execution logic in index.ts +The QueryService for the Github plugin handles the logic for running queries in index.ts. The QueryService receives the metadata of the data source, including the credentials and configurations for connecting and parameters for the query that was run. + +For the Github datasource, the sourceOptions will include the credentials required for authentication, such as the personal access token. The queryOptions will have the configurations and parameters for the specific query, including the operation to be performed, such as getting the list of repositories for a specific user. + +The QueryService will use this information to create and execute the necessary API requests against the Github API. The resulting data will be returned to the caller, which can then be further processed as required. + + +Create a new file query_operations.ts in the plugins/github/src directory and add the following code to it. +```typescript +import { Octokit } from 'octokit' +import { QueryOptions } from './types' + + +export async function getUserInfo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /users/{username}', + { + username: options.username + } + ); + return data; +} + +export async function getRepo(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}', + { + owner: options.owner, + repo: options.repo + } + ); + return data; +} + +export async function getRepoIssues(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/issues', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + + } + ); + return data; +} + +export async function getRepoPullRequests(octokit: Octokit, options: QueryOptions): Promise { + const { data } = await octokit.request( + 'GET /repos/{owner}/{repo}/pulls', + { + owner: options.owner, + repo: options.repo, + state: options.state || 'all' + } + ); + return data; +} + +``` + +The query_operations.ts file contains the functions that will be used to execute the queries. The functions will be called by the QueryService in index.ts. + +The Github class has three methods: +- run: This method is called when a query needs to be executed. It takes in *sourceOptions* and *queryOptions* as input, which represent the source metadata and the query configuration, respectively. The run method uses the octokit library to make API requests to the GitHub API and returns the result of the query in a QueryResult object. + +- testConnection: When a new data source is being added to a ToolJet application, the connection can be tested. +This method is called when a connection needs to be tested. It takes in sourceOptions as input, which represents the source metadata. The testConnection method tests the connection by attempting to get the authenticated user and returns a ConnectionTestResult object that indicates whether the connection was successful or not. + +:::note +Every data source might not have a way to test connection. If not applicable for your data source, you can disable the test connection feature by adding "customTesting": true, to the manifest.json of your plugin. +:: + +- getConnection: This method is a helper method that returns an authenticated octokit client that is used to make requests to the GitHub API. It takes in sourceOptions as input, which represents the source metadata, and returns an authenticated octokit client. + + + + + + + + + + + + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/bulk-update-multiple-rows-in-table.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/bulk-update-multiple-rows-in-table.md new file mode 100644 index 0000000000..53df502a00 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/bulk-update-multiple-rows-in-table.md @@ -0,0 +1,150 @@ +--- +id: bulk-update-multiple-rows +title: Bulk Update Multiple Rows in Table +--- +
    +For the purpose of this guide, it's presumed that you've already established a successful connection to your data source. We'll use PostgreSQL for this example, but you can adjust the queries based on the SQL database that you are using. + +
    + +
    + +## 1. Create a Query to Get the Data + +- Create a PostgreSQL query in SQL mode, rename it to *users* and enter the below code. + +```sql +SELECT * FROM // *replace
    with your table name* +``` +- Enable the `Run the query on application load?` option to execute the query automatically when the application starts. +- Click on the **Run** button to fetch the data from the database. + +
    + Fetch the Data +
    + + + +
    + +## 2. Display the Data on the Table + +- Drag and drop a **Table** component onto the canvas from the components library on the right. +- Click on the Table component to open its properties on the right sidebar. +- To populate the Table with the data returned by the query, add the below code under the `Data` field of the Table: +```js +{{queries.users.data}} +``` + +
    + Display Data on the Table +
    + +
    + +
    + +## 3. Make the Columns Editable + +- Under the Columns accordion, click on the column name that you want to make editable. +- On clicking the column name, a new section will open. Enable the toggle for `Make editable` to make the column editable. + +
    + Make Column Editable +
    + +
    + +
    + +## 4. Enable Multiple Row Selection + +- Under the Row Selection accordion, enable the `Allow Selection`, `Highlight Selected Row`, and `Bulk Selection` option. + +
    + Multiple Row Selection +
    + +
    + +
    + +## 5. Create a Custom JS query + +- Create a new Run Javascript query and use the code below to generate the SQL query for updating multiple rows. The query will be named as *runjs1* by default. + +```js +const uniqueIdentifier = "id" +const cols = Object.values(components.table1.changeSet).map((col, index) => { + return { + col: Object.keys(col), + [uniqueIdentifier]: Object.values(components.table1.dataUpdates)[index][uniqueIdentifier], + values: Object.values(col), + }; +}); + +const sql = cols.map((column) => { + const { col, id, values } = column; + const cols = col.map((col, index) => `${col} = '${values[index]}'`); + return `UPDATE users SET ${cols.join(", ")} WHERE id = '${id}';`; +}); + +return sql +``` + +Here the unique identifier is **id** and Table component's name is **table1**. You can update the unique identifier if you are using a different column as a unique identifier. You can also update the Table name if you have renamed it, the default name is *table1*. + +
    + RunJS code to later the data +
    + +
    + +
    + +## 6. Create an Update Query + +- Create a PostgreSQL query in SQL mode and rename it to *update*: + +```sql +{{queries.runjs1.data.join(' ')}} +``` + +- This query will run the SQL query generated by the *runjs1* query. + +
    + Bulk Update Rows +
    + +
    + +
    + +## 7. Adding Event Handlers to Execute Queries in Sequence + +- Edit the Table component and add an event handler for `Save Changes` event so that whenever a user will edit the Table and hit the Save Changes button the *runjs1* query will run. +- Optionally, add loading state to the Table by clicking on `fx` next to the `Loading state` property. +- Use the below code to show the loading state whenever a query is getting executed. +```js +{{queries.users.isLoading || queries.update.isLoading}} +``` + +
    + Adding Events +
    + +- Now, go to the *runjs1* query and add an event to run the *update* query for Query Success event. This will run the *update* query after the *runjs1* query is successfully executed. + +
    + Query Success +
    + +The data needs to reload once the *update* query runs since we want the Table component to be populated with the updated data. + +- Add a new event handler in the *update* query. +- Select Query Success as the Event and Run Query as the Action. +- Select *users* as Query. + +This will refresh the table whenever the *update* query will be run. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/conditionally-display-components.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/conditionally-display-components.md new file mode 100644 index 0000000000..3067fa9b25 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/conditionally-display-components.md @@ -0,0 +1,44 @@ +--- +id: conditionally-display-components +title: Conditionally Display Components Using fx and Groups +--- + + +In this guide, you'll see how you can utilize groups to conditionally display components. This can be handy when two or more groups have access to the same app and you want to conditionally display components based on the group. + +Here's a basic application with some components. + +
    + Initial UI without any conditions +
    + +In this app, the `Approve Selected` button should only display if someone from the **Manager** group is accessing the application. + +- To implement this, select the button component and navigate to its `Visibility` property. +- Click on the **fx** button next to `Visibility` and enter the below code in the input: + +```js +{{globals.currentUser.groups.includes('Manager')}} +``` +
    + Visibility Code on Button Component +
    + +- Now if you check the UI, you won't see the **Button** component unless you are a part of the `Managers` group. + +- Here's what the users who are not in the `Managers` group can see: + +
    + Non Manager View +
    + +- Here's what the users in the `Managers` group can see: + +
    + Manager View +
    + +This was a basic implementation of how you can control the visibility of components using **fx** and **Groups** in ToolJet. + +Feel free to implement the same logic for more advanced use cases. For instance, for conditionally displaying a section or a group of components, you can place all the relevant components inside a **Container** component and apply the same logic. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/conditionally-format-table.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/conditionally-format-table.md new file mode 100644 index 0000000000..77e2603c7c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/conditionally-format-table.md @@ -0,0 +1,160 @@ +--- +id: conditionally-format-table +title: Conditional Formatting in Table +--- +
    + +Conditional formatting enhances the visual representation of data by allowing you to dynamically adjust the appearance of cells in **Table** component based on specific conditions. This how-to guide will guide you through the process of implementing advanced conditional formatting for text color and background color in a Table component. + +
    + +
    + +## Create a New Application and Set Up Data Source + +- Create a new application and add a Table component to the canvas. + +- Open the Query Panel at the bottom and click on the **+ Add** button. + +- Choose **REST API** as your data source and set the method to GET. + +- Enter the following URL as REST API endpoint: +```bash title="REST API Endpoint" +https://fakestoreapi.com/products +``` + +- Click on the **Preview** button to view the data. Execute the query by clicking on the **Run** button. + +
    + Table Component With Data +
    + +
    + +
    + +## Display Data on the Table + +- Hide the Query Panel and click on the Table component to open its properties panel. + +- Under the `Data` property, enter the following code: +```js title="Data" +{{queries.restapi1.data}} +``` + +
    + Table Component With Data +
    + +
    + +
    + +## Enabling Conditional Formatting + +- Go to the `Columns` property of the Table component. + +- Select the column for which you want to enable conditional formatting (e.g., category). + +- If the column type is set to `Default` or `String`, you can set the conditional formatting for `Text color` and `Cell background color`. + +**Note**: Only `cellValue` and `rowData` can be used as identifiers for conditional formatting. + +
    + Table Component With Data +
    + +
    + +
    + +## Conditional Formatting using Cell Value + +
    + +### Example 1: Changing Text Color Based on Cell Value + +- Select the `Rate` column which has a column type of `Default`/`String`. This column contains the rating of each product on a scale of 1 to 5. + +- Under the `Text color` property, enter the following condition: + +```js +{{cellValue < 2 ? 'red' : cellValue > 2 && cellValue < 3 ? 'Orange' : 'green'}} +``` + +The above condition will change the text color to red if the cell value is less than 2, orange if the cell value is greater than 2 and less than 3, and green if the cell value is greater than 3. + +
    + Table Component With Data +
    + +
    + +
    + +### Example 2: Changing Cell Background Color Based on Cell Value + +- Select the `Rate` column, enter the following condition under the `Cell background color` property: + +```js +{{cellValue >= 4 ? 'lightgreen' : cellValue >= 3 ? 'lightyellow' : 'lightcoral'}} +``` + +The above condition will change the cell background color to lightgreen if the cell value is greater than or equal to 4, lightyellow if the cell value is greater than or equal to 3, and lightcoral if the cell value is less than 3. + +
    + Table Component With Data +
    + +
    + +
    + +
    + +## Conditional Formatting using Row Data + +
    + +### Example 1: Changing Text Color Based on Row Data + +- Select the `Title` column, enter the following condition under the `Text color` property: + +```js +{{rowData.price > 50 ? '#D9534F' : (rowData.rating.rate >= 4 ? '#5CB85C' : rowData.rating.rate >= 3 ? '#F0AD4E' : '#D9534F' )}} +``` + +The above condition will change the text color of the `Title` based on the value of the `price` and `rating` columns. If the value in the `price` column is greater than 50, the text color will be red. If the value in the `rating` column is greater than or equal to 4, the text color will be green. If the value in the `rating` column is greater than or equal to 3, the text color will be yellow. Otherwise, the text color will be red. + +
    + Table Component With Data +
    + +
    + +
    + +### Example 2: Changing Cell Background Color based on Row Data + +- In this example, we will change the cell background color of the `Title` column based on the category of the product. + +- Select the `Title` column, enter the following condition under the `Cell background color` property: + +```js +{{rowData.category === "electronics" ? 'cyan' : rowData.category === "jewelery" ? 'pink' : 'lightgray'}} +``` + +The above condition will change the cell background color of the `Title` column based on the value of the `category` column. If the value in the `category` column is `electronics`, the cell background color will be cyan. If the value in the `category` column is `jewelery`, the cell background color will be pink. Otherwise, the cell background color will be lightgray. + +
    + Table Component With Data +
    + +
    + +
    + +--- + +By following these steps, you can implement advanced conditional formatting for `Text color` and `Cell background color` in your Table component. Experiment with different conditions and color combinations to create visually appealing and informative tables in your applications. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/delete-multiple-rows-table.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/delete-multiple-rows-table.md new file mode 100644 index 0000000000..035c13aa8d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/delete-multiple-rows-table.md @@ -0,0 +1,148 @@ +--- +id: delete-multiple-rows +title: Delete Multiple Rows in a Table +--- +
    + +This guide explains how to delete multiple rows from a table, assuming you've already connected to a data source. We'll use PostgreSQL for this example, but you can adjust the queries based on the SQL database that you are using. + +
    + +
    + +## 1. Create a Query to Fetch the Data from the Database + +- Create a new query and name it *getRecords*. +- Select SQL mode and enter the following query: + +```sql +SELECT * FROM tooljet // replace tooljet with your table name +``` + +- Enable the `Run the query on application load?` option to execute the query automatically when the application starts. + +
    + How-to: Delete Multiple Rows in Table +
    + +
    + +
    + +## 2. Populating the Table with Data + +- Drag and drop a **Table** component on the canvas. +- In Table properties, go to the `Data` property and set the value to `{{queries.getRecords.data}}`. +- Now if you run the *getRecords* query, the returned data will be loaded in the Table component. + +
    + How-to: Delete multiple rows in table +
    + +
    + +
    + +## 3. Enable Bulk Row Selection on Table + +- Go to the Table properties and enable the `Bulk selection` option. +- Enabling this option will allow you to select multiple rows on the table. + +
    + How-to: Delete multiple rows in table +
    + +
    + +
    + +## 4. Create a Custom JavaScript Query + +- Create a new Run Javascript code query. It will be named *runjs1* by default. +- Enter the following code: + +```js +const uniqueIdentifier = "id"; + +const idsToDelete = Object.values(components.table1.selectedRows).map(dataUpdate => dataUpdate[uniqueIdentifier]); + +const idsString = idsToDelete.map(id => `'${id}'`).join(', '); + +const SQL = `DELETE FROM tooljet WHERE ${uniqueIdentifier} IN (${idsString});`; + +return SQL; +``` + +The above code generates a SQL query that deletes rows from the database table where the `id` field matches the selected IDs in ToolJet's Table component. + +- Click on the **Preview** button to see the SQL statement generated by the query. + +
    + How-to: Delete multiple rows in table +
    + +*If you're using a different column as the unique identifier, feel free to update the code accordingly. You can also update the Table name if you have renamed it, the default name is *table1*.* + +- Select a few rows on the Table component and then Preview the SQL query generated by the *runjs1* query. + +
    + How-to: Delete multiple rows in table +
    + +
    + +
    + +## 5. Create a New Query to Delete the Rows + +- Create a new query, name it `delete`, and select SQL mode. +- Enter the following code: +```sql +{{queries.runjs1.data}} +``` + +In this query, we are dynamically loading the SQL statement generated by the JavaScript query. + +
    + How-to: Delete multiple rows in table +
    + +
    + +
    + +## 6. Add a Button to Delete the Selected Rows + +- Drag and drop a **Button** component on the canvas. +- Edit its properties and set the `Button text` property to "Delete selected". +- Add a new **Event** to the button. +- Select On click as the Event, Run Query as the Action, and *runjs1* as the Query. + +
    + How-to: Delete multiple rows in table +
    + +- Optionally, we can add a loading state to the Button whenever the *delete* or *getRecords* query is running: +```js +{{queries.delete.isLoading || queries.getRecords.isLoading}} +``` + +- Add a new **Event** to the *runjs1* query. +- Select Query Success as the Event, Run Query as the Action and *delete* as the Query. + +
    + How-to: Delete multiple rows in table +
    + +Now, whenever you click on the Button component, the *runjs1* query will run and generate a delete SQL statement with selected rows on the table. Once the *runjs1* query executes, the *delete* query will execute and delete the rows from the database. + +- Add a new **Event** to the *delete* query. +- Select Query Success as the Event, Run Query as the Action and *getRecords* as the Query. + +
    + How-to: Delete multiple rows in table +
    + +By implementing this, we are ensuring that every time rows are deleted, the Table component will automatically refresh to display the most recent data fetched from the database. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/display-listview-record-new-page.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/display-listview-record-new-page.md new file mode 100644 index 0000000000..55f9b3a656 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/display-listview-record-new-page.md @@ -0,0 +1,61 @@ +--- +id: display-listview-record-on-new-page +title: Display Listview Record Details on a New Page +--- + +This guide explains how to display details of a selected record from a **Listview** component on a different page in ToolJet. + +
    + +## Build the App + +1. Drag a **Listview** component and setup other required components. +Build the app +2. Add another page in the application. +Add a new page +3. Setup the second page with required fields and components. +Setup the second page + +
    + +
    + +## Setting up Event Handlers + +Add a new event handler to the **Listview** component with the following configurations: +- Event: **Record Clicked** +- Action: **Set variable** +- Key: **selectedEmp** *(Enter your desired variable name.)* +- Value: + ```json + {{[{ + name: components.listview1.selectedRecord.text17.text, + designation: components.listview1.selectedRecord.text15.text, + department: components.listview1.selectedRecord.text14.text + }]}} + ``` + +This event will save the record value in the specified variable, which can be accessed on another page. + +Add event handler to set variables + +Create one more event and configure it with the following settings to switch the page when a record is clicked: + - Event: **Record Clicked** + - Action: **Switch page** + - Page: **Employee Details** *(Select your desired page from the dropdown.)* + +This event will switch the page whenever a record is clicked. + +Add event handler to switch page + +
    + +
    + +## Displaying Info on Another Page + +Now, you can reference the values stored in the variables from the previous page. For instance, you can set the default value of the **Text input** component using `{{variables.selectedEmp[0].name}}`. + +Display data on the new page + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/import-external-lib-js.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/import-external-lib-js.md new file mode 100644 index 0000000000..2da47f7552 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/import-external-lib-js.md @@ -0,0 +1,132 @@ +--- +id: import-external-libraries-using-runjs +title: Import External Libraries using RunJS +--- +
    + +ToolJet allows you to integrate external JavaScript libraries into your application using RunJS queries. This guide walks you through the process of importing and utilizing these libraries effectively. + +
    + +
    + +## Choosing Libraries + +You can import various JavaScript libraries using their Content Delivery Network (CDN) links. Find the CDN links for your desired open-source projects on [jsDelivr](https://www.jsdelivr.com/). + +
    + +
    + +## Creating a New App and RunJS Query + +- Create a new app from the ToolJet Dashboard. +- Once the app is ready, choose ToolJet's deafult **JavaScript** Data Source from the query panel. + +
    + Create a new RunJS query +
    + +
    + +
    + +## Importing Libraries + +Once the query is created, add the following code: + +
    + +```js +// Function to add script dynamically +function addScript(src) { + return new Promise((resolve, reject) => { + const scriptTag = document.createElement('script'); + scriptTag.setAttribute('src', src); + scriptTag.addEventListener('load', resolve); + scriptTag.addEventListener('error', reject); + document.body.appendChild(scriptTag); + }); +} + +try { + // Importing MathJS + await addScript('https://cdn.jsdelivr.net/npm/mathjs@11.7.0'); + + // Importing FlattenJS + await addScript('https://cdn.jsdelivr.net/npm/flattenjs@2.1.3/lib/flatten.min.js'); + + // Showing a success alert + await actions.showAlert("success", 'Mathjs and Flatten imported'); +} catch (error) { + console.error(error); +} +``` + +
    + +After adding the code, click on the **Run** button in the query panel, an alert should pop up with the message "Mathjs and Flatten imported." + +:::tip +Enable the **Run this query on application load?** option to make the libraries available throughout the application as soon as the app is loaded. +::: + +
    + Import Successful +
    + +
    + +
    + +## Examples + +
    + +
    + +### 1. Flattening JSON Objects using FlattenJS + +- Create a new *RunJS* query using the Flatten library (imported earlier) to flatten a JSON object. +- In the code section of the query, add the following code: + +```js +return flatten({ + key1: { + keyA: 'valueI' + }, + key2: { + keyB: 'valueII' + }, + key3: { a: { b: { c: 2 } } } +}); +``` + +- Preview the output in the query manager or click **Run** in the query panel to see the flattened JSON. + +
    + Use FlattenJS +
    + +
    + +
    + +### 2. Computation using MathJS + +- Create another *RunJS* query utilizing the MathJS library for a calculation. +- In the code section of the query, add the following code: + +```js +return math.atan2(3, -3) / math.pi; +``` + +- Preview the output in the query manager or click **Run** in the query panel to see the result of the calculation. + +
    + Use MathJs +
    + +
    + +This guide provides a clear and detailed walkthrough for importing external JavaScript libraries into your ToolJet application. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/import-external-lib-py.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/import-external-lib-py.md new file mode 100644 index 0000000000..c34c9c6ee9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/import-external-lib-py.md @@ -0,0 +1,102 @@ +--- +id: import-external-libraries-using-runpy +title: Import External Libraries Using RunPy +--- +
    + +ToolJet allows you to utilize python packages in your app by importing them using the [RunPy query](/docs/data-sources/run-py). +In this how-to guide, we will import a few packages and use them in the application. + +
    + +:::caution Unsupported modules +Modules with C/C++ extensions needing system libraries won't work in Pyodide, as it runs in a web browser without system library access. Pyodide, based on WebAssembly-compiled Python, also doesn't support certain system calls. +::: + +
    + +- Start by creating a new application in ToolJet. +- From the Query Panel, add a new RunPy query - it will be named *runpy1* by default. + +
    + Import external libraries using RunPy +
    + +- Use micropip to install packages like Pandas and NumPy. **Run** the query to complete installation. + +```python +import micropip +await micropip.install('pandas') +await micropip.install('numpy') +``` + +
    + Import external libraries using RunPy +
    + +- Enable `Run this query on application load?` to make these packages available every time the application loads. + +
    + +
    + +## Generating Random Numbers with NumPy + +- Create a RunPy query using NumPy's random module to generate random numbers. + +```python +from numpy import random +x = random.binomial(n=10, p=0.5, size=10) +print(x) +``` + +
    + Import external libraries using RunPy +
    + +*You can check the output on the browser's console.* + +
    + +
    + +## Parse CSV data + +- Create a RunPy query to parse CSV data using `StringIO`, `csv`, and `Pandas` module. + +```python +from io import StringIO +import csv +import pandas as pd + +scsv = components.filepicker1.file[0].content + +f = StringIO(scsv) +reader = csv.reader(f, delimiter=',') + +df = pd.DataFrame(reader) + +print(df.info()) +print(df) +``` + +
    + Import external libraries using RunPy +
    + +- Add a **File Picker** component on the canvas +- Select `On File Loaded` as the Event and Run Query as the Action. +- Select the query we just created as the Query. + +
    + Import external libraries using RunPy +
    + +- Finally, load a csv file on the File Picker component, **Run** related RunPy query and check the output on the browser console. + +
    + Import external libraries using RunPy +
    + + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/intentionally-fail-js-query.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/intentionally-fail-js-query.md new file mode 100644 index 0000000000..3111d09689 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/intentionally-fail-js-query.md @@ -0,0 +1,40 @@ +--- +id: intentionally-fail-js-query +title: Intentionally Throwing an Error in RunJS for Debugging +--- +
    + +In this step-by-step guide, we'll walk you through the process of creating a RunJS query that intentionally throws an error for debugging purposes. + +
    + +
    + +### Creating the Error-Throwing RunJS Query + +1. Create a new RunJS query by clicking the `+ Add` button on the query panel. + +2. Paste the following code into the RunJS query editor. This code utilizes the `ReferenceError` constructor to intentionally generate an error. + ```js + throw new ReferenceError('This is a reference error.'); + ``` + +
    + +
    + +### Adding an Event Handler for Failure + +3. Now, enhance the query by adding an event handler that will display an alert when the query fails. + +4. Click the "Run" button to execute the query and observe the intentional error being thrown. + +Refer to the screencast below: + +
    + reate a new RunJS query +
    + +
    + +By following these steps, you can effectively simulate errors in your RunJS queries, aiding in the debugging process and improving the overall robustness of your code. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/loading-image-pdf-from-db.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/loading-image-pdf-from-db.md new file mode 100644 index 0000000000..abca94f56b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/loading-image-pdf-from-db.md @@ -0,0 +1,128 @@ +--- +id: loading-image-pdf-from-db +title: Upload And View Images and PDFs Using Base64 String +--- +
    + +This guide shows how to upload and view images and PDFs using the base64 string format. + +
    + +
    + +## 1. Start by Creating a New Table In ToolJet Database + +- Create a new table named *testDB*. +- The `id` field will be present by default to create a unique identifier for each record in our database table. +- Click on **Add more columns** button and add two more columns: `pdf` and `image`. +- Select `varchar` as datatype for the pdf and image columns. + +While we are using the ToolJet Database for this guide; feel free to use other databases while applying the same principles. + +
    +New Table +
    + +
    + +
    + +## 2. Upload Files To The Database + +- Create a new application and name it *Load PDF And Images Example*. +- Drag and drop two **[Filepicker](/docs/widgets/file-picker)** components on the canvas from the components library on the right. +- Rename the first Filepicker component to *imagePicker* and second Filepicker to *pdfPicker*. + +
    + Rename Filepickers +
    + +- For *pdfPicker*, change the **Accept file types** property to `{{"pdf/*"}}` - this ensures that the Filepicker only accepts PDF files. + +
    + Accepted File Type Settings +
    + +- Retain the default `{{"image/*"}}` setting for the Accept file types property in the *imagePicker* component, as it's intended for image uploads. +- Click on the *imagePicker* component and select an image to upload. Similarly, upload a PDF using the *pdfPicker* component. + +
    + Uploaded Files +
    + +- After uploading, you will see the filenames displayed on their respective Filepicker components. +- Click on the **+ Add** button in the query panel to create a new query, choose ToolJet Database as the data source, select `testDB` as Table name, and `Create Row` as Operations. Name this query *uploadFiles*. +- Under the Columns section, add two columns - `pdf` and `image`. +- Set the below value for the `pdf` column: +```js +{{components.pdfPicker.file[0].base64Data}} +``` +- Similarly, for the `image` column: +```js +{{components.imagePicker.file[0].base64Data}} +``` + +In the above query, we are using the exposed variables of both Filepicker components to get the base64 strings of the files we had uploaded earlier. + +
    + Add Files Query +
    + +- Add a **[Button](/docs/widgets/button)** component below the Filepickers and rename it to *upload*. +- Set the Button's text to *Upload* and create a **New event handler** with the following settings: Event - `On click`, Action - `Run Query` and Query - `uploadFiles`. +- Click on the *upload* button to upload the files that we had selected in the Filepicker components earlier. + +
    + Upload Button Properties +
    + +The upload process is now complete. Whenever files are selected in the Filepicker components and the *upload* button is clicked, the base64 strings of these files will be automatically written to the database. + +
    + +
    + +## 3. View Image and PDF Files + +- Create a query named *getFiles* to retrieve base64 strings from testDB: Click on **+ Add** button in the query panel, select ToolJet as Database, `testDB` as Table name, and `List rows` as Operations. +- Enable **Run this query on application load?** and click on the **Run** button to run the getFiles query. + +
    + Fetch Files Query +
    + +- Drag an **[Image](/docs/widgets/image)** and a **[PDF](/docs/widgets/pdf)** component on the canvas from the components library. Rename the **Image** component to *displayImage* and the **PDF** component to *displayPDF*. +- In the **URL** property of the **displayImage** component, enter: +```js +{{'data:image;base64,' + queries.getFiles.data[0].image}} +``` + +- Let's apply the same logic for the **displayPDF** component and enter the below value in the **File URL** property: + +```js +{{'data:pdf;base64,' + queries.getFiles.data[0].pdf}} +``` +
    + PDF Component With File URL +
    + +The provided code constructs a Data URL to display the base64-encoded data as an image or PDF. + +
    +
    + +Here's what our final interface will look like: + +
    + Final Preview +
    + + +You can also use transformations in the query response and concat `data:image/jpeg;base64,` to the base64 data. + +
    +
    + +Using the above logic, you can upload and view files in ToolJet using the base64 data. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/pass-query-params-in-custom-components.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/pass-query-params-in-custom-components.md new file mode 100644 index 0000000000..049830eca8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/pass-query-params-in-custom-components.md @@ -0,0 +1,97 @@ +--- +id: pass-query-params-in-custom-components +title: Pass Query Parameters in Custom Components +--- + +In this guide, you'll learn how to trigger a query with parameters inside a Custom Component. + +- To begin, create a **REST API** query with an `id` parameter, and rename it to *getIndividualTodo*. + +- Select `GET` as the operation and enter the URL below under the `URL` property: + +```javascript +https://jsonplaceholder.typicode.com/todos/{{parameters.id}} +``` + +
    + Table Component With Data +
    + +- Next, drag and drop a **Custom Component** on the canvas. Enter the code below under its `Data` property: + +```javascript +{{ + { title: 'Todos', buttonText: 'Get Todo', queryData: queries.getIndividualTodo.data} +}} +``` + +Here, the title for the component, button text, and query data are being passed inside the Custom Component. + +- Enter the code below under the `Code` property: + +```javascript +import React, { useState, useEffect } from 'https://cdn.skypack.dev/react'; +import ReactDOM from 'https://cdn.skypack.dev/react-dom'; +import { Button, Container, TextField, Typography } from 'https://cdn.skypack.dev/@material-ui/core'; + +const MyCustomComponent = ({ data, updateData, runQuery }) => { + const [todoId, setTodoId] = useState(1); + + const fetchTodo = async () => { + try { + const { data: todo } = await runQuery('getIndividualTodo', { id: todoId }); + if (todo) updateData({ ...data, queryData: todo }); + } catch (error) { + console.error("Error fetching todo:", error); + } + }; + + return ( + + {data.title} + setTodoId(e.target.value)} + variant="outlined" + margin="normal" + fullWidth + /> + + {data.queryData?.title && ( +
    +

    ID: {data.queryData.id}

    +

    Title: {data.queryData.title}

    +

    Completed: {data.queryData.completed ? "Yes" : "No"}

    +
    + )} +
    + ); +}; + +const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent); + +ReactDOM.render(, document.body); +``` + +In the `runQuery('getIndividualTodo', { id: todoId })` function, the parameter is passed by including `id: todoId` as an argument in the query call, which specifies the unique identifier for the todo item being requested. + +
    + Custom Component +
    + + +- Now, when you click the **Fetch Todo** button, the *getIndividualTodo* query will run with the Todo ID passed as a parameter and return the details of the Todo + +
    + Custom Component With Todos Fetched +
    + + +Note: In a typical JavaScript query, parameters are passed in a manner similar to a standard function call. For example, you can specify the parameters for the query using `queries.getIndividualTodo.run({ id: 2 })`. + + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/pass-values-in-rest-api.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/pass-values-in-rest-api.md new file mode 100644 index 0000000000..a371f9b3cd --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/pass-values-in-rest-api.md @@ -0,0 +1,55 @@ +--- +id: pass-values-in-rest-api +title: Pass Values in a REST API Query +--- + +This guide gives you an overview of how you can pass values in a REST API Query using raw JSON and key-value pairs. + +
    + +## 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: + content type: ${components.typeOfContentInput.value}, + additional info: ${components.additionalInfoInput.value}" + }, + { + "inline_data": { + "mime_type":"image/jpeg", + "data": "${components.imageUploader.file[0].base64Data}" + } + },], + },], + }` + }} +``` + +
    + Passing Values Using Raw JSON +
    + +
    + +
    + +## Entering Key Value Pairs + +In this example, simple key-value pairs are entered in the provided input fields. Here, the values can simply be passed using double curly braces as is typically done in ToolJet. Take note of the status key. A string is combined with another value that is referred using double curly braces. + +
    + Passing Values Using The Key Value Inputs +
    + +
    + +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 diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/print-multitabs.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/print-multitabs.md new file mode 100644 index 0000000000..2c5460a252 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/print-multitabs.md @@ -0,0 +1,245 @@ +--- +id: print-multi-tabs-report +title: Print Data from Multiple Tabs +--- +
    + +In this guide, we will implement printing data from multiple tabs in ToolJet. This will be useful when printing an invoice or a report from your ToolJet application. For example, a ToolJet app that has a set of tabs for each invoice, and you want to print all the tabs in one go. + + +
    + +
    + +## UI of the App + +On the ToolJet homepage, click on the ellipses on the `Create new app` button. Choose an app with a set of tabs for each record. Each tab will have a set of fields to display. For this guide, we will be using the **Lead Management System** app. + +In the example below, we have the **Tabs** component and each tab has a set of fields to display the record details. + +- **Tabs**: Each tab represents different type of lead record. For this app, we have 4 tabs. Each tab has an id starting from 0 to 4. + +- **Button**: The **Create Lead** button is the deafult button. For this guide, we will also add another button named **Download PDF**, that will print the data from all the tabs. The button will have two events, the details for which we will share later in this guide. + +
    + Print data from multiple tabs +
    + +
    + +
    + +## Load Data from Database + +- To load the data from the database, we will use the **lead_management_system** table. +- In the *fetchLeads* query, choose `lead_management_system` in `Table name` parameter. +- Choose `List rows` in the `Operations` parameter. +- Click on the **Run** button in the query panel to load the data. + +
    + Print data from multiple tabs +
    + +Once the data is successfully loaded on the tabs and the app is working as expected, we can move to the next step. + +
    + +
    + +## Printing Data from Multiple Tabs + +To print data from multiple tabs, we will create few JavaScript queries. Using event handlers, we will run these JavaScript queries in a sequence to print data from all the tabs. + +Before we start creating the JavaScript queries, we need to add a few events to the **Download PDF** button: + +|
    Event
    |
    Action
    |
    Description
    | +|:--- |:--- |:--- | +| On click | Set variable | Set a variable with key `lastSelectedTab` and value to `{{components.tabs1.currentTab}}`. This will store the id of the currently selected tab in the variable. | +| On click | Run query | Select the query named *viewTabs* to run when the button is clicked. | + +**Note**: We will create the *viewTabs* query later in this guide, so you will need to add the event to the button after you've created the query. + +
    + Print data from multiple tabs +
    + +
    + +
    + +## Creating Queries + +
    + +### viewTabs Query + +The *viewTabs* query is a JavaScript query that will run a loop to print data from all the tabs. The query will set a variable `tabIndex` that will store the id of the tab to print data from. The query for this app will loop and increment the tabsIndex variable by 1, using the setVariable action, till the value is less than 4. + +```js title="viewTabs" +if ((variables?.tabIndex ?? undefined) == undefined) { + await actions.setVariable("tabIndex", "0"); // set tabIndex to 0 if it is not set +} else if (parseInt(variables.tabIndex) < 4){ + await actions.setVariable("tabIndex", (parseInt(variables.tabIndex) + 1).toString()); // increment tabIndex by 1 +} +``` + +**This query will have 3 events:** + +#### Event 1: + +- In the *viewTabs* query, click on the **New event handler** button, for the event type, choose `Query Success` from the dropdown. +- Choose `Control component` as the **Action** for the event. +- In the **Run only if** parameter of the event, copy the code: `{{parseInt(variables.tabIndex) < 4}}`. This will run only if the output of the given code is true, i.e. if the tabIndex is less than 4. +- Under the **ACTION OPTIONS** of the event, choose **Action** as `Set current tab`. +- Copy the code: `{{variables.tabIndex}}` in the Id parameter. This sets the current tab to the tab with id stored in the tabIndex variable, i.e. it sets the current tab to the tab whose id got recently stored in the `tabIndex` variable via the *viewTabs* query. + +
    + Print data from multiple tabs +
    + +#### Event 2: + +- The second event in this query will also be a `Query Success` event. +- Choose `Run Query` as the **Action** for the event. +- In the **Run Only If** parameter, copy the code: `{{parseInt(variables.tabIndex) < 4}}`. This event will run only if the condition given in the code is true. +- The query for this event handler will be `getTabsHTML`. +- Add a **Debounce** of `100` milliseconds to this event handler. + +**Note:** We will create the *getTabsHTML* query later in this guide, so you will need to add the event to the button after you've created the query. + +
    + Print data from multiple tabs +
    + +#### Event 3: + +- The third event in this query will also be a `Query Success` event. +- Choose `Run Query` as the **Action** for the event. +- In the **Run Only If** parameter, copy the code: `{{parseInt(variables.tabIndex) === 4}}`. This action runs only when the `tabIndex` is equal to 4, i.e. the last iteration of the loop and we will print the data from all the tabs in this iteration. +- The query for this event handler will be `printPDF`. + +**Note:** We will create the *printPDF* query later in this guide, so you will need to add the event to the button after you've created the query. + +
    + Print data from multiple tabs +
    + +Now that we have created the *viewTabs* query, we can go to the **[Download PDF](/docs/how-to/print-multi-tabs-report#printing-data-from-multiple-tabs)** button and add the *viewTabs* query to the `On click` event handler. + +
    + +
    + +### getTabsHTML Query + +The *getTabsHTML* is a JavaScript query that will get the HTML of the current tab and store it in a variable. The query will have a variable `tabsHtml` that will store the HTML of all the tabs in the form of an array. + +```js title="getTabsHTML" +actions.setVariable( // set tabsHtml variable + "tabsHtml", + [...(variables?.tabsHtml ?? [])].concat([ // add html of the current tab to the tabsHtml variable + ((variables?.tabIndex ?? -1) > 0 + ? `
    ` // this will help to print data from all the tabs in one go + : "") + + document.getElementsByClassName("widget-" + components.tabs1.id)[0] // get the html of the current tab + .innerHTML + + "
    ", // add the html of the current tab to the tabsHtml variable + ]) +); +``` + +**This query will have 1 event:** + +#### Event 1: + +- The event in this query will be a `Query Success` event. +- This event will have an **Action** of `Run Query`. +- In the **Query** Parameter, choose *viewTabs* as the query. This will run the *viewTabs* query after the *getTabsHTML* query is successfully executed. + +
    + Print data from multiple tabs +
    + +Now that we have created the *getTabsHTML* query, we can go to the *viewTabs* query and in the **Event 2** of that query, add the *getTabsHTML* query to the event handler. + +
    + +
    + +### printPDF Query + +The *printPDF* query is a JavaScript query that generates a printable document from the HTML content stored in the `tabsHtml` variable. This query will open a new window and write the HTML content of all the tabs. This will allow the user to download a PDF document that includes the formatted content of all the tabs. + +```js title="printPDF" +var printContents = variables.tabsHtml; // get the html of all the tabs from the tabsHtml variable + +var winPrint = window.open("", "", "width=900,height=650"); // Open a New Window for Printing + +var styles = document.querySelectorAll('link, style'); +var stylesHtml = ""; +for (var i = 0; i < styles.length; i++) { + stylesHtml += styles[i].outerHTML; +} // gather styles from the current page + +stylesHtml += ''; // add landscape orientation to the page + +winPrint.document.write( + "" + + stylesHtml + + "" +); // add styles to the page + +for (var j = 0; j < printContents.length; j++) { + winPrint.document.write(printContents[j]); +} // add html of all the tabs to the page + +winPrint.document.write(""); // Document Finalization and Printing +winPrint.document.close(); +winPrint.focus(); +winPrint.print(); +winPrint.close(); +``` + +**This query will have 3 events:** + +#### Event 1: + +- In the *printPDF* query, click on the **New event handler** button, for the event type, choose `Query Success` from the dropdown. +- Choose `Unset variable` as the **Action** for the event. +- Under the **ACTION OPTIONS** of the event, set `tabsIndex` as the **Key**. This will unset the tabsIndex variable after the *printPDF* query is successfully executed. + +
    + Print data from multiple tabs +
    + +#### Event 2: + +- The second event in this query will also be a `Query Success` event. +- Choose `Unset variable` as the **Action** for the event. +- Under the **ACTION OPTIONS** of the event, set `tabsHtml` as the **Key**. This will unset the `tabsHtml` variable after the *printPDF* query is successfully executed. + +
    + Print data from multiple tabs +
    + +#### Event 3: + +- The third event in this query will also be a `Query Success` event. +- Choose `Control component` as the **Action** for the event. +- Choose `tabs1` for the **Component** parameter. +- Choose `Set current tab` as the **Action**. +- For the Id parameter, copy the code: `{{variables.lastSelectedTab}}`. This will set the current tab to the tab that was selected before the **Download PDF** button was clicked. + +
    + Print data from multiple tabs +
    + +Now that we have created the *printPDF* query, we can go to the *viewTabs* query, and in the **Event 3** of that query, add the *printPDF* query to the **Query Success** event handler. + +Finally, we can test the app by clicking on the **Download PDF** button. This will redirect us to the new tab of the browser, and download a PDF document with the data from all the tabs. + +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/run-action-from-runjs.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/run-action-from-runjs.md new file mode 100644 index 0000000000..497c31084c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/run-action-from-runjs.md @@ -0,0 +1,268 @@ +--- +id: run-actions-from-runjs +title: Run Actions from RunJS query +--- + +ToolJet allows you to execute various [actions](/docs/actions/show-alert) within RunJS queries. This guide outlines the syntax and examples for each action. + +
    + +### Run Query + +To trigger a query, you can use the below functions: + +```js +queries.getSalesData.run() +// replace getSalesData with your query name +``` +or +```js +await actions.runQuery('getSalesData') +// replace getSalesData with your query name +``` + +**Example:** + +In the screenshot below, we are triggering two different queries using two different syntax available for `Run Query` action. + +
    + Print data from multiple tabs +
    + +
    + +
    + +### Get Query Data + +In the previous section, we saw how we can trigger queries. Once the queries are triggered, if you want to immediately use the data returned by the query inside the RunJS query, you can use the `getData()`, `getRawData()` and `getLoadingState()` functions: + +#### Trigger a query and retrieve its data: + +```js +await queries.getSalesData.run(); +// replace getSalesData with your query name + +let value = queries.getSalesData.getData(); +// replace getSalesData with your query name +``` + +#### Trigger a query and retrieve its raw data: + +```js +await queries.getCustomerData.run(); +//replace getCustomerData with your query name + +let value = queries.getCustomerData.getRawData(); +// replace getCustomerData your with query name +``` + +#### Trigger a query and retrieve its loading state: + +```js +await queries.getTodos.run() +//replace getTodos with your query name + +let value = queries.getTodos.getLoadingState(); +//replace getTodos with your query name +``` + +
    + +
    + +### Set Variables + +To create a variable, you can use the below function: + +```javascript +actions.setVariable('', ``) +``` + +
    + +
    + +### Unset Variable + +To delete a created variable, you can use the below function: + +**Syntax:** + +```javascript +actions.unSetVariable('') +``` + +
    + +
    + +### Get Variables + +To access variables immediately after setting them in a RunJS query, you can use the `getVariable` and `getPageVariable` functions: + +#### Set and retrieve a variable: + +```js +actions.setVariable('mode','dark'); +//replace mode with your desired variable name + +return actions.getVariable('mode'); +``` + +#### Set and retrieve a page-specific variable: +```js +actions.setPageVariable('number',1); +//replace number with your desired variable name + +return actions.getPageVariable('number'); +``` + +
    + +
    + +### Logout + +To log out the current logged-in user from the ToolJet, use the below function: + +```javascript +actions.logout(); +``` + +
    + +
    + +### Show Modal + +To open a modal using RunJS query, use the below function: + +```javascript +actions.showModal('') +``` + +
    + +
    + +### Close Modal + +To close a modal using RunJS query, use the below function: + +```javascript +actions.closeModal('') +``` + +
    + +
    + +### Set Local Storage + +Set a value in local storage using the below code: + +**Syntax:** + +```javascript +actions.setLocalStorage('key', 'value'); +``` + +
    + +
    + +### Copy to Clipboard + +Use the below code to copy content to the clipboard: + +```javascript +actions.copyToClipboard('') +``` + +
    + +
    + +### Generate File + +The below action can be used to generate a file. + +```js +actions.generateFile('', '', '') +``` + +`fileName` is the name that you want to give the file(string), `fileType` can be **csv**, **plaintext**, or **pdf** and `data` is the data that you want to store in the file. + +Example for generating CSV file: + +```js +actions.generateFile('csvfile1', 'csv', '{{components.table1.currentPageData}}') // generate a csv file named csvfile1 with the data from the current page of table +``` + +Example for generating Text file: + +```js +actions.generateFile('textfile1', 'plaintext', '{{JSON.stringify(components.table1.currentPageData)}}') // generate a text file named textfile1 with the data from the current page of table (stringified) +``` + +Example for generating PDF file: + +```js +actions.generateFile('Pdffile1', 'pdf', '{{components.table1.currentPageData}}') // generate a text file named Pdffile1 with the data from the current page of table +``` + +
    + +
    + +### Go to App + +You can switch to a different application using the below action: + +```javascript +actions.goToApp('slug',queryparams) +``` + +- `slug` can be found in URL of the released app after `application/` or in the share modal that opens up when you click on the `Share` button on the top-right of the app-builder +- `queryparams` can be provided in this format - `[ ['key1','value1' ], ['key2','value2'] ]` + +
    + +
    + +### Show Alert + +To show an alert using RunJS query, use the below code: + +```js +actions.showAlert('' , '' ) +``` + +Available alert types are `info`, `success`, `warning`, and `danger`. + +Example: +```js +actions.showAlert('error' , 'This is an error' ) +``` + +
    + +
    + +### Run Multiple Actions From RunJS Query + +To run multiple actions from a RunJS query, you'll have to use **async-await** in the function. + +Here is a example code snippet for running the queries and showing alert after specific intervals. Check the complete guide on running queries at specified intervals **[here](/docs/how-to/run-query-at-specified-intervals)**. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/run-query-at-specified-intervals.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/run-query-at-specified-intervals.md new file mode 100644 index 0000000000..6de502e96a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/run-query-at-specified-intervals.md @@ -0,0 +1,115 @@ +--- +id: run-query-at-specified-intervals +title: Run Query at Specified Intervals +--- +
    + +In this guide, we'll walk through the process of building a ToolJet application that automates data retrieval at specific intervals. By utilizing the RunJS queries, we can set up intervals for triggering queries, ensuring that the data is fetched dynamically and efficiently. + +
    + +
    + +## Step 1: Create a New Application + +Begin by creating a new application in the ToolJet dashboard. Once the app builder opens, Drag a table component onto the canvas. This component will display the data fetched from the REST API query. + +
    + Table Component With Data +
    + +
    + +
    + +## Step 2: Set Up a REST API Query + +From the query panel, create a new REST API query. Utilize mock REST API data by choosing the 'GET' method and specifying the endpoint (e.g., `https://jsonplaceholder.typicode.com/posts`). Name the query 'post' and `Run` the query to ensure that the data is fetched successfully. + +
    + Table Component With Data +
    + +
    + +
    + +## Step 3: Configure Table Properties + +In the Table properties, link the query data to the table by setting the 'table data' property to `{{queries.post.data}}`. This establishes the connection between the REST API query and the table component. + +
    + Table Component With Data +
    + +
    + +
    + +## Step 4: Implement the RunJS Query + +Create a RunJS query to set up intervals for triggering the REST API query. Use the following script: + +```js +actions.setVariable('interval', setInterval(countdown, 5000)); // 5000ms = 5 seconds + +function countdown(){ // Function to trigger the REST API query + queries.post.run(); // action to run the REST API query +} +``` + +Adjust the interval duration according to your needs. Optionally, utilize `async` and `await` for multiple actions within the countdown function. + +```js +actions.setVariable('interval',setInterval(countdown, 5000)); +async function countdown(){ + await queries.restapi1.run() + await queries.restapi2.run() + await actions.showAlert('info','This is an information') +} +``` + +
    + +
    + +## Step 5: Advanced Configuration + + +From the Settings section of the RunJS query, enable 'Run query on page load.' This ensures that the query is triggered when the application is loaded. Rename the query as 'setInterval' to complete the configuration. + +
    + Table Component With Data +
    + +
    + +
    + +## Step 6: Prevent Indefinite Triggering + +Create another RunJS query named 'clearInrternal' to stop the query from triggering indefinitely. Use the `clearInterval()` method to clear the interval. This method retrieves the value from the variable set in the 'setInterval' query. + +```js +clearInterval(variables.interval); +``` + +
    + +
    + +## Step 7: Add a Button + +Drag a button on the canvas to act as a user-triggered stop mechanism. Attach an event handler to execute the 'clear' query when the button is clicked. + +
    + Table Component With Data +
    + +
    + +
    + +By following these steps, your ToolJet application will dynamically fetch data at specified intervals, providing an efficient and automated user experience. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/s3-custom-endpoint.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/s3-custom-endpoint.md new file mode 100644 index 0000000000..bcc33b30b4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/s3-custom-endpoint.md @@ -0,0 +1,22 @@ +--- +id: s3-custom-endpoints +title: Use Custom Endpoint for S3 Hosts +--- +
    + +In this how-to guide, we will see how we can connect to different **S3 compatible object storages** using the custom endpoint. In this guide, we are using Minio since it is an S3-compatible object storage. + +- Go to the ToolJet dashboard, and create a new application +- On the left-sidebar, go to the **Sources** and add a new AWS S3 datasource +- Now the connection modal will pop-up. + +
    + + Custom Endpoint - S3 hosts + +
    +- To get the **Credentials** which is **Access Key** and **Secret Key**, you'll need to go to the Minio console to generate the keys +- Enable the **Custom Endpoint** toggle switch, and enter the custom host URL i.e where your Minio server API is exposed +- Once entered the details, you can click on the **Test Connection** button to check the connection + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/serverside-pagination.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/serverside-pagination.md new file mode 100644 index 0000000000..aeece0d9a9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/serverside-pagination.md @@ -0,0 +1,92 @@ +--- +id: use-server-side-pagination +title: Using Server Side Pagination in Tables +--- + +
    + +In this guide, we will implement server-side pagination for large datasets in a table component to enhance application performance. This guide is applicable for databases like MySQL, PostgreSQL, MSSQL, MongoDB, etc., supporting `limit` and `offset` for chunked data retrieval. + +
    + +
    + +### Loading Data from PostgreSQL in Chunks + +To fetch data in chunks from a PostgreSQL table `users`, use `limit` and `offset` in the SQL query: + +```sql title="PostgreSQL query" +SELECT * +FROM users +ORDER BY id +LIMIT 100 OFFSET {{(components.table1.pageIndex-1)*100}}; +``` + +The query will fetch 100 rows at a time from the PostgreSQL users table, and the number of rows returned is determined by the current value of `pageIndex`(exposed variable) in the Table component. + +The following is the breakdown of the above PostgreSQL query: + +- `ORDER BY id`: Orders the result set by the id column. + +- `LIMIT 100`: Limits rows returned to 100 per query. + +- `OFFSET {{(components.table1.pageIndex-1)*100}}`: Determines the starting row number based on the current page index for pagination. + + +To obtain the count of records in the users table, execute the following query: + +```sql +SELECT COUNT(*) +FROM users; +``` + +
    + +
    + +### Edit the Table Component + +**Follow the steps below to edit the properties of the Table component:** + +- Drag the table component to the canvas from the components library and set the value of the **Data** property to `{{queries..data}}` to populate the table with the relevant data. + +- Enable the **Server-side pagination** option. +- Click on the `Fx` next to **Enable previous page button** and set the value as below. This condition disables the previous page button when the current page is page `1`. + + ```js + {{components.table1.pageIndex >=2 ? true : false}} + ``` + +- Click on the `Fx` next to **Enable next page button** and set it's value as below. This condition disables the next page button when the current page is the last page. + ```js + {{components.table1.pageIndex < queries..data[0].count/100 ? true : false}} + ``` + +- Set the value of the **Total records server side** property as below. This will set the total number of records in the Table component. + ```js + {{queries..data[0].count}} + ``` + +
    + Table data +
    + + +- To add the loading indicator on the table component while executing the query, set the `Loading state` property as: + + ```js + {{queries..isLoading}} + ``` +- Select the **Page changed** event and choose the **Run Query** action, after clicking the `New event handler`. Then, select the **Query** from the dropdown that fetches data from the PostgreSQL table. + +
    +Table data +
    + +Now, whenever the page is changed, the query will be executed, and the data will be fetched from the PostgreSQL table in chunks. + +
    + Table data +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/setup-syslog.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/setup-syslog.md new file mode 100644 index 0000000000..6c6cdd3993 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/setup-syslog.md @@ -0,0 +1,101 @@ +--- +id: setup-rsyslog +title: Setup Log File Generation (Rsyslog) +--- +
    + +The **log file** serves as a comprehensive record of audit logs, capturing crucial information about various activities within the ToolJet. Follow the guide below to set up and utilize the log file feature effectively. + +
    + +
    + +## Activation and Configuration + +### Environment Variable Setup + +- To **activate** the log file feature, simply set the environment variable `LOG_FILE_PATH` to specify the desired path for the log file. For instance, if you want to use `rsyslog` as the log file path, set `LOG_FILE_PATH` to `rsyslog`. + + ```bash + LOG_FILE_PATH='rsyslog' + ``` + +
    + Setup log file generation +
    + +- The log file path is relative to the home directory of the machine. For instance, if the home directory is `/home/tooljet`, the log file path will be `/home/tooljet/rsyslog`. + +### Server Restart + +- After configuring the log file environment variable, it's essential to **restart the server** to initiate the log file generation process. + +- This step ensures that the server recognizes the new configuration and begins recording audit logs. + +
    + +
    + +## Log Rotation and Organization + +### Daily Log Rotation + +- The log file is designed to rotate on a daily basis, creating a new log file each day. This configuration aids in efficient management and organization of audit data. + +### Log File Path Structure + +- The log file path is determined by the `LOG_FILE_PATH` variable. It is crucial to understand that this path is relative to the home directory of the machine. For instance, if `LOG_FILE_PATH` is set to `rsyslog`, the resulting log file path will be structured as follows: + + ```bash + homepath/rsyslog/{process_id}-{date}/audit.log + ``` + + - `{process_id}` is a placeholder for the unique process identifier. + - `{date}` represents the current date. + + This structured path ensures that audit logs are organized by both process and date, simplifying traceability and analysis. + +
    + Setup log file generation +
    + +### Example Log Data + +The log data captures essential details, such as user ID, organization ID, resource ID, resource type, action type, resource name, IP address, and additional metadata. + +
    +Example Log file data + +```bash +{ + level: 'info', + message: 'PERFORM APP_CREATE OF awdasdawdwd APP', + timestamp: '2023-11-02 17:12:40', + auditLog: { + userId: '0ad48e21-e7a2-4597-9568-c4535aedf687', + organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17', + resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829', + resourceType: 'APP', + actionType: 'APP_CREATE', + resourceName: 'awdasdawdwd', + ipAddress: '::1', + metadata: { + userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', + tooljetVersion: '2.22.2-ee2.8.3' + } + }, + label: 'APP' +} +``` + +
    + +### Folder Creation + +The log file feature automatically creates a folder in the home path with the specified name (e.g., `rsyslog`). This folder serves as the root directory for the organized storage of audit logs. + +
    + Setup log file generation +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/upload-files-aws.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/upload-files-aws.md new file mode 100644 index 0000000000..e5a6670f03 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/upload-files-aws.md @@ -0,0 +1,162 @@ +--- +id: upload-files-aws +title: Upload and Download Files on AWS S3 Bucket +--- +
    + +This guide will help you in quickly building a basic UI for uploading or downloading files from AWS S3 buckets. + +Before building the UI, check out the **[docs for AWS S3 data source](/docs/data-sources/s3)** to learn about setting up AWS S3 and adding the data source. + +Once you have successfully added the AWS data source, build a basic UI using the following widgets: +- **Dropdown**: For selecting a bucket in S3 storage. +- **Table**: For listing all the objects inside the selected bucket in dropdown. +- **Text Input**: For getting a path for the file that is to be uploaded. +- **File picker**: For uploading the file. +- **Button**: This will be used to fire the upload query. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/ui.png) + +
    + +
    + +
    + +## Queries + +We'll create the following queries: + +1. **getBuckets** +2. **listObjects** +3. **uploadToS3** +4. **download** + +
    + +
    + +### getBuckets + +This query will fetch the list of all the buckets in your S3. Just create a new query, select AWS S3 data source, and choose **List buckets** operation. Name the query **getBuckets** and click **Save**. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/getBuckets.png) + +
    + +Now, let's edit the properties of **dropdown** widget. + +- **Label**: Set the label as Bucket. +- **Option values**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. We're mapping the data returned by the query as the returned data is array of objects. +- **Option label**: Set option values as `{{queries.getBuckets.data.Buckets.map(bucket => bucket['Name'])}}`. This will display the same option label as option values. + +You can later add an event handler for running the **listObject** query whenever an option is selected from the dropdown. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/dropdown.png) + +
    + +
    + +
    + +### listObjects + +This query will list all the objects inside the selected Bucket in dropdown. Select **List objects in a bucket** operation, enter `{{components.dropdown1.value}}` in the Bucket field - this will dynamically get the field value from the selected option in dropdown. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/listObjects.png) + +
    + +Edit the properties of **table** widget: +- **Table data**: `{{queries.listObjects.data['Contents']}}` +- **Add Columns**: + - **Key**: Set the **Column Name** to `Key` and **Key** to `Key` + - **Last Modified**: Set the **Column Name** to `Last Modified` and **Key** to `LastModified` + - **Size**: Set the **Column Name** to `Size` and **Key** to `Size` +- Add a **Action button**: Set button text to **Copy signed URL**, Add a handler to this button for On Click event and Action to Copy to clipboard, in the text field enter `{{queries.download.data.url}}` - this will get the download url from the **download** query that we will create next. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/table.png) + +
    + +
    + +
    + +### download + +Create a new query and select **Signed URL for download** operation. In the Bucket field, enter `{{components.dropdown1.value}}` and in Key enter `{{components.table1.selectedRow.Key}}`. + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/download.png) + +
    + +Edit the **properties** of the table, add a Event handler for running the `download` query for `Row clicked` event. This will generate a signed url for download every time a row is clicked on the table. + +
    + +
    + +### uploadToS3 + +Create a new query, select the **Upload object** operation. Enter the following values in their respective fields: +- **Bucket**: `{{components.dropdown1.value}}` +- **Key**: `{{ components.textinput1.value + '/' +components.filepicker1.file[0].name}}` +- **Content type**: `{{components.filepicker1.file[0].type}}` +- **Upload data**: `{{components.filepicker1.file[0].base64Data}}` +- **Encoding**: `base64` + +
    + +![ToolJet - How To - Upload files on AWS S3 bucket](/img/how-to/upload-files-aws/uploadToS3.png) + +
    + +
    + +
    + +#### Configure the File Picker: + +Click on the widget handle to edit the file picker properties: + +- Change the **Accept file types** to `{{"application/pdf"}}` for the picker to accept only pdf files or `{{"image/*"}}` for the picker to accept only image files . In the screenshot below, we have set the accepted file type property to `{{"application/pdf"}}` so it will allow to select only pdf files: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/result-filepicker.png) + +
    + +- Change the **Max file count** to `{{1}}` as we are only going to upload 1 file at a time. + +- Select a pdf file and hold it in the file picker. + +:::info + File types must be valid **[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)** type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/config-filepicker.png) + +
    + +Final steps, go to the **Advanced** tab of the **uploadToS3** query and add a query to run **listObjects** query so that whenever a file is uploaded the tabled is refreshed. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/upload-files-gcs.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/upload-files-gcs.md new file mode 100644 index 0000000000..b948ee575d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/upload-files-gcs.md @@ -0,0 +1,90 @@ +--- +id: upload-files-gcs +title: Upload Files Using GCS +--- +
    + +In this guide, we are going to create an interface to upload PDFs to Google Cloud Storage. + +Before adding the new data source we will need to have a private key for our GCS bucket and make sure the key has the appropriate rights. + +
    + +
    + +## Setting up Google Cloud Storage Data Source + +1. Go to the data source manager on the left-sidebar and click on the `+` button. +2. Add a new GCS data source from the **APIs** section in modal that pops up. +3. Enter the **JSON private key for service account** and test the connection. +4. Click on **Save** to add the data source. + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/adding-account.png) + +
    + +
    + +
    + +## Adding a File Picker + +1. Drag and drop the **file picker** widget on the canvas +2. Configure the file picker: + - Change the **Accept file types** to `{{"application/pdf"}}` for the picker to accept only pdf files. In the screenshot below, we have set the accepted file type property to `{{"application/pdf"}}` so it will allow to select only pdf files: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/result-filepicker.png) + +
    + + - Change the **Max file count** to `{{1}}` as we are only going to upload 1 file at a time. + +3. Select a pdf file and hold it in the file picker. + +:::info + File types must be valid **[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)** type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/config-filepicker.png) + +
    + +
    + +
    + +## Creating a Query + +1. Click on the `+` button of the query manager at the bottom panel of the editor and select the GCS data source +2. Select **Upload file** operation and enter the required parameters: +- Bucket: `gs://test-1` +- File Name: `{{components.file1.file[0]['name']}}` +- Content Type: `{{components.file1.file[0]['type']}}` +- Upload data: `{{components.file1.file[0]['base64Data']}}` +- Encoding: `base64` +3. Click on **Save** to create the query + +
    + +
    + +## Running the Query +1. Add a **button** that will fire the query to upload the file +2. Edit the properties of the button and add a **event handler** to **Run the query** on **On-Click** event. +3. Click on **Button** to fire the query, this will upload the pdf file that you selected earlier through the file picker and will upload it on the GCS. + +
    + +![ToolJet - How To - Upload files using GCS](/img/how-to/upload-files-gcs/final-result.png) + +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-axios.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-axios.md new file mode 100644 index 0000000000..4ac9556aae --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-axios.md @@ -0,0 +1,68 @@ +--- +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`. + +
    + +
    + +## GET Requests + +We'll use **[JSONPlaceholder](https://jsonplaceholder.typicode.com/)**, a free API, to demonstrate GET and PUT requests. + +- Create a RunJS query and paste the code below: + +```javascript +var url = "https://jsonplaceholder.typicode.com/users/1"; + +var data = (await axios.get(url)).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.* + +
    + +Use Axios in RunJS + +
    + +
    + +
    + +## POST Requests + +- Create a RunJS query and paste the code below: + +```javascript +var url = "https://jsonplaceholder.typicode.com/users"; + +var data = axios.post(url,{ + id: 11, + name: "Shubhendra", + username: "camelcaseguy", + email: "shubhendra@tooljet.com",}) + +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 + +
    + +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/)**. + + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-custom-parameters.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-custom-parameters.md new file mode 100644 index 0000000000..369bb32ef4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-custom-parameters.md @@ -0,0 +1,100 @@ +--- +id: use-custom-parameters +title: Use Custom Parameters +--- +
    + +Custom parameters in your queries offer a flexible way to introduce variables without directly modifying query parameters. This guide will walk you through creating, utilizing, and calling queries with custom parameters. + +
    + +
    + +### Adding Custom Parameters + +1. Open the query panel and select the query you want to add custom parameters to. +2. Navigate to the **Parameters** section in the top bar. +3. Click the **+** button to add a custom parameter. +4. For each parameter, specify: + - **Name:** Identifier for the parameter. + - **Default value:** A constant string, number, or object. + +
    + How to: use custom parameters +
    + +
    + +
    + +### Syntax for Utilizing Parameters + +Use `parameters.` in your query to employ custom parameters. Note that parameters can only be used within the query where they are defined. + +
    + How to: use custom parameters +
    + +
    + +
    + +### Example: Create Row in ToolJetDB with Custom Parameters + +Let's assume we have a ToolJetDB table with the following columns: `name`, `email`, and `contact`. We will create a new row in the table using custom parameters. + +- Create a new ToolJetDB query, select a table from the dropdown and select the `Create Row` operation. + +- Add the following parameters: + 1. **name:** `name` and **value:** `Shubh` + 2. **name:** `email` and **value:** `shubh@email.com` + 3. **name:** `contact` and **value:** `4638563845` + +
    + How to: use custom parameters +
    + +- Add the columns to the query and use the custom parameters to set the values. + + | Column | Value | + | ------ | ----- | + | name | `{{parameters.name}}` | + | email | `{{parameters.email}}` | + | contact| `{{parameters.contact}}` | + +
    + How to: use custom parameters +
    + +- Finally, execute the query to create a new row in the ToolJetDB table with the values provided in the custom parameters. + +
    + +
    + +### Example: Providing Custom Parameters Using Events + +In this example, we will demonstrate how to use custom parameters in a query by providing values from an event. We will use execute a REST API query and on its success, we will execute the ToolJetDB query to create a new row with the response data. + +1. **Create a REST API Query:** + - Method: `GET` + - URL: `https://reqres.in/api/users?page=2` + +2. **Add a Success Event:** + - Name: `onSuccess` + - Action: `Run Query` + - Query: `Create Row` + - Parameters: The parameters that you have added to the query will automatically be available in the event. + 1. **name:** `{{queries.getSalesData.data.data[0].name}}` This will use the name from the first record of the response data. + 2. **email:** `{{queries.getSalesData.data.data[0].email}}` This will use the email from the first record of the response data. + 3. **contact:** `4638563845` provided as a constant value just for demonstration. + +3. **Execute the REST API query and observe the new row created in the ToolJetDB table.** + +**Note:** You can also use parameters in JavaScript queries. Learn more about [JS Query Parameter](/docs/data-sources/run-js/#parameters-in-run-javascript-code). + +
    + How to: use custom parameters +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-events-on-chart.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-events-on-chart.md new file mode 100644 index 0000000000..6d2ce87dbc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-events-on-chart.md @@ -0,0 +1,258 @@ +--- +id: use-events-on-chart +title: Use Events on Chart Created Through Custom Component +--- +
    + +This guide will use the Custom Component to create a chart using a third-party library that supports events. Plotly is one of the libraries that supports events. In this tutorial, we will build a chart using Plotly and add events. + +
    + Plotly Chart +
    + +
    + +
    + +## Step 1: Add a Custom Component + +- Open the App Builder and add a Custom Component to the page. +- Click on the Custom Component to open the Properties panel. + +Note: If you are not familiar with the Custom Component, please read the [Custom Component](/docs/widgets/custom-component/)documentation. + +
    + +
    + +## Step 2: Add the Code to the Custom Component + +In the Code section of the `Custom Component` properties, add the following code: + +```js +import React from 'https://cdn.skypack.dev/react'; +import ReactDOM from 'https://cdn.skypack.dev/react-dom'; +import { Button, Container } from 'https://cdn.skypack.dev/@material-ui/core'; +import Plotly from 'https://cdn.skypack.dev/plotly.js-basic-dist-min'; +import createPlotlyComponent from 'https://cdn.skypack.dev/react-plotly.js/factory'; + +// Define the custom component +const MyCustomComponent = ({ data, updateData, runQuery }) => { + // Create Plot component using Plotly + const Plot = createPlotlyComponent(Plotly); + + // Define onClick handler for bars + const barOnClick = ({ points }) => { + alert('A bar is clicked'); + }; + + // Render the component + return ( + + + + ); +}; + +// Connect the component +const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent); + +// Render the connected component to the DOM +ReactDOM.render(, document.body); +``` + +**The steps to implement the above code is as follows:** + +- Import the required libraries. + +```js +import React from 'https://cdn.skypack.dev/react'; // React library +import ReactDOM from 'https://cdn.skypack.dev/react-dom'; // React DOM library +import { Button, Container } from 'https://cdn.skypack.dev/@material-ui/core'; // Material UI library +import Plotly from 'https://cdn.skypack.dev/plotly.js-basic-dist-min'; // Plotly library +import createPlotlyComponent from 'https://cdn.skypack.dev/react-plotly.js/factory'; // Plotly React library +``` + + +- Create a function component called `MyCustomComponent`. This component will render the chart. The `createPlotlyComponent` function is used to create a Plotly component. +- A function called `barOnClick` is created that will be called when the user clicks on the bar. This function will display an alert message. + +```js +const MyCustomComponent = ({data, updateData, runQuery}) => { // function component +const Plot = createPlotlyComponent(Plotly); // create a Plotly component + + const barOnClick = ({points}) => { // function that will be called when the user clicks on the bar + alert('A bar is clicked') // display an alert message + } +``` + +- Render the chart using the `Plot` component. Pass the data and layout to the `Plot` component. Also pass the `barOnClick` function to the `onClick` prop of the `Plot` component. + +```js + return ( + + + + ); +}; +``` + +- Render the `MyCustomComponent` component using the `ReactDOM.render` function. + +```js +const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent); // connect the component to the Tooljet store +ReactDOM.render(, document.body); // render the component +``` + +
    + +
    + +## Step 3: Using Events from the Custom Component + +In the code above, we created a function called `barOnClick` that will be called when the user clicks on the bar. This function holds the code that will be executed when the user clicks on the bar. + +```js +const barOnClick = ({points}) => { + alert('A bar is clicked') +} +``` + +Instead of displaying an alert message, you can use the `runQuery` function to run a query. + +```js +const barOnClick = ({points}) => { + runQuery('queryName') +} +``` + +`runQuery` is a function which accepts a query name as a string used to run the query from the custom component. Learn more about the custom component [here](/docs/widgets/custom-component/). + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-form-component.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-form-component.md new file mode 100644 index 0000000000..88d098eb31 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-form-component.md @@ -0,0 +1,102 @@ +--- +id: use-form-component +title: Use Form Component +--- +
    + +In this guide, we'll create a simple app that uses a **[Form](/docs/widgets/form)** component to add records to a database. We'll use **[ToolJet Database](/docs/tooljet-db/tooljet-database/)** as our data source. + +
    + +
    + +## 1. Create a Table in ToolJet Database +- Create a table named *products* in ToolJet Database. +- Create three columns - `name`, `quantity` and `price`. +- Add some sample data to the table. + +
    + Database Table +
    + +
    + +
    + +## 2. Create the UI +- Create a new app and drag and drop a **[Table](/docs/widgets/table)** component on the canvas. +- Drop a **[Form](/docs/widgets/form)** next to it. +- Since we have three columns in the database, let's update the Form with one **[Text Input](/docs/widgets/text-input)** for `name` and two **[Number Inputs](/docs/widgets/text-input)** for `quantity` and `price`. +- Name the three input fields on the form as - *nameInput*, *quantityInput* and *priceInput*. Name the button as *submitButton*. + +
    + User Interface +
    +Naming the components can help in easily identifying or referring individual components when there are a large number of components in the app. + +
    + +
    + +## 3. Load the Table Component With Data + +- Click on the Add button in the **[Query Panel](/docs/app-builder/query-panel/)**, select ToolJet Database +- Rename the query to *getProducts* +- Choose *products* as Table name, List rows as Operations +- Enable `Run this query on application load?` to automatically run the query when the app starts +- Click on Run to fetch data +- Click on the Table component to open its properties panel on the right. Under the `Data` property, paste the below code: +```js +{{queries.getProducts.data}} +``` +
    + Table with Data +
    + +
    + +
    + +## 4. Write Data Using the Form Component +- Click on the Add button in the Query Panel, select ToolJet Database +- Select *products* as Table name, Create row as Operations +- Rename the query to *addProduct* +- Click on Add Column and add three columns - **name**, **quantity** and **price** +- Enter code below for **name**, **quantity** and **price** column keys: + +```js +{{components.form.data.nameInput.value}} +{{components.form.data.quantityInput.value}} +{{components.form.data.priceInput.value}} +``` + +To ensure the Table component updates with new data after adding products, trigger the *getProducts* query following each *addProduct* query execution. Here's how: + +- Click on **New event handler** in the *addProduct* query to add a new event. +- For the new event, leave the event as Query Success, set Run Query as the Action and choose *getProducts* as the Query. + +
    + Refresh Table +
    + +This process refreshes the Table component with the latest data from the database. +
    +
    + +- Next, click on the Form component and set `Button To Submit Form` as *submitButton*. +- Add a **New event handler** to the Form component. Keep On submit as Event, Run Query as Action and select *addProduct* as the Query. + +
    + Table with Data +
    + +Now if you enter the product data on the form and click on Submit. The `addProduct` query will run and the entered data will be written to the `products` table in the ToolJet Database. + +
    + Final Preview +
    +
    + +In this how-to guide, we have explored a practical application of the Form component in ToolJet. You can apply the same principles for a variety of use cases that requires data input from the end-user. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-inspector.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-inspector.md new file mode 100644 index 0000000000..62aa7f43c8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-inspector.md @@ -0,0 +1,92 @@ +--- +id: use-inspector +title: Use Inspector in App-Builder +--- +
    + +This guide introduces **Inspector** in the app-builder, a feature that lets you view data related to queries, components, global variables, page-related variables, user-set variables and constants. + +
    + Preview of Use Inspector +
    + +
    + +
    + +## Sections + +The Inspector panel has 6 main sections: + +- **[Queries](#queries)** +- **[Components](#components)** +- **[Globals](#globals)** +- **[Variables](#variables)** +- **[Page](#page)** +- **[Constants](#constants)** + +
    + +
    + +### Queries + +Queries allow you to inspect the specifics of your queries. However, the data related to these queries will only be visible after they have been executed or triggered. + +
    + +
    + +### Components + +Under Components, you can view and analyze the properties and values of the components you've added to the canvas, providing insights into how each component functions within your app. + +
    + +
    + +### Globals + +Globals give you access to global information related to the app. + +The globals selection consists of the following data: + +- **currentUser:** Contains details about the user who is currently logged in, like their **email**, **firstName**, and **lastName**. +- **groups:** A list of group names that the logged-in user is part of. Note: The `all_users` group is a default group for everyone. +- **theme:** Shows the name of the theme that is currently being used. +- **urlparams:** Details about the URL parameters of the app. +- **environment:** Has two parts: **id**, a unique auto-generated identifier, and **name**, the name of the current environment of the app version. +- **modes:** Indicates whether the app is in **edit**, **preview**, or **view** mode. **Edit** is for editing the app, **preview** is used when the preview button in the app builder is clicked, and **view** is for when the app is opened through a shared URL. + +:::info +All the global variables can be accessed anywhere within ToolJet applications. Here's an **[example use-case](/docs/how-to/access-currentuser)** that demonstrates the usage of these variables. +::: + +
    + +
    + +### Variables + +Variables shows user-defined variables in a key-value format. These variables, set through event handlers or queries, are accessible across the entire application. You can set variables from the [event handler](/docs/actions/set-variable) or using [JavaScript code](/docs/how-to/run-actions-from-runjs#set-variables). + +
    + +
    + +### Page +Page lets you view page-specific properties like page name, handle and variables. Page variables are restricted to their respective pages and are not accessible application-wide. + +
    + +
    + +### Constants + +Under **[Constants](/docs/security/constants/)**, you can find the predefined values (usually tokens/secret keys/API keys) that can be used across your application to maintain consistency and facilitate easy updates. + +:::info +The **environment** and **mode** variables are only available in **ToolJet Enterprise Edition v2.2.3** and above. +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-s3-presigned-url-to-upload-docs.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-s3-presigned-url-to-upload-docs.md new file mode 100644 index 0000000000..a69965a7ca --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-s3-presigned-url-to-upload-docs.md @@ -0,0 +1,138 @@ +--- +id: use-s3-signed-url-to-upload-docs +title: Use S3 Signed URL to Upload Documents +--- +
    + +In this how-to guide, we will upload documents to S3 buckets using the **S3 signed URL** from a ToolJet application. + +For this guide, we are going to use one of the existing templates on ToolJet: **S3 File explorer** + +
    + +
    + +## Create an App Using Templates + +- On ToolJet Dashboard, click on the ellipses on the right of the **Create new app** button, from the dropdown choose the **Choose from template** option. Select **AWS S3 file explorer** and click on the **Create application from template**. + + +
    + +Use S3 pre-signed URL to upload documents: Choose template + +
    + +- Go to the **Data sources** on the left-sidebar; you'll find that the **AWS S3 data source** has already been added. All you need to do is update the data source credentials. + +:::tip +Check the [AWS S3 data source reference](/docs/data-sources/s3) to learn more about connnection and choosing your preferred authentication method. +::: + +
    + +Use S3 pre-signed URL to upload documents: add datasource + +
    + +
    + +
    + +## Get the Buckets + +- Once the data source is connected successfully, go to the query manager and **Run** the *getBuckets* query. The operation selected in the *getBuckets* query is **List buckets**, which will fetch an array of all the buckets. + +
    + + Use S3 pre-signed URL to upload documents: getBuckets query + +
    + +- Running the *getBuckets* query will load all the buckets in the app's left table. + + + +
    + + Use S3 pre-signed URL to upload documents: loading buckets + +
    + +
    + +
    + +## Get the Objects Inside the Bucket + +- To fetch the data inside a bucket, select the bucket from the buckets table, go to the query manager and choose the *getObjects* query. Choose the relevant data source in the **Data Source** section, and for the **Operation** parameter, choose `List objects in a bucket` option from the dropdown. Replace the **Bucket** parameter with, `{{components.table2.selectedRow.Name}}` and click on the **Run** to list all the files from the selected bucket on the table. + + + +
    + + Use S3 pre-signed URL to upload documents: list objects in a bucket + +
    + +
    + +
    + +## Get the Signed URL for Downlaod + +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. For creating a presigned URL, in the query panel replace the parameters with the following: + +- **Data Source**: Use the relevant data source. +- **Operation**: Choose `Signed url for download` from the dropdown. +- **Bucket**: `{{components.table2.selectedRow.Name}}` to select the buckets dynamically. +- **Key**: `{{components.table3.selectedRow.Key}}`, this will get the file name from the filepickers exposed variables. +- **Expires in**: This sets an expiration time of URL, by default its `3600` seconds (1 hour). + +After setting up the parameters, click **Run** to run the query, and the URL can be accessed as shown in the screenshot. + +
    + + Use S3 pre-signed URL to upload documents: get signed URL + +
    + +
    + +
    + +## Upload Objects to the Bucket + +The `Upload Object` operation allows users to select a bucket and then upload their chosen data into that bucket. To upload objects in a bucket, follow the steps below: + +- In the query panel navigate to *uploadObject* query. +- Choose your relevant data source in the **Data Source** section. +- In the **Operation** section, choose `Upload Object` from the dropdown. +- In the **Bucket** section, copy the code: `{{components.table2.selectedRow.Name}}`, to choose a bucket dynamically. +- In the **Key** section, copy the code: `{{components.textinput2.value}}`. +- In the **Content Type** section, copy: `{{components.filepicker1.file[0].type}}`. +- In the **Upload data** section, copy: `{{components.filepicker1.file[0].dataURL}}`. + +To make sure the image is uploaded successfully, we can create a new event from the **Events** section. +- Under the `Events` section, click on **New event handler**. +- From the `Event` dropdown, choose `Query Success`. +- From the `Action` dropdown, choose `Show Alert`. +- The `Message` can be of your choice, in this example lets write the message as: `Image uploaded successfully`. + +Once the query has been created, choose the desired bucket, click on the **Upload file** button in the app, and upload your desired file to your bucket. + +
    + +
    + +## Access the Signed URL + +After uploading the file to your bucket, in the files table, click on the **Copy signed URL** button from the **Actions** section of the table, which will copy the URL on the clipboard. You can go to another tab and paste the URL to open the file on the browser. + +
    + + Use S3 pre-signed URL to upload documents: access signed URL + +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-to-py.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-to-py.md new file mode 100644 index 0000000000..b1ddd1f275 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-to-py.md @@ -0,0 +1,75 @@ +--- +id: use-to-py-function-in-runpy +title: "Translating JavaScript Objects to Python in RunPy" +--- +
    + +This guide demonstrates the utilization of the `to_py()` function in *RunPy* queries for converting JavaScript objects into their corresponding Python representations. + +
    + +
    + +## The to_py() Function + +The **to_py()** function within the **Pyodide** library serves as the counterpart to the **to_js()** function. Its purpose is to transform JavaScript objects into their equivalent Python structures. This conversion becomes essential when handling JavaScript objects within the Pyodide environment and manipulating them using Python code. + +Similar to **to_js()**, **to_py()** facilitates the mapping and conversion of data types between JavaScript and Python. It effectively converts JavaScript objects, arrays, and other data structures into their Python counterparts. + +**Note**: Refer to the **[RunPy](/docs/data-sources/run-py)** documentation for a more in-depth understanding. + +
    + +
    + +## Using the to_py() Function + +To test the working of `to_py`function, follow the steps mentioned below: + +- From the ToolJet dashboard, create a new app by clicking **Create an app** button. +- Once the app is created, navigate to the Query Panel, click on the **+ Add** button and choose **Run Python Code** as the Data Source. +- Use the code given below, in the *runpy* query code editor: + +```python +import pyodide # Import the Pyodide library + +def to_py(js_object): # Define a function to convert JavaScript objects to Python dictionaries + return dict(js_object) # Convert the JavaScript object to a Python dictionary + +my_js_object = {"name": "John", "age": 25, "country": "USA"} # Create a JavaScript object + +my_py_dict = to_py(my_js_object) # Convert the JavaScript object to a Python dictionary + +my_py_dict # Return the Python dictionary +``` + +In this example, a JavaScript object `my_js_object` is created using the `Object.fromEntries()` method, representing a dictionary-like structure. The `to_py()` function is then employed to convert this JavaScript object into a Python dictionary, resulting in `my_py_dict`. + +The output will be: +```json +{'name': 'John', 'age': 25, 'country': 'USA'} +``` + +By leveraging to_py(), JavaScript objects can seamlessly transition into Python representations, allowing for manipulation using Python code within the Pyodide environment. + +Both **to_js()** and **to_py()** functions offer a convenient means to exchange data between Python and JavaScript in Pyodide, enabling the utilization of both languages' strengths in a unified environment. + +
    + +
    + +## Why the Use of to_py() is Essential? + +- When previewing results in a *RunPy* query, discrepancies between the JSON and Raw tabs may arise due to the conversion and display mechanisms in **Pyodide**. By default, **Python dictionaries** are converted to **JavaScript Map objects** in Pyodide, ensuring compatibility between the two languages. + +- Consequently, the **JSON** tab presents data in the format of JavaScript objects, denoted by **()** symbols, while the **Raw** tab displays the raw representation as **[{}, {}, ...],** showing Python dictionaries in their original form with **{}** symbols. + +- Both representations are correct, with the JSON tab showcasing converted data compatible with JavaScript, and the Raw tab displaying the original Python dictionaries. The choice depends on the user's use case and whether they need to work with the data in a **JavaScript context** or **Python context**. + +- To maintain consistency between JSON and Raw representations, the `to_js()` function provided by Pyodide can explicitly convert Python dictionaries to JavaScript objects. This ensures alignment between representations and guarantees that the data is in the desired format. + +
    + Print data from multiple tabs +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/how-to/use-url-params-on-load.md b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-url-params-on-load.md new file mode 100644 index 0000000000..63fbcf59ba --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/how-to/use-url-params-on-load.md @@ -0,0 +1,122 @@ +--- +id: use-url-params-on-load +title: Use URL Parameters on Page Load +--- +
    + +In this guide, we will learn how to use URL parameters at the time of page load. The URL parameters are used to pass data from one page to another. Currently, we can add URL parameters in the following ways: + +- From events through the [Switch page](/docs/actions/switch-page) action +- From the [JavaScript code](/docs/actions/switch-page/#switch-page-with-query-params) queries + +If a page is opened with URL parameters, you can access them using the `{{globals.urlparams}}`. This object contains all the URL parameters as key-value pairs and specific parameters can be accessed using the key like `{{globals.urlparams.}}`. + +Let's take a look at an example below to understand how to use URL parameters on page load. + +
    + +
    + +## Using URL Parameters on Page Load to Execute REST API Queries + +Create two pages, `Home` and `Dashboard`. When a new app is created, a page named `Home` is created by default. Create a new page named `Dashboard` from the Pages menu in the left sidebar. + +
    + Use URL Parameters on page load +
    + +
    + +
    + +## Home and Dashboard Pages + +Add a form component to the `Home` page. The form component will have a text input fields and a button. The text input field will be used to enter the name and the button will be used to navigate to the `Dashboard` page. Let's name the text input field as `email` and the button as `Submit`. + +
    + Use URL Parameters on page load +
    + +Select the button and add the event `On click`, select action `Switch page`, and then select the page `Dashboard`. Here, we will also find the option to add URL parameters. Add the URL parameter `email` and set the value to `{{components.form1.data.textinput1.value}}`. This will pass the value of the email input field to the `Dashboard` page as a URL parameter. + +
    + Use URL Parameters on page load +
    + +Now, on clicking the `Submit` button, the `Dashboard` page will be opened with the URL parameter `email` containing the value of the email input field. You can open the Inspector on left sidebar and navigate to the `URL Params` under the `globals` to check the URL parameters. + +
    + Use URL Parameters on page load +
    + +
    + +
    + +## Queries and Binding Data + +In the `Dashboard` page, add two table components. We will be loading the data from two different REST API queries on these tables. + +### Query 1: Get Products + +- Create a new REST API query and name it as `products`. We will be using a mock REST API to fetch the data. The URL for the REST API is `https://fakestoreapi.com/products`. Run the query and check the preview to see the returned data. +- Go to the `table1` properties, set the value of table data to `{{queries.products.data}}`. This will bind the data returned from the REST API query to the table. + +
    + Use URL Parameters on page load +
    + +### Query 2: Get User Details + +- Create a new REST API query and name it as `users`. We will be using a mock REST API to fetch the data. The URL for the REST API is `https://jsonplaceholder.typicode.com/users`. Run the query and check the preview to see the returned data. +- Go to the `table2` properties, set the value of table data to `{{queries.users.data}}`. This will bind the data returned from the REST API query to the table. + +
    + Use URL Parameters on page load +
    + +### Query 3: JavaScript Code To Use URL Parameters + +- Create a new JavaScript code query and name it as `urlparams`. We will be using this query to access the URL parameters and to check if the email parameter is present in the URL, then trigger the REST API queries. + +```javascript +function waitForURLParams(timeout) { // Wait for URL parameters to be available + const check = resolve => { // Check if URL parameters are available + if (location.search.length > 0) resolve(); // URL parameters are available + else setTimeout(_ => check(resolve), timeout); // Check again after a timeout + } + return new Promise(check); // Return a promise that resolves when URL parameters are available +} + +async function checkAndRunQuery(timeout) { // Check if URL parameters are available and run the REST API queries + await waitForURLParams(timeout); // Wait for URL parameters to be available + const urlParams = new URLSearchParams(window.location.search); // Get URL parameters + + if (urlParams.get('email')) { // Check if email parameter is present in the URL + await actions.runQuery('products'); // Run the REST API query to get products + await actions.runQuery('users'); // Run the REST API query to get user details + } + else { + alert('URL param not found'); // Alert if email parameter is not present in the URL + } +} + +checkAndRunQuery(5000); // Check if URL parameters are available and run the REST API queries after a timeout of 5 seconds +``` + +
    + +
    + +## Dashboard Page Event Handler + +- Finally, go to the Pages menu in the left sidebar and open the menu for the `Dashboard` page. +- Select the option to add Event handler and add a new `On page load`, select the option to `Run query` and select the query `urlparams`. This will trigger the JavaScript code query to check if the email parameter is present in the URL and then run the REST API queries whenever the `Dashboard` page is loaded. + +
    + Use URL Parameters on page load +
    + +Now, whenever the user will enter the email in the `Home` page and click the `Submit` button, the `Dashboard` page will be opened with the URL parameter `email` containing the value of the email input field. The JavaScript code query will check if the email parameter is present in the URL and then run the REST API queries to fetch the data. The data will be displayed in the tables on the `Dashboard` page. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/marketplace_overview.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/marketplace_overview.md new file mode 100644 index 0000000000..e32c2bb7dc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/marketplace_overview.md @@ -0,0 +1,104 @@ +--- +id: marketplace-overview +title: 'Marketplace: Overview' +--- + +# Marketplace: Overview + +ToolJet Marketplace allows users to enhance their workspaces by adding custom plugins (data sources) tailored to their unique requirements. This functionality facilitates the seamless integration of user-created plugins with ToolJet. + +
    + Marketplace Overview +
    + +
    + +## Enabling Marketplace + +To **Enable** the marketplace feature, users need to add the following environment variable to their **[`.env`](/docs/setup/env-vars#marketplace)** file: + +```bash +ENABLE_MARKETPLACE_FEATURE=true +``` + +When running ToolJet locally, ensure that all the plugins are available by building marketplace before starting the server. + +:::info Note +The logged-in user should be an **Administrator** to access the marketplace page. +::: + +
    + +
    + +## Installing a Plugin + +To navigate to the Marketplace page, click on the settings icon on the bottom left of the dashboard, and click on **Marketplace** from the selection menu. + +The Marketplace page will contain two tabs: **Installed** and **Marketplace**. + +Under the **Marketplace** tab, you will see a list of all the available plugins that can be installed on the workspace. To install a plugin, click on the **Install** button on the plugin's card. Once the installation is complete, the status will change from Install to **Installed**. + +
    + List of All Plugins +
    + +
    + +
    + +## Using Marketplace Plugins + +You can access any installed plugins by following these steps: + +- Navigate to the **Data sources** tab in the dashboard. +- Scroll down to **Plugins**. + +You can now see the list of installed marketplace plugins that you can configure as data sources. + +
    + Installed plugins +
    + +- After successfully configuring a plugin, you can access it when trying to add a new query from the Query Panel. + +## Removing a Plugin + +:::caution +If you remove a plugin, all the queries associated with it will be eliminated from the applications. +::: + +To remove a plugin, follow these steps: +- Click on the settings icon on the bottom left of the dashboard, and click on `Marketplace` from the selection menu. +- On the `Installed` page, click on the `Remove` button of the related plugin that you wish to remove. + +## Available Plugins +- **[Anthropic](/docs/marketplace/plugins/marketplace-plugin-anthropic)** +- **[AWS Redshift](/docs/marketplace/plugins/marketplace-plugin-awsredshift)** +- **[AWS Textract](/docs/marketplace/plugins/marketplace-plugin-textract)** +- **[AWS Lambda](/docs/marketplace/plugins/marketplace-plugin-aws-lambda)** +- **[Cohere](/docs/marketplace/plugins/marketplace-plugin-cohere)** +- **[Engagespot](/docs/marketplace/plugins/marketplace-plugin-engagespot)** +- **[Gemini](/docs/marketplace/plugins/marketplace-plugin-gemini)** +- **[GitHub](/docs/marketplace/plugins/marketplace-plugin-github)** +- **[HarperDB](/docs/marketplace/plugins/marketplace-plugin-harperdb)** +- **[Hugging Face](/docs/marketplace/plugins/marketplace-plugin-hugging_face)** +- **[Jira](/docs/marketplace/plugins/marketplace-plugin-jira)** +- **[Mistral AI](/docs/marketplace/plugins/marketplace-plugin-mistral_ai)** +- **[OpenAI](/docs/marketplace/plugins/marketplace-plugin-openai)** +- **[Pinecone](/docs/marketplace/plugins/marketplace-plugin-pinecone)** +- **[Plivo](/docs/marketplace/plugins/marketplace-plugin-plivo)** +- **[Pocketbase](/docs/marketplace/plugins/marketplace-plugin-pocketbase)** +- **[Portkey](/docs/marketplace/plugins/marketplace-plugin-portkey)** +- **[PrestoDB](/docs/marketplace/plugins/marketplace-plugin-Presto)** +- **[Qdrant](/docs/marketplace/plugins/marketplace-plugin-qdrant)** +- **[Salesforce](/docs/marketplace/plugins/marketplace-plugin-salesforce)** +- **[Sharepoint](/docs/marketplace/plugins/marketplace-plugin-sharepoint)** +- **[Supabase](/docs/marketplace/plugins/marketplace-plugin-supabase)** +- **[Weaviate](/docs/marketplace/plugins/marketplace-plugin-weaviate)** + +:::info For Plugin Developers +Refer to the **[Plugin Development guide](/docs/contributing-guide/marketplace/marketplace-setup)** to learn how to create plugins for the ToolJet Marketplace. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/amazon-redshift.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/amazon-redshift.md new file mode 100644 index 0000000000..c3681fa367 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/amazon-redshift.md @@ -0,0 +1,119 @@ +--- +id: marketplace-plugin-awsredshift +title: Amazon Redshift +--- + +ToolJet can connect to Amazon Redshift, enabling your applications to query data directly from a Redshift cluster. + + +
    + Marketplace Plugin: Amazon Redshift +
    + +
    + +**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)**. + +
    + +## Configuration + +To connect to Amazon Redshift, you need to provide the following details: + +#### Required Parameters + +- **Region**: The region where your Redshift cluster is located. For example, `us-east-1`. +- **Database Name**: The name of the database you want to connect to. +- **Authentication Type**: The type of authentication you want to use to connect to the Redshift cluster. Currently, only **IAM** is supported. +- **Access Key**: The access key of the user you want to use to connect to the Redshift cluster. +- **Secret Key**: The secret key of the user you want to use to connect to the Redshift cluster. + +#### Optional Parameters + +- **Port**: The port number of the Redshift cluster. The default port number is `5439`. +- **Workgroup name**: The name of the workgroup you want to use to connect to the Redshift cluster. + +
    + Marketplace Plugin: Amazon Redshift +
    + +
    + +
    + +## Supported Queries + +Redshift supports a comprehensive set of SQL commands. You can use the SQL editor to run any SQL query on the connected Redshift cluster. Refer to the [Redshift documentation](https://docs.aws.amazon.com/redshift/latest/dg/c_SQL_commands.html) for more information on the supported SQL commands. + +
    + +
    + +### Read Data + +The following example demonstrates how to read data from a table in the connected Redshift cluster. The query selects all the columns from the `employee` table. + +```sql +SELECT * FROM employee +``` + +
    + +
    + +### Write Data + +The following example demonstrates how to write data to a table in the connected Redshift cluster. The query inserts a new row into the `employee` table. + +```sql +INSERT INTO employee ( + first_name, + last_name, + email, + phone_number, + hire_date, + job_title, + salary, + department_id +) VALUES ( + 'Tom', + 'Hudson', + 'tom.hudson@example.com', + '234843294323', + '2024-01-01', + 'Test Automation Engineer', + 245000.00, + 12 +); +``` + +
    + +
    + +### Update Data + +The following example demonstrates how to update data in a table in the connected Redshift cluster. The query updates the `first_name` and `last_name` columns of the `employee` table. + +```sql +UPDATE employee +SET first_name = 'Glenn', + last_name = 'Jacobs' +WHERE employee_id = 8; +``` + +
    + +
    + +### Delete Data + +The following example demonstrates how to delete data from a table in the connected Redshift cluster. The query deletes a row from the `employee` table. + +```sql +DELETE FROM employee +WHERE employee_id = 7; +``` + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/anthropic.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/anthropic.md new file mode 100644 index 0000000000..431a0f5f69 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/anthropic.md @@ -0,0 +1,53 @@ +--- +id: marketplace-plugin-anthropic +title: Anthropic +--- + +Integrating Anthropic with ToolJet enables the creation of interactive chatbots that analyze past messages to generate context-aware responses. These bots can also be customized with defined roles, making them suitable for tasks such as customer support, serving as virtual assistants, or enabling personalized conversations. + +## Connection + +To connect with Anthropic, you will need the **API Key**, which can be generated from **[Anthropic Console](https://console.anthropic.com/)**. + +Anthropic Configuration + +## Supported Operations + +### Chat + +This operation processes the user's input and generates appropriate, context-aware responses, simulating a natural, human-like conversation. It can handle multiple interactions while maintaining the flow of dialogue, enabling dynamic and engaging conversations. + +**Required Parameters** + +- **Model**: The model to use for generating the chat response. The available models are: + - claude-3-5-sonnet-20241022 + - claude-3-5-haiku-20241022 + - claude-3-opus-20240229 + - claude-3-sonnet-20240229 + - claude-3-haiku-20240307 + +- **Message**: Messages act as input interactions between the user and the model. In the Roles parameter, you can choose either User or Assistant. + +- **Max Size**: Maximum tokens used in response. + +**Optional Parameters** + +- **System Prompt**: Defines the role and context of the model to evaluate messages and generate a response. + +- **Temperature**: Controls the randomness of the response. Accepts values between 0 and 1, with a default of 1. + +Anthropic Query + +
    +**Response Example** + +```json +[ + { + "type": "text", + "text": "AI has numerous significant benefits in healthcare. Here are some key advantages:nn1. Diagnosis and Disease Detectionn- Faster and more accurate diagnosis through image analysis (X-rays, MRIs, CT scans)n- Early detection of diseases like cancern- Pattern recognition in patient symptoms and medical historynn2. Treatment Planningn- Personalized treatment recommendationsn- Drug interaction predictionsn- Treatment outcome forecastingn- Precision medicine based on patient datann3. Administrative Tasksn- Automated appointment schedulingn- Medical record managementn- Billing and insurance processingn- Reducing paperwork and administrative burdennn4. Patient Caren- Remote patient monitoringn- Virtual health assistantsn- Personalized care recommendationsn- Medication adherence trackingnn5. Research and Drug Developmentn- Accelerated drug discoveryn- Clinical trial matchingn- Analysis of medical research datan- Identification of new treatment approachesnn6. Preventive Caren- Risk prediction and assessmentn- Population health managementn- Lifestyle recommendationsn- Early intervention opportunitiesnn7. Cost Reductionn- Improved efficiencyn- Reduced medical errorsn- Better resource allocationn- Streamlined operationsnn8. Accessibilityn- 24/7 availability of basic healthcare informationn- Improved access to healthcare in remote areasn- Reduced wait timesn- Better distribution of medical expertisennThese benefits continue to expand as AI technology advances and becomes more integrated into healthcare systems." + } +] +``` + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/cohere.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/cohere.md new file mode 100644 index 0000000000..190ee047c6 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/cohere.md @@ -0,0 +1,168 @@ +--- +id: marketplace-plugin-cohere +title: Cohere +--- + +Cohere can be integrated with ToolJet to use its advanced AI models for tasks such as text generation or building a chatbot assistant by configuring parameters to optimize results. + +## Connection + +To connect with Cohere, you will need the **Access token**, which can be generated from **[Cohere Dashboard](https://dashboard.cohere.com/api-keys)**. + +Cohere Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate creative text content by selecting the desired model and defining additional parameters. + +**Required Parameters** + +- **Model**: The model to use for generating the text. The available models are: + - command-r7b-12-2024 + - command-r-plus-08-2024 + - command-r-plus-04-2024 + - command-r-plus + - command-r-08-2024 + - command-r-03-2024 + - command-r + - command + - command-nightly + - command-light + - command-light-nightly + - c4ai-aya-expanse-8b + - c4ai-aya-expanse-32b + +- **Message**: The main user input for generating response. + +**Optional Parameter** + +- **Advanced parameters**: Additional parameters to configure the model response. Refer [Advanced Parameters](#advanced-parameters) for more information. + +Example Parameters: + +```js +{ + "response_format": {"type": "text"}, + "temperature": 0.3, + "max_tokens": 512, + "seed": 3, + "p": 0.3, + "k": 1, + "frequency_penalty": 0.3, + "presence_penalty": 0.3, + "citation_options": {"mode": "fast"}, + "safety_mode": "off", + "stop_sequences": ["spam", "fraud"] +} +``` + +Cohere Text generation + +
    +**Response Example** + +ToolJet is an open-source no-code platform that allows you to build your own tools and automate your workflows in minutes. It is built on top of the powerful Airbyte open-source standard for data integration, focusing on user-friendliness and extensibility. With ToolJet, you can create custom solutions for your business without any prior coding knowledge. + +Here's a high-level overview of the features and capabilities of ToolJet: + +1. **No-Code Builder**: ToolJet offers a visual interface where you can quickly create powerful applications, workflows, and automation scripts without writing a single line of code. + +2. **Data Integration**: ToolJet leverages Airbyte to provide seamless data integration capabilities. You can sync data from various sources like databases, APIs, or SaaS applications to build custom dashboards, data pipelines, or extensions. + +3. **Visual Automation Builder**: Create automated workflows using a drag-and-drop interface. Connect various tools, apps, and APIs to automate tasks, notifications, data manipulation, and more. + +4. **Open Source**: Being open-source means you get full transparency over the platform's underlying code. Plus, you can contribute to the project and customize or extend it according to your needs. + +5. **Extensions & APIs**: ToolJet provides a marketplace for sharing and discovering extensions, APIs, and pre-built workflows. You can extend the functionality of ToolJet with community-built solutions. + +6. **Dashboard & Reports**: Create interactive dashboards and reports using the built-in charting and visualization tools. Visualize data from various sources in one place and share insights with your team. + +7. **Forms & UI**: Easily create forms and user interfaces using ToolJet's intuitive form builder. Collect data, feedback, or insights from your users or systems. + +8. **Collaboration & Security**: Control user access and permissions with robust security features. Collaborate with team members on different projects and ensure data privacy and compliance. + +9. **Integration with External Tools**: ToolJet integrates with popular productivity, collaboration, and data tools, including Slack, Google Workspace, Microsoft Office, Airbyte, and more. + +10. **Open API & Extensibility**: ToolJet has a robust application programming interface (API), which allows developers to extend its capabilities. You can customize and connect any external service or application. + +ToolJet is a versatile platform that spans several use cases, including business process automation, data management, workflow optimization + +
    + +### Chat + +Use this operation for a chat-like conversation, where the model responds based on the given prompts and instructions. It provides relevant and context-appropriate answers, maintaining a smooth conversational flow. + +**Required Parameters** + +- **Model**: Specifies the model to use for generating responses in the chat. The available models are: + - command-r7b-12-2024 + - command-r-plus-08-2024 + - command-r-plus-04-2024 + - command-r-plus + - command-r-08-2024 + - command-r-03-2024 + - command-r + - command + - command-nightly + - command-light + - command-light-nightly + - c4ai-aya-expanse-8b + - c4ai-aya-expanse-32b + +- **History**: Keeps track of previous interactions to maintain context in the conversation. + +- **Message**: The main user input for generating response in the chat. + +**Optional Parameter** + +- **Advanced parameters**: Additional parameters to configure the model response. Refer [Advanced Parameters](#advanced-parameters) for more information. + +Example Parameters: + +```js +{ + "response_format": {"type": "text"}, + "temperature": 0.3, + "max_tokens": 512, + "seed": 3, + "p": 0.3, + "k": 1, + "frequency_penalty": 0.3, + "presence_penalty": 0.3, + "citation_options": {"mode": "fast"}, + "safety_mode": "off", + "stop_sequences": ["spam", "fraud"] +} +``` + +Cohere Chat + +
    +**Response Example** + +ToolJet is a no-code platform that allows you to build custom internal tools with drag and drop functionality. You can integrate Cohere with ToolJet to enable an added advantage of AI features in your apps built on ToolJet. + +To integrate Cohere AI into your ToolJet app, you should have a Cohere AI API key. If you don't have one, you can sign up for a free Cohere AI account and get your API key. + +As a next step, you can refer to our documentation to see a step-by-step guide to integrate Cohere AI with ToolJet. If you have any further questions, please let me know! + +
    + +## Advanced Parameters + +| Parameter| Description | +|----------|-------------| +| Response Format | Configure the model to give output in specified format. | +| Temperature | Controls the degree of randomness of the output. | +| Max Tokens | The maximum number of tokens the model will generate as part of the response. | +| Seed | Set to ensure consistent results by initializing the generator. | +| P | Use to limit randomness by setting a probability threshold. | +| K | Defines the use of the top k most likely tokens for generation at each step. | +| Frequency Penalty | Use to discourage frequent word usage for more varied responses. | +| Presence Penalty | Use to reduce repetition of words or phrases. | +| Citation Options | Options for controlling citation generation. | +| Safety Mode | Use to select the safety instruction inserted into the prompt. Allowed values: CONTEXTUAL, STRICT, OFF | +| Stop Sequences | Defines a list of up to 5 strings that, when matched, will stop the generation and return the text generated so far. | \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/engagespot.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/engagespot.md new file mode 100644 index 0000000000..97a43fc451 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/engagespot.md @@ -0,0 +1,122 @@ +--- +id: marketplace-plugin-engagespot +title: Engagespot +--- + +# Engagespot + +ToolJet connects to your Engagespot account, allowing you to send notifications, create or update users from within your ToolJet application. + +:::info +**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 + +- Establish a connection to Engagespot by either clicking `+Add new Data source` on the query panel or navigating to the [Data Sources](/docs/data-sources/overview/) page from the ToolJet dashboard. + +- Enter your Engagespot API key and API secret into their designated fields. To generate user tokens directly from ToolJet, you can optionally provide a signing key. + +- Click **Test Connection** to validate your credentials. Click **Save** to store the data source. + +
    + Engagespot API Key +
    + + +:::info +You can change your Engagespot BaseURL by enable custom endpoint. +::: + +
    + +
    + +## Querying Engagespot + +Click on `+Add` button of the [query manager](/docs/app-builder/query-panel/#query-manager) and select the data source added in the previous step as the data source. Select the operation that you want to perform, fill in the required parameters and click on **Run** button to run the query. + +
    + +engagespot query + +
    + +
    + +:::info +Query results can be transformed using transformations. Read our [transformations documentation](/docs/tutorial/transformations). +::: + +
    + +
    + +## Query Operations + +You can create query for Engagespot data source to perform several actions such as: + 1. **[Create or Update User](#create-or-update-user)** + 2. **[Send Notification](#send-notification)** + 3. **[Generate User Token](#generate-user-token)** + +
    + +
    + +### Create OR Update User + + #### Required Parameters: + - **User Identifier** - Unique user identifier. + +
    +engagespot create user +
    +
    + +:::info +The user profile column accepts any key-value pairs in valid JSON object format. +::: + +
    + +
    + +### Send Notification + + #### Required Parameters: + - **Reciepient** - Unique user identifier. + - **Notification Title** - The title for your notification. + +
    +engagespot send notitication +
    +
    + +
    + +
    + +### Generate User Token + + #### Required Parameters: + - **User Identifier** - Unique user identifier. + +
    +engagespot generate token +
    +
    + +:::info +To generate user tokens, ensure you provide a Signing Key when establishing a connection to your Engagespot data source. +::: + +
    + +
    + +### Adding the In-App Inbox element to your ToolJet app + To set up an In-App Inbox element in your ToolJet application, refer to the [Adding In-App](https://docs.engagespot.co/docs/plugins/tooljet/adding-the-inbox-component) guide. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/gemini.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/gemini.md new file mode 100644 index 0000000000..55866d8a1a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/gemini.md @@ -0,0 +1,115 @@ +--- +id: marketplace-plugin-gemini +title: Gemini +--- + +Google Gemini can be integrated with ToolJet to build context-aware, intelligent chatbots or generate creative text content. + +## Connection + +To connect with Gemini, you will need the **API Key**, which can be generated from **[Google AI Studio](https://aistudio.google.com/apikey)**. + +Gemini Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate text based on the prompt, system instructions, and model settings. It provides information or explanations tailored to the given context. + +**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. + +**Optional Parameter** + +- **System Prompt**: A predefined instruction guiding the model's tone and behavior. + +- **Max Tokens**: Limits the maximum number of tokens (words and characters) in the response. + +- **Temperature**: Defines the randomness of the response. It takes a value between 0 and 1, with a default of 1. + +Gemini Query + +
    +**Response Example** + +Connecting ToolJet to a database involves several steps, and the specific method depends on the type of database you're using. ToolJet primarily uses database connections through its built-in features, avoiding the need for complex configuration files or external tools. Here's a general guide, focusing on common scenarios: + +**1. Choose Your Database and Connection Method:** + +ToolJet supports various database systems, including: + +* **PostgreSQL:** A powerful, open-source relational database management system. +* **MySQL:** Another popular open-source relational database system. +* **SQLite:** A lightweight, file-based database system, often suitable for smaller projects. +* **MongoDB:** A NoSQL database system, ideal for handling unstructured or semi-structured data. + +**2. Setting Up the Database:** + +* **Ensure the database server is running and accessible.** This includes having the database software installed and configured. +* **Create a database:** Within the database server, you'll need to create a new database. +* **Create a user account with appropriate privileges:** This user account needs permissions to connect to the database and perform read/write operations. Crucially, ensure the user has the necessary permissions for your application's needs. For example, you will need `SELECT`, `INSERT`, `UPDATE`, and `DELETE` permissions if you're performing CRUD operations. +* **Determine the database credentials:** You'll need the database server's hostname/IP address, the database name, the username, and the password for the user account. + +**3. Connecting in ToolJet:** + +* **Navigate to the relevant ToolJet app/page where database interaction is needed.** +* **Utilize ToolJet's database connectors:** Look for sections or widgets in ToolJet that allow you to interact with databases. This is typically integrated into the data sources, data manipulation features, or custom functions. +* **Provide the database connection details:** Input the database server details (hostname/IP, port, database name, username, password). ToolJet will validate the connection. +* **Choose the database type:** Select the correct database type (e.g., PostgreSQL, MySQL, SQLite, MongoDB). +* **Test the connection:** ToolJet will attempt to connect to the database. Verify the success of the connection. If successful, you should be able to query the database within ToolJet's + +
    + +### Chat + +Use this operation for a chat-like conversation, where the model responds based on the given prompts and instructions. It provides relevant and context-appropriate answers, maintaining a smooth conversational flow. + +**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. + +**Optional Parameter** + +- **System Prompt**: Provides the model with guidance on the style and type of responses expected. + +- **History**: Keeps track of previous interactions to maintain context in the conversation. + +- **Max Tokens**: Limits the maximum number of tokens (words and characters) in the response. + +- **Temperature**: Defines the randomness of the response. It takes a value between 0 and 1, with a default of 1. + +Gemini Query + +
    +**Response Example** + +Integrating an API into ToolJet involves several steps, depending on the API's specifics (REST, GraphQL, etc.) and the desired functionality within your ToolJet application. Here's a breakdown of the process: + +**1. Understanding Your API:** + +* **Authentication:** How does the API authenticate requests? (API Key, OAuth 2.0, Basic Auth, etc.) This is crucial and will directly impact your ToolJet configuration. +* **Endpoints:** Identify the specific API endpoints you need to interact with. Note the HTTP methods (GET, POST, PUT, DELETE) for each endpoint. +* **Request Parameters:** Understand what parameters (query parameters, request body) each endpoint expects. Data types are important (string, integer, JSON, etc.). +* **Response Format:** Determine the format of the API's response (usually JSON or XML). ToolJet primarily works with JSON. + +
    + + + + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/github.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/github.md new file mode 100644 index 0000000000..02e80198da --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/github.md @@ -0,0 +1,77 @@ +--- +id: marketplace-plugin-github +title: GitHub +--- + +ToolJet offers seamless integration with GitHub. This connection allows you to directly interact with GitHub repositories and data. + +## Connection + +To connect to GitHub, you need the following credential: +- **Personal Access Token**: You can generate this token through your **[GitHub Account Settings](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token)**. + +You'll need a Personal Access Token to access data from private repositories. Public repository data remains accessible without a Personal Access Token. + +Marketplace: GitHub + +## Supported Queries + +- **[Get user info](#get-user-info)** +- **[Get repository](#get-repository)** +- **[Get repository issues](#get-repository-issues)** +- **[Get repository pull requests](#get-repository-pull-requests)** + +### Get User Info + +This operation fetches details for a specified user. + +#### Required Parameter + +- **Username**: Specify the GitHub username or organization to retrieve their details. + +Marketplace: GitHub + +### Get Repository + +Fetches detailed information about a specific repository. + +#### Required Parameters + +- **Owner**: Name of the repository's owner, which can be either a GitHub user or an organization. +- **Repository**: The exact name of the repository. + +Marketplace: GitHub + +### Get Repository Issues + +Generates a list of issues associated with a repository, with options to filter them by their status. + +#### Required Parameters + +- **Owner**: The name of the repository's owner. The owner can either be a GitHub organization or a user. +- **Repository**: The repository name for which the issues are to be retrieved. +- **State**: Filter the issues by their status: All, Open, or Closed. + +#### Optional Parameters + +- **Page size**: Desired number of issues per page. Default is 30. +- **Page number**: Desired page number to fetch issues from. Default is 1. + +Marketplace: GitHub + +### Get Repository Pull Requests + +Generates a list of pull requests from a repository, with options to filter them by their status. + +#### Required Parameters + +- **Owner**: The name of the repository's owner. The owner can either be a GitHub organization or a user. +- **Repository**: The repository name for which the pull requests are to be retrieved. +- **State**: Filter the pull requests by their status: All, Open, or Closed. + +#### Optional Parameters + +- **Page size**: Desired number of issues per page. Default is 30. +- **Page number**: Desired page number to fetch pull requests from. Default is 1. + +Marketplace: GitHub diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/harperdb.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/harperdb.md new file mode 100644 index 0000000000..eb6162d6b9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/harperdb.md @@ -0,0 +1,288 @@ +--- +id: marketplace-plugin-harperdb +title: HarperDB +--- + +HarperDB is a database and application development platform that is focused on performance and ease of use. With flexible user-defined APIs, simple HTTP/S interface, and a high-performance single-model data store that accommodates both NoSQL and SQL workloads, HarperDB scales with your application from proof of concept to production. ToolJet integrates with HarperDB, providing a streamlined interface for reading and writing data. + +
    + +Marketplace: HarperDB + +
    + +:::note +Before following this guide, it is recommended to check the following doc: **[Using Marketplace plugins](/docs/marketplace/marketplace-overview#using-marketplace-plugins)**. +::: + +
    + +## Connection + +To establish a connection with HarperDB, you need the following credentials: +1. **Host**: The hostname or IP address of your HarperDB instance (e.g., `162.156.250.74` or `myinstance.harperdbcloud.com`). +2. **Port**: The port number configured for your server (default is `9925`). If you are using HarperDB Studio(cloud), leave the field empty or set it to `443`. +3. **SSL**: Indicates whether the connection requires SSL encryption. +4. **Username**: Your authentication username for HarperDB instance. +5. **Password**: Your password for authentication (hidden for security purposes). + +
    + +Marketplace: HarperDB + +
    + +
    + +
    + +## Querying HarperDB +To perform queries on HarperDB, click the `+Add` button in the query manager located at the bottom panel of the app builder. Select the HarperDB from the Global Datasource section in the query editor. + +
    + +Marketplace: HarperDB + +
    + +
    + +
    + +### SQL Mode + +SQL mode enables you to perform various operations on the database using SQL statements. + +- **[Select](#select)** +- **[Insert](#insert)** +- **[Update](#update)** +- **[Delete](#delete)** + +#### Select +The SELECT statement is used to query data from the database. + +Syntax: +```sql +SELECT * FROM sampleorg.people WHERE id = 1 +``` + +
    + +Marketplace: HarperDB + +
    + +#### Insert +The INSERT statement is used to add one or more rows to a database table. + +Syntax: +```sql +INSERT INTO sampleorg.people (id, name, age, country, hobby) VALUE (5, 'Shubh', 26, 'India', 'Football') +``` + +
    + +Marketplace: HarperDB + +
    + +#### Update +The UPDATE statement is used to change the values of specified attributes in one or more rows in a database table. + +Syntax: +```sql +UPDATE sampleorg.people SET hobby = 'chess' WHERE id = 5 +``` + +
    + +Marketplace: HarperDB + +
    + +#### Delete +The DELETE statement is used to remove one or more rows of data from a database table. + +Syntax: +```sql +DELETE FROM sampleorg.people WHERE id = 5 +``` + +
    + +Marketplace: HarperDB + +
    + +
    + +
    + +### NoSQL Mode + +NoSQL mode enables you to perform schema-less storage and retrieval of JSON documents. + +- **[Insert](#insert-nosql)** +- **[Update](#update-nosql)** +- **[Delete](#delete-nosql)** +- **[Search by hash](#search-by-hash)** +- **[Search by value](#search-by-value)** +- **[SeleSearch by conditions](#search-by-conditions)** + +#### Insert (NoSQL) + +Insert operation allows to add one or more rows of data to a database table. + +|
    Parameters
    |
    Description
    | +| ---------- | ----------- | +| Schema (required) | schema where the table you are inserting records into lives | +| Table (required) | table name where you want to insert records | +| Records (required) | array of one or more records for insert | + +**Example Records:** +```js +[{id: 22, name: "James Scott", age: 26, country:"Italy", hobby: "football"},...] +``` + +
    + +Marketplace: HarperDB + +
    + +#### Update (NoSQL) + +The Update operation modifies the values of specified attributes in one or more rows of a database table based on the hash attribute(primary key) that identifies the rows. + +|
    Parameters
    |
    Description
    | +| ---------- | ----------- | +| Schema (required) | schema where the table you are updating records into lives | +| Table (required) | table name where you want to update records | +| Records (required) | array of one or more records for update | + +**Example Records:** +```js +[{id:12, name:"Jeff Hannistor"},...] // Record having 12 as Primary key value will be updated +``` + +
    + +Marketplace: HarperDB + +
    + +#### Delete (NoSQL) + +Removes one or more rows of data from a specified table. + +|
    Parameters
    |
    Description
    | +| ---------- | ----------- | +| Schema (required) | schema where the table you are deleting records into lives | +| Table (required) | table name where you want to delete records | +| Hash Values (required) | array of one or more hash attribute (primary key) values, which identifies records to delete | + +**Example Hash Values:** +```js +[6, 15] // Records having 6 and 15 as Primary key value will be deleted +``` + +
    + +Marketplace: HarperDB + +
    + +#### Search by hash + +Returns data from a table for one or more hash values. + +|
    Parameters
    |
    Description
    | +| ---------- | ----------- | +| Schema (required) | schema where the table you are searching lives | +| Table (required) | table you wish to search | +| Hash Values (required) | array of hashes to retrieve | +| Table Attributes (required) | define which attributes you want returned. | + +**Example Hash Values:** +```js +[124, 66] // Records having 6 and 15 as Primary key value will be retrieved +``` + +**Example Table Attributes:** +```js +['id', 'name', 'age', 'hobby', 'country'] // Only the provided columns will be retrieved from the table +``` + +
    + +Marketplace: HarperDB + +
    + +#### Search by value + +Returns data from a table for a matching value. + +|
    Parameters
    |
    Description
    | +| ---------- | ----------- | +| Schema (required) | schema where the table you are searching lives | +| Table (required) | table you wish to search | +| Hash Values (required) | array of hashes to retrieve | +| Search Attribute (required) | attribute you wish to search can be any attribute | +| Search Value (required) | value you wish to search - wild cards are allowed. | +| Table Attributes (required) | define which attributes you want returned. | + +**Example Search Attribute:** +```bash +name +``` + +**Example Search Value:** +```bash +John Doe +or +Joh* // using wild card +``` + +**Example Table Attributes:** +```js +['id', 'name', 'age', 'hobby', 'country'] // Only the provided columns will be retrieved from the table +``` + +
    + +Marketplace: HarperDB + +
    + +#### Search by conditions + +Returns data from a table for one or more matching conditions. + +|
    Parameters
    |
    Description
    | +| ---------- | ----------- | +| Schema (required) | schema where the table you are searching lives | +| Table (required) | table you wish to search | +| Operator in-between each condition (optional) | the operator used between each condition - 'And', 'Or'. The default is 'And'. | +| Offset (optional) | the number of records that the query results will skip. The default is 0. | +| Limit (optional) | the number of records that the query results will include. The default is null, resulting in no limit. | +| Table Attributes (required) | define which attributes you want returned. | +| Conditions to filter (required) | the array of conditions objects, to filter by. Must include one or more object in the array. **search_attribute** (required) - the attribute you wish to search, can be any attribute. **search_type** (required) - the type of search to perform - 'equals', 'contains', 'starts_with', 'ends_with', 'greater_than', 'greater_than_equal', 'less_than', 'less_than_equal', 'between'. **search_value** (required) - case-sensitive value you wish to search. If the search_type is 'between' then use an array of two values to search between. Check the example below. | + +**Example Table Attributes:** +```js +['id', 'name', 'age', 'hobby', 'country'] // Only the provided columns will be retrieved from the table +``` + +**Example Conditions to filter:** +```js +[{'search_attribute': 'age', 'search_type': 'between', 'search_value': [20, 28]}, {'search_attribute': 'name', 'search_type': 'contains', 'search_value': 'Ray'}] +``` + +
    + +Marketplace: HarperDB + +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/huggingface.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/huggingface.md new file mode 100644 index 0000000000..a478ffa909 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/huggingface.md @@ -0,0 +1,112 @@ +--- +id: marketplace-plugin-hugging_face +title: Hugging Face +--- + +Hugging Face integration with ToolJet enables you to use advanced natural language processing capabilities. With Hugging Face's state-of-the-art models, you can generate high-quality content and summarize text seamlessly. + +This plugin leverages the Inference API from Hugging Face to ensure seamless integration with supported models. To confirm if a model is supported, refer to the Inference API section on its page on the **[Hugging Face](https://huggingface.co/models)**. + +Hugging Face Configuration + + +## Connection + +To connect with Hugging Face, you will need the **Personal access token**, which can be generated from **[Hugging Face Platform](https://huggingface.co/settings/tokens)**. + +You can use the following toggles: +- **Use Cache**: Use this to enable the cache layer on the inference API to accelerate response times for repeated requests. By default it is enabled. +- **Wait for Model**: Use this to wait for the model to load if it is not ready, avoiding any errors. By default it is off. + +Hugging Face Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate text based on the input and model settings. It provides information or explanations tailored to the given context. Check out all the available text generation models on [Hugging Face](https://huggingface.co/models?pipeline_tag=text-generation&sort=trending). + +**Required Parameters** + +- **Model**: Specifies the model to use for generating responses. + + Example Models - + - [google/gemma-2-2b-it](https://huggingface.co/google/gemma-2-2b-it) + - [tiiuae/falcon-7b-instruct](https://huggingface.co/tiiuae/falcon-7b-instruct) + - [HuggingFaceH4/zephyr-7b-beta](https://huggingface.co/HuggingFaceH4/zephyr-7b-beta) + - [mistralai/Mistral-7B-Instruct-v0.2](https://huggingface.co/mistralai/Mistral-7B-Instruct-v0.2) + +- **Input**: The user input for generating responses. + +**Optional Parameter** + +- **Operation Parameters**: Additional parameters to configure the model response. These parameters might change based on model being used. + +Gemini Query + +
    +**Response Example** + +AI integration with ToolJet: + +**Benefits of ToolJet Integration:** + +* **Faster Development:** Streamline the development process with pre-built integrations and templates for common workflows. +* **Reduced Costs:** Automate tasks and reduce the need for custom coding, saving development time and money. +* **Increased Productivity:** Empower your team to build and deploy tools faster, allowing them to focus on more strategic tasks. +* **Improved Collaboration:** Enable seamless collaboration between developers and business users by providing a unified platform for tool creation. + +**ToolJet Integration with Existing Tooling:** + +* **Integration with Popular Tools:** ToolJet can integrate with various tools, including Slack, Jira, Google Drive, and more. +* **Customizability:** Customize the integration to fit your specific workflows and requirements. + +**How ToolJet Integrates with Existing Tooling:** + +* **APIs:** Leverage open APIs to connect ToolJet to other tools and services. +* **Webhook Integration:** Integrate ToolJet with external services via webhooks to trigger actions based on events. +* **ToolJet Plugins:** Explore a library of plugins that expand ToolJet's functionality and facilitate integrations. + +**Example Use Cases:** + +* **Automated Data Pipeline:** Connect ToolJet to a data warehousing platform like Snowflake to automate data extraction and transformation. +* **Workflow Management:** Integrate ToolJet with a project management tool like Jira to create automated workflows for tasks and approvals. +* **Customizable Reporting:** Connect ToolJet to a reporting tool like Google Analytics to generate custom reports based on data analytics. +* **Automatic Notifications:** Integrate ToolJet with a communication platform like Slack to trigger notifications for completed tasks or system updates. + +**Conclusion:** + +ToolJet's integration capabilities significantly enhance the power and flexibility of your development workflows, enabling you to build custom tools faster and more effectively. By leveraging pre-built integrations, customizability, and APIs, ToolJet empowers your team to achieve greater productivity and streamline their processes across various stages of the development lifecycle. + +
    + +### Summarisation + +Use this operation to create a summary of the input text based on the model settings. Check out all the available summarisation models on [Hugging Face](https://huggingface.co/models?pipeline_tag=summarization&sort=trending). + +**Required Parameters** + +- **Model**: Specifies the model to use for generating summary. + + Example Models - + - [facebook/bart-large-cnn](https://huggingface.co/facebook/bart-large-cnn) + - [philschmid/bart-large-cnn-samsum](https://huggingface.co/philschmid/bart-large-cnn-samsum) + - [google/pegasus-xsum](https://huggingface.co/google/pegasus-xsum) + - [ainize/bart-base-cnn](https://huggingface.co/ainize/bart-base-cnn) + - [Falconsai/text_summarization](https://huggingface.co/Falconsai/text_summarization) + + +- **Input**: Input text that needs to be summarized. + +**Optional Parameter** + +- **Operation Parameters**: Additional parameters to configure the model response. These parameters might change based on model being used. + +Gemini Query + +
    +**Response Example** + +ToolJet can integrate with various tools, including Slack, Jira, Google Drive, and more. AI integration with ToolJet: capabilities significantly enhance the power and flexibility of your development workflows. By leveraging pre-built integrations, customizability, and APIs, ToolJet empowers your team to achieve greater productivity. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/jira.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/jira.md new file mode 100644 index 0000000000..22b1da9689 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/jira.md @@ -0,0 +1,421 @@ +--- +id: marketplace-plugin-jira +title: Jira +--- + +# Jira + +ToolJet allows you to connect to your Jira instance to perform various operations such as managing issues, users, worklogs, and boards. + +
    + Jira Homepage +
    + + +## Connection + +To connect to a Jira data source in ToolJet, you can either click the **+Add new data source** button on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page in the ToolJet dashboard. + +To connect to your Jira instance, the following details are required: +- **URL**: Your Jira instance URL +- **Email**: Your Jira account email +- **Token**: Your Jira API token + +
    + Jira Connect +
    + +:::tip +You can generate a personal access token from your Jira account **Manage account > Security > API Tokens** section. +::: + +## Querying Jira + +1. Click the **+** button in the query manager at the bottom of the editor and select the Jira data source added earlier. +2. Choose the resource and operation you want to perform on your Jira instance. + +:::tip +Query results can be transformed using transformations. Refer to our transformations documentation for more details: **[link](/docs/tutorial/transformations)** +::: + +## Supported Resources and Operations + +ToolJet supports the following Jira resources and operations: + +#### Issue + +- **[Get Issue](#get-issue)** +- **[Create Issue](#create-issue)** +- **[Delete Issue](#delete-issue)** +- **[Assign Issue](#assign-issue)** +- **[Edit Issue](#edit-issue)** + +#### User + +- **[Get User](#get-user)** +- **[Find Users by Query](#find-users-by-query)** +- **[Find Assignable Users](#find-assignable-users)** + +#### Worklog + +- **[Get Issue Worklogs](#get-issue-worklogs)** +- **[Add Worklog](#add-worklog)** +- **[Delete Worklog](#delete-worklog)** + +#### Board + +- **[Get Issues for Backlog](#get-issues-for-backlog)** +- **[Get All Boards](#get-all-boards)** +- **[Get Issues for Board](#get-issues-for-board)** + + +## Issue + +### Get Issue + +This operation retrieves details of a specific Jira issue. + +
    + Jira Get Issue +
    + +#### Parameters: +- **Issue key**: The key or id of the issue to retrieve. +- **Params/Body**: Additional parameters such as fields to retrieve, expand options, etc. + +#### Example: +```yaml +Issue Key: 10001 +Params/Body: +{ + "fields": "summary,description,created", + "expand": "renderedFields,names" +} +``` + +### Create Issue + +This operation creates a new Jira issue. + +
    + Jira Create Issue +
    + +#### Parameters: +- **Params/Body**: The details of the issue to be created. + +#### Example: +```yaml +Params/Body: +{ + "fields": { + "project": { + "key": "SCRUM" + }, + "summary": "A particular bug needs to be fixed.", + "description": "The XYZ feature is not working as expected.", + "issuetype": { + "name": "Bug" + }, + "assignee": { + "accountId": "712020:4581444c-054e-41d8-90ed-6d1d849557f7" + }, + "labels": [ + "bug", + "urgent" + ] + } +} +``` + +### Delete Issue + +This operation deletes a specific Jira issue. + +
    + Jira Delete Issue +
    + +#### Parameters: +- **Issue key**: The key or id of the issue to delete. +- **Delete subtasks**: Whether to delete the issue's subtasks. + +#### Example: +```yaml +Issue Key: 10001 +Delete Subtasks: Yes // Can be Yes or No +``` + +### Assign Issue + +This operation assigns a Jira issue to a specific user. + +
    + Jira Assign Issue +
    + +#### Parameters: +- **Issue key**: The key or id of the issue to assign. +- **Account id**: The account ID of the user to assign the issue to. + +#### Example: +```yaml +Issue Key: 10001 +Account id: 712020:4581444c-054e-41d8-90ed-6d1d849557f7 +``` + +### Edit Issue + +This operation modifies an existing Jira issue. + +
    + Jira Edit Issue +
    + +#### Parameters: +- **Issue key**: The key or id of the issue to edit. +- **Params/Body**: The fields to update and their new values. + +#### Example: +```yaml +Issue Key: 10007 +Params/Body: +{ + "fields": { + "summary": "Updated issue summary", + "description": "Updated issue description" + } +} +``` + +## User + +### Get User + +This operation retrieves details of a specific Jira user. + +
    + Jira Get User +
    + +#### Parameters: +- **Account id**: The account ID of the user to retrieve. +- **Expand**: Additional user details to include in the response. + +#### Example: +```yaml +Account id: 5b10a2844c20165700ede21g +Expand: groups,applicationRoles +``` + +### Find Users by Query + +This operation searches for users based on a query. + +
    + Jira Find Users +
    + +#### Parameters: +- **Query**: The search query in Jira Query Language (JQL) format. +- **Start at**: The index of the first user to return. +- **Max results**: The maximum number of users to return. + +#### Example: +```yaml +Query: is assignee of PROJ +Start at: 1 +Max results: 10 +``` + +### Find Assignable Users + +This operation finds users that can be assigned to issues. + +
    + Jira Assignable Users +
    + +#### Parameters: +- **Query**: The search query in Jira Query Language (JQL) format. +- **Account id**: The account ID of the user to find assignable users for. +- **Project key**: The key or id of the project to find assignable users for. +- **Issue key**: The key or id of the issue to find assignable users for. +- **Start at**: The index of the first user to return. +- **Max results**: The maximum number of users to return. +- **Action descriptor id**: The action descriptor ID to find assignable users for. +- **Recommended**: Whether to return recommended users. + +:::info +Note: Query and Account id are mutually exclusive parameters. You can only use one of them. +::: + +#### Example: +```yaml +Query: Mark // Search for users with "Mark" in their name, username, or email +Account id: 5b10a2844c20165700ede21g +Project key: PROJ +Issue key: SCRUM-1 +Start at: 1 +Max results: 10 +Action descriptor id: 12345 +Recommended: Yes + +``` + +## Worklog + +### Get Issue Worklogs + +This operation retrieves the worklogs for a specific issue. + +
    + Jira Get Issue Worklogs +
    + +#### Parameters: +- **Issue key**: The key or id of the issue to get worklogs for. +- **Start at**: The index of the first worklog to return. +- **Max results**: The maximum number of worklogs to return. +- **Started after**: The date and time to start retrieving worklogs from. +- **Started before**: The date and time to stop retrieving worklogs. + +#### Example: +```yaml +Issue Key: SCRUM-1 +Start at: 1 +Max results: 10 +Started after: 1626228754515 +Started before: 1726228754515 +``` + +### Add Worklog + +This operation adds a new worklog entry to an issue. + +
    + Jira Add Worklog +
    + +#### Parameters: +- **Issue key**: The key or id of the issue to add the worklog to. +- **Params/Body**: The details of the worklog entry. + +#### Example: +```yaml +Issue Key: SCRUM-1 +Params/Body: +{ + "comment": "I did some work here.", + "created": "2017-03-14T10:35:37.097+0000", + "id": "100028", + "issueId": "SCRUM-1", + "started": "2017-03-14T10:35:37.097+0000", + "timeSpent": "3h 20m" +} +``` + +### Delete Worklog + +This operation deletes a specific worklog entry from an issue. + +
    + Jira Delete Worklog +
    + +#### Parameters: +- **Issue key**: The key or id of the issue containing the worklog +- **Worklog id**: The ID of the worklog to delete +- **Params/Body**: Additional parameters such as notify users, adjust estimate, etc. + +#### Example: +```yaml +Issue Key: SCRUM-1 +Worklog id: 100010 +Params/Body: +{ + "notifyUsers": "true", + "adjustEstimate": "auto" +} +``` + +## Board + +### Get Issues for Backlog + +This operation retrieves issues from a board's backlog. + +
    + Jira Backlog Issues +
    + +#### Parameters: +- **Board id**: The ID of the board to get backlog issues from. +- **Start at**: The index of the first issue to return. +- **Max results**: The maximum number of issues to return. +- **Expand**: Additional issue details to include in the response. +- **Params/Body**: Additional parameters such as fields to retrieve, expand options, etc. + + +#### Example: +```yaml +Board id: 1 +Start at: 1 +Max results: 10 +Expand: changelog +Params/Body: +{ + "fields": ["summary", "description", "created"], +} +``` + +### Get All Boards + +This operation retrieves all boards visible to the user. + +
    + Jira All Boards +
    + +#### Parameters: +- **Project key**: Limit the boards to a specific project. +- **Start at**: The index of the first board to return. +- **Name**: The name of the board to search for. +- **Max results**: The maximum number of boards to return. +- **Expand**: Additional board details to include in the response. + +#### Example: +```yaml +Project key: PROJ +Start at: 1 +Name: SCRUM +Max results: 10 +Expand: projects +``` + +### Get Issues for Board + +This operation retrieves all issues from a specific board. + +
    + Jira Board Issues +
    + +#### Parameters: +- **Board id**: The ID of the board to get issues from. +- **Start at**: The index of the first issue to return. +- **Max results**: The maximum number of issues to return. +- **Expand**: Additional issue details to include in the response. +- **Params/Body**: Additional parameters such as fields to retrieve, expand options, etc. + +#### Example: +```yaml +Board id: 1 +Start at: 1 +Max results: 10 +Expand: changelog +Params/Body: +{ + "fields": ["summary", "description", "created"], +} +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/lambda.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/lambda.md new file mode 100644 index 0000000000..411aaa306b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/lambda.md @@ -0,0 +1,39 @@ +--- +id: marketplace-plugin-aws-lambda +title: AWS Lambda +--- + +ToolJet can connect to AWS Lambda to run serverless functions. + +
    + +## Connection + +To connect to AWS Lambda plugin, you need to provide the following details: + +- **Access Key ID**: The access key ID of the IAM user that has the required permissions to access AWS Lambda. +- **Secret Access Key**: The secret access key of the IAM user that has the required permissions to access AWS Lambda. +- **Region**: The region where the AWS Lambda is hosted. + +
    + ToolJet database +
    + +
    + +
    + +## Supported Queries + +### Invoke Lambda Function + +This query is used to invoke a Lambda function. The following parameters are required: + +- **Function Name**: The name of the Lambda function to be invoked. +- **Payload**: The JSON payload to be sent to the Lambda function. + +
    + ToolJet database +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/mistral.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/mistral.md new file mode 100644 index 0000000000..b9cb0869cc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/mistral.md @@ -0,0 +1,100 @@ +--- +id: marketplace-plugin-mistral_ai +title: Mistral AI +--- + +Mistral AI can be integrated with ToolJet to generate high-quality text content. By defining various roles, it enables the creation of contextually relevant and dynamic content. + +## Connection + +To connect with Mistral AI, you will need an **API Key**, which can be generated from **[Mistral AI Console](https://console.mistral.ai/api-keys/)**. + +Mistral Configuration + +## Supported Operations + +### Text Generation + +Use this operation to generate text content by controlling various parameters to achieve precise results. + +**Required Parameters** + +- **Model**: Use to specify the AI model for generating content. The available models are: + + - mistral-large-latest + - ministral-3b-latest + - ministral-8b-latest + - open-mistral-nemo + - mistral-small-latest + +- **Messages**: Provide structured input to define the context or conversation.
    + +:::info + +1. A message object with the role **assistant** should always have both a prefix and suffix message object in the messages array. +2. If a message object with the role **assistant** is the last in the array then set `prefix: true` in that object. +::: + +**Optional Parameters** + +- **Max size**: Set the maximum length for the generated content. +- **Temperature**: Adjust to control the creativity and diversity of the output. +- **Top P**: Use to limit randomness by setting a probability threshold. +- **Stop token(s)**: Specify tokens or phrases to end the content generation. +- **Random seed**: Set to ensure consistent results by initializing the generator. +- **Response format**: Choose between plain text or structured JSON output. +- **Presence penalty**: Apply to reduce repetition of words or phrases. +- **Frequency penalty**: Use to discourage frequent word usage for more varied responses. +- **Completions (N)**: Set the number of response variations to generate. +- **Safe prompt**: Ensure the prompt is free of inappropriate or sensitive content. + +Mistral Query + +
    +**Response Example** + +"While I can't provide personalized financial advice, I can certainly help you understand some common investment options that may offer tax benefits. Here are some strategies to consider: + +#### 1. **Retirement Accounts** +- **401(k) or 403(b):** These are employer-sponsored retirement plans. Contributions are made with pre-tax dollars, reducing your taxable income. Employer matching contributions can also boost your savings. +- **Traditional IRA:** Contributions may be tax-deductible, depending on your income and whether you have access to a workplace retirement plan. Withdrawals are taxed as ordinary income. +- **Roth IRA:** Contributions are made with after-tax dollars, but qualified withdrawals are tax-free. This can be beneficial for those who expect to be in a higher tax bracket in retirement. + +#### 2. **Health Savings Accounts (HSAs)** +- **HSAs:** These are available to individuals with high-deductible health plans. Contributions are tax-deductible, earnings grow tax-free, and withdrawals for qualified medical expenses are tax-free. + +#### 3. **Tax-Loss Harvesting** +- **Selling Losing Investments:** You can sell investments that have lost value to offset gains from other investments, reducing your capital gains tax liability. + +#### 4. **Municipal Bonds** +- **Muni Bonds:** These are issued by state and local governments and are often exempt from federal taxes and sometimes state taxes as well. + +#### 5. **Education Savings Accounts** +- **529 Plans:** Contributions grow tax-free, and withdrawals are tax-free if used for qualified education expenses. Some states offer tax deductions or credits for contributions. +- **Coverdell ESAs:** Similar to 529 plans but with more restrictions on contributions and uses. + +#### 6. **Real Estate Investments** +- **Rental Income:** Income from rental properties can be offset by depreciation, reducing your taxable income. +- **1031 Exchanges:** Allows you to defer capital gains taxes by reinvesting the proceeds from the sale of an investment property into a similar property. + +#### 7. **Tax-Efficient Investments** +- **Index Funds and ETFs:** These often have lower turnover rates, which can reduce capital gains distributions and therefore tax liabilities. +- **Dividend-Paying Stocks:** Qualified dividends are taxed at lower rates than ordinary income. + +#### 8. **Charitable Contributions** +- **Donations:** Contributions to qualified charities can be tax-deductible, reducing your taxable income. +- **Donor-Advised Funds:** Allow you to make a charitable contribution and receive an immediate tax deduction, while deciding later where to allocate the funds. + +#### 9. **Energy-Efficient Home Improvements** +- **Tax Credits:** Certain energy-efficient home improvements may qualify for tax credits. + +#### 10. **Business Ownership** +- **Sole Proprietorships, LLCs, S-Corps:** Different business structures offer various tax benefits, such as pass-through income and deductions for business expenses. + +#### Steps to Create a Plan: +1. **Assess Your Financial Goals:** Determine what you want to achieve with your investments (e.g., retirement savings, education funding). +2. **Evaluate Your Tax Situation:** Understand your current and future tax brackets to choose the right investment vehicles. +3. **Diversify Your Portfolio:** Spread your investments across different asset classes to manage risk. +4. **Consult a Professional:** Consider working with a financial advisor or tax professional to tailor a plan to your specific needs." + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/openai.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/openai.md new file mode 100644 index 0000000000..9869b09560 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/openai.md @@ -0,0 +1,219 @@ +--- +id: marketplace-plugin-openai +title: OpenAI +--- + +ToolJet integrates with OpenAI to utilize its AI capabilities. This integration enables ToolJet to generate text based on user prompts, facilitate chat interactions, create images tailored to specific inputs, and generate vector embeddings. + +:::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 + +For connecting to OpenAI, the following credentials are required: + +- **API key**: API key for OpenAI can be generated [here](https://platform.openai.com/account/api-keys). +- **Organization ID**: Find the Organization ID [here](https://platform.openai.com/account/org-settings). + +
    + Configuring OpenAI in ToolJet +
    + +## Supported Operations + +- **[Chat](#chat)** +- **[Completions](#completions)** +- **[Generate AI Image(s)](#generate-ai-images)** +- **[Generate embedding](#generate-embedding)** + +### Chat + +The function of this operation is to examine the user's input and generate a suitable response that simulates human-like conversation. + +#### Required Parameters + +- **Model**: The model to use for generating the chat response. The available models are: + - GPT-4.0 + - GPT-4.0 mini + - GPT-4 Turbo + - GPT-3.5 Turbo +- **Prompt**: A prompt is the initial message or question that is provided as input to the chatbot model to start a conversation. + +#### Optional Parameters + +- **Max Tokens**: This parameter specifies the maximum number of tokens to generate in the text completion output. For example, if you set it to 50, then it will generate a text completion that contains up to 50 tokens. +- **Temperature**: Temperature is used to control the creativity and randomness of the generated text. It ranges from 0 to 2, a higher value such as 0.8 will increase the randomness of the output, whereas a lower value such as 0.2 will make it more focused and deterministic. +- **Stop sequence**: This Stop sequence/parameter is used to specify when the API should stop generating text completions. This parameter is optional and can be used to customize the length and quality of the generated text. +- **Suffix**: The suffix that follows the inserted text completion. + +
    + Chat Operation +
    + +
    +**Example Values** + +```yaml +Model: GPT-4 Turbo +Prompt: What are the key principles of machine learning? +Max Tokens: 100 +Temperature: 0.7 +Stop sequence: END +Suffix: \n +``` + +
    + +
    +**Response Example** + +```json +"Machine learning, a subset of artificial intelligence, is fundamentally about designing and implementing algorithms that can learn from and make predictions or decisions based on data. The key principles of machine learning can be outlined as follows:nn1. **Learning from Data**: At its core, machine learning involves developing algorithms that can learn from and make predictions or inferences from data. Models are trained using a large set of data known as training data, which helps them make decisions or predictions without being explicitly programmed for the task.nn2" +``` + +
    + +### Completions + +The purpose of this operation is to generate text completions based on a given prompt. + +#### Required Parameters + +- **Model**: The model to use for generating the text completion. The available models are: + - GPT-3.5 Turbo +- **Prompt**: OpenAI uses the prompt as a starting point to generate a continuation or completion of the text, which can be in the form of a sentence, paragraph, or even an entire article. The quality and relevance of the generated text output can depend on the quality and specificity of the prompt provided. + +#### Optional Parameters + +- **Max Tokens**: This parameter specifies the maximum number of tokens to generate in the text completion output. For example, if you set it to 50, then it will generate a text completion that contains up to 50 tokens. +- **Temperature**: Temperature is used to control the creativity and randomness of the generated text. It ranges from 0 to 1, a higher value such as 0.8 will increase the randomness of the output, whereas a lower value such as 0.2 will make it more focused and deterministic. +- **Stop sequence**: Stop sequence is used to specify when the API should stop generating text completions. This parameter is optional and can be used to customize the length and quality of the generated text. +- **Suffix**: The suffix that follows the inserted text completion. + +
    + Completions Operation +
    + +
    +**Example Values** + +```yaml +Model: GPT-3.5 Turbo +Prompt: The benefits of using low code platforms for software development include +Max Tokens: 100 +Temperature: 0.6 +Stop sequence: END +Suffix: \n +``` + +
    + +
    +**Response Example** + +``` json +":1. Increased Speed and Efficiency: Low code platforms allow developers to quickly build and deploy applications without having to write extensive lines of code. This significantly reduces development time and increases efficiency.nn2. Cost Savings: With low code platforms, businesses can save on development costs by reducing the need for a large team of developers. This also leads to lower maintenance costs as the applications are easier to maintain and update.nn3. User-Friendly Interface: Low code platforms are designed to be user-friendly and require minimal" +``` + +
    + +### Generate AI Image(s) + +This operation generates AI images based on the given prompt. + +#### Required Parameters + +- **Model**: The model to use for generating the image. The available models are: + - DALL-E 3 + - DALL-E 2 +- **Prompt**: The prompt is the initial message or question that is provided as input to the AI model to generate an image. + +#### Optional Parameters + +- **Size (in pixels)**: The size of the image to be generated in pixels. The default value is 1024x1024. The allowed sizes depend on the model: + - **DALL-E 2**: Must be one of `256x256`, `512x512`, or `1024x1024`. + - **DALL-E 3**: Must be one of `1024x1024`, `1792x1024`, or `1024x1792`. + +
    + Generate AI Images Operation +
    + +
    +**Example Values** + +```yaml +Model: DALL-E 3 +Prompt: A futuristic cityscape with flying cars and holographic billboards at sunset +Size(in pixels): 1024x1024 +``` + +
    + +
    +**Response Example** + +```json +{ + "status": "success", + "message": "Image generated successfully", + "data": { + "url": "https://oaidalleapiprodscus.blob.core.windows.net/private/org-CpkCwFjT48kGZ33uOV2L4QxH/user-3QrXKnZO1PJUBeNP6xiQV9Rs/img-XXIds2QvTdcUfcJ2qmNWLwsC.png?st=2024-10-09T10%3A24%3A34Z&se=2024-10-09T12%3A24%3A34Z&sp=r&sv=2024-08-04&sr=b&rscd=inline&rsct=image/png&skoid=d505667d-d6c1-4a0a-bac7-5c84a87759f8&sktid=a48cca56-e6da-484e-a814-9c849652bcb3&skt=2024-10-09T03%3A29%3A32Z&ske=2024-10-10T03%3A29%3A32Z&sks=b&skv=2024-08-04&sig=qPBYkPdQjLwBWJAS8fWmhs3B5TNSYbxhuMe15NcmgM4%3D" + } +} +``` + +
    + +### Generate Embedding + +This operation is used to generate vector embeddings from the given text, which can be used to build AI applications. + +#### Required Parameters + +- **Model**: The model to use for generating the vector embedding. The available models are: + - text-embedding-3-small + - text-embedding-3-large + - text-embedding-ada-002 + +- **Input**: The text input used for generating the vector embedding. + +#### Optional Parameters + +- **Encoding format**: Specifies the output format of the vector embedding from the dropdown, float or base64. +- **Dimensions**: Defines the number of values in the generated embedding vector, affecting its size and level of detail. + +Generate Vector Embedding + +
    +**Example Values** + +```yaml +Model: text-embedding-3-large +Input: ToolJet is a low code platform used to build internal tools +Encoding format: Float +Dimensions: 10 +``` + +
    + +
    +**Response Example** + +```json +{ + "embedding": [ + -0.49750686, + -0.7019393, + -0.23043627, + -0.12421317, + -0.076866604, + 0.2191516, + 0.2548046, + 0.1453106, + -0.20050736, + 0.10516006 + ] +} +``` +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/pinecone.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/pinecone.md new file mode 100644 index 0000000000..12d9b2cb29 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/pinecone.md @@ -0,0 +1,224 @@ +--- +id: marketplace-plugin-pinecone +title: Pinecone +--- + +ToolJet integrates with Pinecone to utilize its vector database capabilities. This integration enables ToolJet to perform vector operations such as updating, querying, and managing vector embeddings in Pinecone indexes. + +:::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 + +For connecting to Pinecone, the following credential is required: + +- **API Key**: API key for Pinecone can be generated from the [Pinecone Console](https://app.pinecone.io/organizations/-/projects/-/keys). + +Configuring Pinecone in ToolJet + + +## Supported Operations + +- **[Get Index Stats](#get-index-stats)** +- **[List Vector IDs](#list-vector-ids)** +- **[Fetch Vectors](#fetch-vectors)** +- **[Upsert Vectors](#upsert-vectors)** +- **[Update Vector](#update-a-vector)** +- **[Delete Vectors](#delete-vectors)** +- **[Query Vectors](#query-vectors)** + +### Get Index Stats + +This operation retrieves statistics about a specific index in your Pinecone database. + +#### Required Parameter + +- **Index**: The name of the index to get statistics for. + +Get Index Stats Operation + +
    +**Example Response** + +```json +{ + "namespaces":{ + "":{ + "recordCount":100 + } + }, + "dimension":1024, + "indexFullness":0, + "totalRecordCount":100 +} +``` +
    + +### List Vector IDs + +This operation retrieves a list of vector IDs from a specified index. + +#### Required Parameter + +- **Index**: The name of the index to list vector IDs from. + +#### Optional Parameters + +- **Prefix**: Filter vector IDs by prefix. +- **Limit**: Maximum number of vector IDs to return. +- **Pagination Token**: Token for retrieving the next page of results. +- **Namespace**: Specific namespace to query within the index. + +List Vector IDs Operation + +
    +**Example Response** + +```yaml +{ + "vectors":[ + {"id":"0"}, + {"id":"1"}, + {"id":"10"}, + {"id":"11"}, + {"id":"12"}, + {"id":"13"}, + {"id":"14"}, + {"id":"15"}, + {"id":"16"}, + {"id":"17"} + ], + "pagination":{ + "next":"eyJza2lwX3Bhc3QiOiIxNyIsInByZWZpeCI6bnVsbH0=" + }, + "namespace":"", + "usage":{ + "readUnits":1 + } +} +``` +
    + +### Fetch Vectors + +This operation retrieves specific vectors by their IDs from an index. + +#### Required Parameters + +- **Index**: The name of the index to fetch vectors from. +- **IDs**: Array of vector IDs to fetch. + +#### Optional Parameters + +- **Namespace**: Specific namespace to fetch vectors from. + +Fetch Vectors Operation + +
    +**Example Response** + +```yaml +{ + "records":{}, + "namespace":"", + "usage":{ + "readUnits":1 + } +} +``` +
    + +### Upsert Vectors + +This operation inserts or updates vectors in an index. + +#### Required Parameters + +- **Index**: The name of the index to upsert vectors into. +- **Vectors**: Array of vectors to upsert, including IDs and values. + +#### Optional Parameters + +- **Namespace**: Specific namespace to upsert vectors into + +Upsert Vectors Operation + +
    +**Example Response** + +```yaml +Upsert Successful +``` +
    + +### Update a Vector + +This operation updates a single vector's values or metadata. + +#### Required Parameters + +- **Index**: The name of the index containing the vector. +- **ID**: ID of the vector to update. + +#### Optional Parameters + +- **Values**: Updated vector values as an array. +- **Sparse Vector**: Sparse vector representation. +- **Metadata**: Additional metadata for the vector. +- **Namespace**: Specific namespace containing the vector. + +Update Vector Operation + +
    +**Example Response** + +```yaml +Update Successful +``` +
    + +### Delete Vectors + +This operation deletes vectors from an index. + +#### Required Parameters + +- **Index**: The name of the index to delete vectors from. + +#### Optional Parameters + +- **IDs**: Array of vector IDs to delete. +- **Delete All**: Boolean flag to delete all vectors. +- **Namespace**: Specific namespace to delete vectors from. +- **Filter**: Filter condition for selective deletion. + +Delete Vectors Operation + +
    +**Example Response** + +```yaml +Delete Successful +``` +
    + +### Query Vectors + +This operation queries vectors in an index based on similarity. + +#### Required Parameters + +- **Index**: The name of the index to query. +- **Vectors**: Query vector values. +- **Top K**: Number of most similar vectors to return. + +#### Optional Parameters + +- **Namespace**: Specific namespace to query. +- **Filter**: Filter condition for the query. +- **Include Values**: Boolean to include vector values in results. +- **Include Metadata**: Boolean to include metadata in results. +- **Sparse Vector**: Sparse vector for hybrid search. + +Query Vectors Operation diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/plivo.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/plivo.md new file mode 100644 index 0000000000..973ed5ac95 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/plivo.md @@ -0,0 +1,46 @@ +--- +id: marketplace-plugin-plivo +title: Plivo +--- + +You can integrate your ToolJet application with Plivo for SMS functionality. + +:::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 + +To use the Plivo plugin, you need the following credentials: +- **Auth Token** +- **Auth ID** + +:::info Generating Auth Token/ID +- Navigate to the Plivo Console (https://www.plivo.com/) +- In the console, you will see your auth ID and auth token listed under the "API" section. +- If you don't see your auth ID and auth token, you can generate new ones by clicking on the "Generate New Auth ID/Token" button. +::: + +
    + +Configuring Plivo In ToolJet + +
    + +## Supported Queries + +### Send SMS + +You can use the Send SMS operation to send an SMS to a specified mobile number. + +#### Required Parameters: + +- **To Number** +- **From Number** +- **Body** + +
    + +Send SMS Using plivo + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/pocketbase.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/pocketbase.md new file mode 100644 index 0000000000..bbfe743464 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/pocketbase.md @@ -0,0 +1,123 @@ +--- +id: marketplace-plugin-pocketbase +title: PocketBase +--- + +# PocketBase + +ToolJet connects to your PocketBase database, allowing you to directly interact with your PocketBase backend from the convenience of your ToolJet application. + +:::info +**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 + +- To connect to PocketBase, you need the Host URL, email, and password. The Host URL is the URL of your PocketBase instance. Email and password are the credentials of the user who has access to the PocketBase instance. + +- Establish a connection to PocketBase by either clicking `+Add new Data source` on the query panel or navigating to the [Data Sources](/docs/data-sources/overview/) page from the ToolJet dashboard. + +- Enter your Host URL, email and password into their designated fields. + +- Click **Test Connection** to validate your credentials. Click **Save** to store the data source. + +
    + PocketBase Install +
    + +## Querying PocketBase + +- To perform queries on PocketBase in ToolJet, click the **+Add** button in the [query manager](/docs/app-builder/query-panel/#query-manager) located at the bottom panel of the editor. +- Select the previously configured PocketBase datasource. + +- In the Operation dropdown, select the desired operation type. ToolJet currently [supports](#supported-operations) five query types for PocketBase interactions. + +- Enter the collection name and other required parameters for the selected operation and click on **Run** button to run the query. + +
    + +PocketBase query + +
    + +
    + +:::info +Query results can be transformed using transformations. Read our [transformations documentation](/docs/tutorial/transformations). +::: + +## Supported Operations + +You can create query for PocketBase data source to perform several operations such as: + 1. **[List Records](#list-records)** + 2. **[Get Record](#get-record)** + 3. **[Add Record to Collection](#add-record-to-collection)** + 4. **[Update Record to Collection](#update-record-to-collection)** + 5. **[Delete Record](#delete-record)** + +### List Records + + #### Required parameters: + + - **Collection Name** - Collection name in the database. + + + + #### Optional Parameters: + + - **Limit** - Number of records to be fetched. + - **Sort** - Sort the records based on a sort rule. Add `-` / `+`(default) in front of the attribute for DESC / ASC order. + - **Where** - Filter the records based on a filter conditions. + + +
    + List Records +
    + + +### Get Record + + #### Required parameters: + - **Collection Name** - Collection name in the database. + - **Record ID** - ID of the record to be fetched. + + +
    + Get Record +
    + +### Add Record to Collection + + #### Required parameters: + - **Collection Name** - Collection name in the database. + - **Body** - Data to be added to the collection. It should be in valid JSON format. + + +
    + Add Record +
    + +### Update Record to Collection + + #### Required parameters: + - **Collection Name** - Collection name in the database. + - **Record ID** - ID of the record to be updated. + - **Body** - Data to be updated in the collection. It should be in valid JSON format. + + +
    + Update Record +
    + +### Delete Record + + #### Required parameters: + - **Collection Name** - Collection name in the database. + - **Record ID** - ID of the record to be deleted. + + +
    + Delete Record +
    + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/portkey.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/portkey.md new file mode 100644 index 0000000000..5f2624c0cd --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/portkey.md @@ -0,0 +1,232 @@ +--- +id: marketplace-plugin-portkey +title: Portkey +--- + +ToolJet can integrate with Portkey to access AI services such as text completion, chat completion, prompt completion, and embedding creation. This integration enables ToolJet to leverage Portkey's LMOps platform to develop, launch, maintain, and iterate on generative AI features. + +
    + Portkey Dashboard Overview +
    + +:::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 + +To connect to Portkey, the following credentials are required: + +- **API Key**: Your Portkey API Key. Refer to the **[Portkey API Authentication Documentation](https://docs.portkey.ai/docs/api-reference/authentication#obtaining-your-api-key)** for instructions on obtaining your API Key. +- **Default Virtual Key** (Optional): Your default Portkey Virtual Key. Visit the **[Portkey Virtual Keys Documentation](https://docs.portkey.ai/docs/product/ai-gateway-streamline-llm-integrations/virtual-keys#creating-virtual-keys)** to learn how to create and retrieve your Virtual Key. +- **Config** (Optional): Your default Portkey configuration. +- **Gateway URL** (Optional): Your default Portkey Gateway URL. See the **[Portkey API Authentication Documentation](https://docs.portkey.ai/docs/api-reference/authentication#obtaining-your-api-key)** for details on how to obtain your Gateway URL. + +
    + Configuring Portkey in ToolJet +
    + +## Supported Operations + +Portkey in ToolJet supports the following operations: + +- **[Completion](#completion)** +- **[Chat](#chat)** +- **[Prompt Completion](#prompt-completion)** +- **[Create Embedding](#create-embedding)** + +### Completion + +This operation generates text completions based on a given prompt. + +#### Parameters: + +- **Prompt**: The input text to generate completions for. +- **Model**: The AI model to use. +- **Max Tokens**: Maximum number of tokens to generate. +- **Temperature**: Controls randomness. +- **Stop Sequences**: Sequences where the API will stop generating further tokens. +- **Metadata**: Additional metadata for the request. +- **Other Parameters**: Any other parameters to include in the request. + +
    + Completion Operation for Portkey +
    + +
    + **Response Example** + ```json +{ + "id": "cmpl-9vNUfM8OP0SwSqXcnPwkqzR7ep8Sy", + "object": "text_completion", + "created": 1723462033, + "model": "gpt-3.5-turbo-instruct", + "choices": [ + { + "text": "nn"Experience the perfect brew at Bean There."", + "index": 0, + "logprobs": null, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 13, + "completion_tokens": 10, + "total_tokens": 23 + } +} + ``` +
    + +### Chat + +This operation generates chat completions based on a series of messages. + +#### Parameters: + +- **Messages**: An array of message objects representing the conversation. +- **Model**: The AI model to use. +- **Max Tokens**: Maximum number of tokens to generate. +- **Temperature**: Controls randomness. +- **Stop Sequence**: Sequences where the API will stop generating further tokens. +- **Metadata**: Additional metadata for the request. +- **Other Parameters**: Any other parameters to include in the request. + +
    + Chat Operation for Portkey +
    + +
    + **Response Example** +```json +{ + "id": "chatcmpl-9vNIlfllXOPEmroKFajK2nlJHzhXA", + "object": "chat.completion", + "created": 1723461295, + "model": "gpt-3.5-turbo-0125", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "The capital of France is Paris.", + "refusal": null + }, + "logprobs": null, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 24, + "completion_tokens": 7, + "total_tokens": 31 + }, + "system_fingerprint": null +} +``` +
    + +### Prompt Completion + +This operation generates completions based on a pre-defined prompt. + +#### Parameters: + +- **Prompt ID**: The ID of the pre-defined prompt to use. +- **Variables**: Variables to be used in the prompt. +- **Parameters**: Additional parameters for the prompt completion. +- **Metadata**: Additional metadata for the request. + +
    + Prompt Completion Operation for Portkey +
    + +
    + **Response Example** +```json +{ + "id": "chatcmpl-9w6D8jZciWVf1DzkgqNZK14KUvA4d", + "object": "chat.completion", + "created": 1723633926, + "model": "gpt-4o-mini-2024-07-18", + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": "The Industrial Revolution, starting in the late 18th century, transformed production from hand methods to machine-based processes, introducing new manufacturing techniques, steam power, and machine tools. It marked a shift from bio-fuels to coal, with the textile industry leading the way. This period resulted in significant population growth, increased average income, and improved living standards.", + "refusal": null + }, + "logprobs": null, + "finish_reason": "stop" + } + ], + "usage": { + "prompt_tokens": 145, + "completion_tokens": 71, + "total_tokens": 216 + }, + "system_fingerprint": "fp_48196bc67a" +} +``` +
    + +### Create Embedding + +This operation creates embeddings for given input text. + +#### Parameters: + +- **Input**: The input text to create embeddings for. +- **Model**: The AI model to use for creating embeddings. +- **Metadata**: Additional metadata for the request. + +
    + Create Embedding Operation for Portkey +
    + +
    + **Response Example** +```json +{ + "object": "list", + "data": [ + { + "object": "embedding", + "index": 0, + "embedding": [ + -0.02083237, + -0.016892163, + -0.0045676464, + -0.05084554, + -0.025968939, + 0.029597048, + 0.029987168, + 0.02907689, + 0.0105982395, + -0.024356445, + -0.00935636, + 0.0066352785, + 0.034018397, + -0.042002838, + 0.03856979, + -0.014681488, + ..., + 0.024707552 + ] + } + ], + "model": "text-embedding-3-small", + "usage": { + "prompt_tokens": 9, + "total_tokens": 9 + } +} +``` +
    + +For all operations, you can optionally specify: +- **Config**: Configuration options for the request. +- **Virtual Key**: A specific virtual key to use for the request, overriding the default. + +--- \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/prestodb.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/prestodb.md new file mode 100644 index 0000000000..4db59a764e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/prestodb.md @@ -0,0 +1,56 @@ +--- +id: marketplace-plugin-Presto +title: PrestoDB +--- + +# PrestoDB + +ToolJet allows you to connect to your PrestoDB database to perform SQL queries and retrieve data. + +## Connection + +To connect to a PrestoDB data source in ToolJet, you can either click the **+Add new data source** button on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page in the ToolJet dashboard. + +To connect to your PrestoDB database, the following details are required: +- **Username** +- **Password** +- **Catalog** +- **Host** +- **Port** +- **Schema** +- **User** +- **Timezone** (optional) +- **Extra Headers** (optional) + +
    + PrestoDB Connect +
    + +## Querying PrestoDB + +1. Click the **+** button in the query manager at the bottom of the editor and select the PrestoDB data source added earlier. +2. Write your SQL query in the query editor. + +:::tip +Query results can be transformed using transformations. Refer to our transformations documentation for more details: **[link](/docs/tutorial/transformations)** +::: + +## Supported Operations + +ToolJet supports executing SQL queries on PrestoDB databases. + +### SQL Query + +This operation allows you to execute SQL queries on your PrestoDB database. + +
    + PrestoDB Query +
    + +#### Parameters: +- **SQL Query**: The SQL query to execute. + +#### Example: +```sql +SELECT * FROM my_table WHERE column_name = 'value' LIMIT 10 +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/qdrant.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/qdrant.md new file mode 100644 index 0000000000..4cf73ee5de --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/qdrant.md @@ -0,0 +1,169 @@ +--- +id: marketplace-plugin-qdrant +title: Qdrant +--- + +Qdrant is a vector database which can be integrated with ToolJet to enable efficient vector search at scale. It supports AI applications with advanced technology for finding similar vectors. + +At its core, Qdrant operates with points, which are records consisting of a vector and an optional payload which allows you to store additional context or metadata alongside the vectors for more meaningful searches. + +## Connection + +To connect with Qdrant, you will need Qdrant URL and an API key, which can be generated from [Qdrant Cloud Dashboard](https://qdrant.to/cloud). + +Qdrant Configuration + +## Supported Operations + +### Get Collection Info + +Use this operation to retrieve metadata and configuration details about a specific collection in Qdrant. + +**Required Parameter** + +- **Collection Name:** Refers to the specific dataset stored in Qdrant. + +Get Collection Info + +
    +**Example Response** +```yaml +{ + "status": "green", + "optimizer_status": "ok", + "indexed_vectors_count": 5417, + "points_count": 5412, + "segments_count": 2, + "config": { + "params": { + "vectors": { + "size": 512, + "distance": "Cosine" + }, + "shard_number": 1, + "replication_factor": 1, + "write_consistency_factor": 1, + "on_disk_payload": true + }, + "hnsw_config": { + "m": 16, + "ef_construct": 100, + "full_scan_threshold": 10000, + "max_indexing_threads": 0, + "on_disk": false + }, + "optimizer_config": { + "deleted_threshold": 0.2, + "vacuum_min_vector_number": 1000, + "default_segment_number": 2, + "max_segment_size": null, + "memmap_threshold": null, + "indexing_threshold": 1000, + "flush_interval_sec": 5, + "max_optimization_threads": null + }, + "wal_config": { + "wal_capacity_mb": 1, + "wal_segments_ahead": 0 + }, + "quantization_config": null, + "strict_mode_config": { + "enabled": false + } + }, + "payload_schema": {} +} +``` +
    + +### Get Points + +Use this operation to retrieve specific data points from a collection using their unique identifiers. + +**Required Parameters** + +- **Collection Name:** Refers to the specific dataset stored in Qdrant. +- **IDs:** Unique identifiers for individual data points within the collection. They are used to locate and retrieve specific entries from the collection. + +Get Points + +
    +**Example Response** + +```yaml +[{ + "id": 1, + "payload": { + "file_name": "text.jpeg", + "image_url": "https://storage.googleapis.com/demo-midjourney/.jpeg", + "name": "Catherine Hyde", + "url": "/styles/catherine-hyde" + }, + "vector": [0.043383807, -0.06374442, -0.013710048, -0.0332631, 0.013115806, -0.018017521, -0.01306308, -0.030214038, 0.009868348, 0.02169504, -0.009813371, -0.033448037, 0.004893773, -0.009090395...] +}] +``` +
    + +### Delete Points + +Use this operation to remove specific data points from a collection using their unique identifiers. + +**Required Parameters** + +- **Collection Name:** Refers to the specific dataset stored in Qdrant. +- **IDs:** Unique identifiers for individual data points within the collection. They are used to locate and retrieve specific entries from the collection. + +**Optional Parameter** + +- **Filter:** Used to set conditions when searching or retrieving points. + +Delete Points + +### Query Points + +Use this operation to search data points in a collection using a query, typically based on vector similarity or filtering conditions. + +**Required Parameters** + +- **Collection Name:** Identifies the dataset where the query will be executed. +- **Limit:** Specifies the maximum number of results to return. +- **Query:** A vector representing the query input used for similarity-based search. + +**Optional Parameters** + +- **With Vectors:** Indicates whether the vector data for the retrieved points should be included in the response (true or false). +- **Include Metadata:** Specifies if metadata associated with the points should be returned (true or false). +- **Filter:** Defines conditions to narrow down the search. + +Query Points + +
    +**Example Response** + +```yaml +[{ + "id": 2589, + "version": 124, + "score": 0.1293197 +}, { + "id": 2274, + "version": 111, + "score": 0.12669206 +}, { + "id": 2612, + "version": 124, + "score": 0.12196793 +}] +``` +
    + +### Upsert Points + +Use this operation to add new data points or update existing ones in a collection based on their unique identifiers. + +**Required Parameters** + +- **Collection Name:** Represents the group of data points where the new or updated points will be stored. +- **Points:** The actual data being added or updated. Each point contains a unique identifier and optional attributes. + +Upsert Points diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/salesforce.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/salesforce.md new file mode 100644 index 0000000000..59dc445a72 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/salesforce.md @@ -0,0 +1,111 @@ +--- +id: marketplace-plugin-salesforce +title: Salesforce +--- + +# Salesforce + +ToolJet connects to your Salesforce account, allowing you to directly interact with your Salesforce connected app from within your ToolJet application. + +:::info +**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 + +- To connect to Salesforce, you need to have the following credentials: + - **Client ID** - The consumer key of your Salesforce connected app. + - **Client Secret** - The consumer secret of your Salesforce connected app. + +
    + Salesforce Connected App API Settings +
    + +- Establish a connection to Salesforce by either clicking `+Add new Data source` on the query panel or navigating to the [Data Sources](/docs/data-sources/overview/) page from the ToolJet dashboard. + +- Select the API version from the dropdown, enter your Client ID and Client Secret into their designated fields. + +- Copy the **Redirect URL** and paste it into the OAuth **Callback URL** field in your Salesforce connected app settings. + +- Click the **Connect to salesforce** button to authenticate your Salesforce account. + +- Once authenticated, click **Save data source** to store the data source. + +
    + Salesforece Install +
    + +## Querying Salesforce + +- To perform queries on Salesforce in ToolJet, click the **+Add** button in the [query manager](/docs/app-builder/query-panel/#query-manager) located at the bottom panel of the editor. +- Select the previously configured Salesforce datasource from the **Data Source** dropdown. + +- In the Operation dropdown, select the desired operation type. ToolJet supports two operation types for Salesforce interactions: + + - **[SOQL Query](#soql-query)** - SOQL (Salesforce Object Query Language) is used to search your organization’s Salesforce data for specific information. + + - **[CRUD Action](#crud-actions)** - CRUD (Create, Retrieve/Read, Update, Delete) actions are used to interact with Salesforce objects. + + +## SOQL Query + +- To perform a SOQL query, select the **SOQL Query** operation from the dropdown. +- Enter the SOQL query in the **Query** field. +- Click **Run** to execute the query. + +
    + SOQL Query +
    + +
    + +:::info +Query results can be transformed using transformations. Read our [transformations documentation](/docs/tutorial/transformations). +::: + +## CRUD Actions + +To perform CRUD actions on Salesforce, select the **CRUD Action** operation from the dropdown. The following CRUD actions are supported: + +### Create + + #### Required parameters: + - **Resource Name** - The name of the Salesforce object you want to create. By default, Account is selected. + - **Resource Body** - The data you want to insert into the Salesforce object. + +
    + Create +
    + +### Retrieve(Read) + + #### Required parameters: + - **Resource Name** - The name of the Salesforce object you want to create. By default, Account is selected. + - **Resource ID** - The ID of the Salesforce object you want to retrieve. + +
    + Read +
    + +### Update + + #### Required parameters: + - **Resource Name** - The name of the Salesforce object you want to create. By default, Account is selected. + - **Resource Body** - The data you want to update in the Salesforce object. The resource body should contain the ID of the Salesforce object you want to update. + +
    + Update +
    + +### Delete + + #### Required parameters: + - **Resource Name** - The name of the Salesforce object you want to create. By default, Account is selected. + - **Resource ID** - The ID of the Salesforce object you want to delete. + +
    + Delete +
    + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/sharepoint.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/sharepoint.md new file mode 100644 index 0000000000..ebb95dce8e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/sharepoint.md @@ -0,0 +1,770 @@ +--- +id: marketplace-plugin-sharepoint +title: Sharepoint +--- + +ToolJet allows you to connect to Microsoft Sharepoint to perform various operations like managing sites, lists, and items using Microsoft Graph API. + +:::info +**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 + +To connect to a Sharepoint data source in ToolJet, you can either click the **+ Add new data source** button on the query panel or navigate to the **[Data Sources](/docs/data-sources/overview)** page in the ToolJet dashboard. + +:::info +You'll need to register your application in Azure Active Directory to get the required credentials. The application needs appropriate Microsoft Graph API permissions. +::: + +To connect to Sharepoint, you need the following details: +- **Client ID** +- **Client Secret** +- **Tenant ID** + +
    + Sharepoint Connect +
    + +## Querying Sharepoint + +1. Click the **+ Add** button in the query manager at the bottom of the editor and select the Sharepoint data source added earlier. +2. Choose the operation you want to perform on your Sharepoint instance. + +:::tip +Query results can be transformed using transformations. Refer to our transformations documentation for more details: **[link](/docs/tutorial/transformations)** +::: + +## Supported Operations + +ToolJet supports the following Sharepoint operations: + +- **[Get All Sites](#get-all-sites)** +- **[Get Site](#get-site)** +- **[Get Analytics](#get-analytics)** +- **[Get Pages Of a Site](#get-pages-of-a-site)** +- **[Get All Lists](#get-all-lists)** +- **[Get Metadata Of a List](#get-metadata-of-a-list)** +- **[Create a List](#create-a-list)** +- **[Get Items Of a List](#get-items-of-a-list)** +- **[Update Item Of a List](#update-item-of-a-list)** +- **[Delete Item Of a List](#delete-item-of-a-list)** +- **[Add Item To a List](#add-item-to-a-list)** + +### Get All Sites + +This operation retrieves all available Sharepoint sites. For more details, see the Microsoft Graph API documentation **[here](https://learn.microsoft.com/en-us/graph/api/site-search)**. + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get All Sites +
    + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites", + "value": [ + { + "createdDateTime": "2024-09-08T15:54:30Z", + "id": "tooljetxxxx.sharepoint.com,bcxxxx-4b3a-xxxxxx-dfe229c34311,2a4ac5da-xxx-xxxx-b047-18dece61fb95", + "lastModifiedDateTime": "2024-08-17T18:50:05Z", + "name": "appcatalog", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/appcatalog", + "displayName": "Apps", + "root": {}, + "siteCollection": { + "hostname": "tooljetxxxx.sharepoint.com" + } + } + ] +} +``` +
    + +### Get Site + +This operation retrieves information about a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site to retrieve + +
    + Get Site +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites/$entity", + "createdDateTime": "2024-10-22T13:21:10.623Z", + "description": "Internal DIA Guidelines", + "id": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb", + "lastModifiedDateTime": "2024-10-24T13:35:39Z", + "name": "NewStyle", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle", + "displayName": "NewStyle", + "root": {}, + "siteCollection": { + "hostname": "tooljetxxxx.sharepoint.com" + } +} +``` +
    + +### Get Analytics + +This operation retrieves analytics for a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site +- **Time Interval**: + - **Last 7 Days** + - **All Time** + +
    + Get Analytics +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Time Interval: Last 7 Days +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.itemActivityStat", + "aggregationInterval": "None", + "startDateTime": "2024-10-30T00:00:00Z", + "endDateTime": "2024-11-05T00:00:00Z", + "isTrending": false, + "access": { + "actionCount": 0, + "actorCount": 0, + "timeSpentInSeconds": 0 + }, + "incompleteData": { + "wasThrottled": false, + "resultsPending": false, + "notSupported": false + } +} +``` +
    + +### Get Pages Of a Site + +This operation retrieves all pages from a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get Pages +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/pages", + "@odata.nextLink": "https://graph.microsoft.com/v1.0/sites/tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb/pages?$top=1&$skiptoken=UGFnZWQ9VFJVRSZwX0ZpbGVMZWFmUmVmPUV2ZW50UGxhbkhvbWUuYXNweCZwX0lEPTc", + "value": [ + { + "@odata.type": "#microsoft.graph.sitePage", + "@odata.etag": ""{2095ED1D-AC76-4480-BBDC-8D63EBAAE2AF},6"", + "createdDateTime": "2024-10-22T13:21:33Z", + "eTag": ""{2095ED1D-AC76-4480-BBDC-8D63EBAAE2AF},6"", + "id": "2095ed1d-ac76-4480-bbdc-8d63ebaae2af", + "lastModifiedDateTime": "2024-10-22T13:21:35Z", + "name": "EventPlanHome.aspx", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/SitePages/EventPlanHome.aspx", + "title": "Home", + "pageLayout": "home", + "thumbnailWebUrl": "https://tooljetxxxx.sharepoint.com/_layouts/15/getpreview.ashx?guidSite=887cb371-e930-4e5b-a726-8d5769e6b946&guidWeb=6d653d09-1613-4663-99ab-1bb72ff6ceeb&guidFile=bb423735-7402-47df-ab2e-729bddfe6f23", + "promotionKind": "page", + "showComments": false, + "showRecommendedPages": false, + "contentType": { + "id": "0x0101009D1CB255DA76424F860D91F20E6C4118004CC245E37669F3438CDDEB01FCEAE890", + "name": "Site Page" + }, + "createdBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "lastModifiedBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "parentReference": { + "siteId": "887cb371-e930-4e5b-a726-8d5769e6b946" + }, + "publishingState": { + "level": "published", + "versionId": "1.0" + }, + "reactions": {} + } + ] +} +``` +
    + +### Get All Lists + +This operation retrieves all lists from a specific site. + +#### Required Parameters +- **Site ID**: The ID of the site + +#### Optional Parameters +- **Page**: The page number to retrieve + +
    + Get All Lists +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Page: 1 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists", + "value": [ + { + "@odata.etag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "createdDateTime": "2024-10-24T11:11:10Z", + "description": "", + "eTag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "id": "1a64ae23-9cb6-4521-b489-61d558dde9f7", + "lastModifiedDateTime": "2024-10-24T11:11:17Z", + "name": "Test_table_query", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query", + "displayName": "Test_table_query", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + } + } + ] +} +``` +
    + +### Get Metadata Of a List + +This operation retrieves metadata for a specific list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List Name**: The name of the list, only used if List ID is not provided +- **List ID**: The ID of the list, required if List Name is not provided + +
    + Get List Metadata +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists/$entity", + "@odata.etag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "createdDateTime": "2024-10-24T11:11:10Z", + "description": "", + "eTag": ""1a64ae23-9cb6-4521-b489-61d558dde9f7,11"", + "id": "1a64ae23-9cb6-4521-b489-61d558dde9f7", + "lastModifiedDateTime": "2024-11-05T10:27:04Z", + "name": "Test_table_query", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query", + "displayName": "Test_table_query", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + }, + "columns@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/columns", + "columns": [ + { + "columnGroup": "Custom Columns", + "description": "", + "displayName": "USER_NAME", + "enforceUniqueValues": false, + "hidden": false, + "id": "fa564e0f-0c70-4ab9-b863-0177e6ddd247", + "indexed": false, + "name": "Title", + "readOnly": false, + "required": false, + "text": { + "allowMultipleLines": false, + "appendChangesToExistingText": false, + "linesForEditing": 0, + "maxLength": 255 + } + } + ], + "items@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items", + "items": [ + { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "createdDateTime": "2024-10-24T11:11:11Z", + "eTag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "id": "1", + "lastModifiedDateTime": "2024-10-24T11:11:11Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/1_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('1')/fields/$entity", + "fields": { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "Title": "Null_test", + "id": "1", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Null_test", + "LinkTitle": "Null_test", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "" + } + } + ] +} +``` +
    + +### Create a List + +This operation creates a new list in a Sharepoint site. + +#### Required Parameters +- **Site ID**: The ID of the site +- **Body**: The list configuration in JSON format + +
    + Create List +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +Body: +{ + "displayName": "Project Tasks", + "columns": [ + { + "name": "TaskName", + "text": { } + }, + { + "name": "DueDate", + "dateTime": { } + }, + { + "name": "Priority", + "choice": { + "choices": ["High", "Medium", "Low"] + } + } + ], + "list": { + "template": "genericList" + } +} +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists/$entity", + "@odata.etag": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b,10", + "createdDateTime": "2024-11-05T10:48:51Z", + "description": "", + "eTag": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b,10", + "id": "f7497bc1-a8e6-49d0-a11c-05b3df1d8d2b", + "lastModifiedDateTime": "2024-11-05T10:48:52Z", + "name": "Project Tasks", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Project%20Tasks", + "displayName": "Project Tasks", + "createdBy": { + "user": { + "displayName": "Oliver Smith", + "email": "oliver@tooljetxxxx.onmicrosoft.com" + } + }, + "parentReference": { + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "list": { + "contentTypesEnabled": false, + "hidden": false, + "template": "genericList" + } +} +``` +
    + +### Get Items Of a List + +This operation retrieves items from a specific list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list + +#### Optional Parameters +- **Top**: The number of sites to retrieve +- **Page**: The page number to retrieve + +
    + Get List Items +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Top: 1 +Page: 1 +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items(fields())", + "@odata.nextLink": "https://graph.microsoft.com/v1.0/sites/tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb/lists/1a64ae23-9cb6-4521-b489-61d558dde9f7/items?$expand=fields&$top=1&$skiptoken=UGFnZWQ9VFJVRSZwX0lEPTE", + "value": [ + { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "createdDateTime": "2024-10-24T11:11:11Z", + "eTag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "id": "1", + "lastModifiedDateTime": "2024-10-24T11:11:11Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/1_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('1')/fields/$entity", + "fields": { + "@odata.etag": ""12b493eb-2452-451b-84e5-ecba8ec898c8,1"", + "Title": "Null_test", + "field_2": 10, + "field_3": 123.32, + "field_4": 1, + "id": "1", + "ContentType": "Item", + "Modified": "2024-10-24T11:11:11Z", + "Created": "2024-10-24T11:11:11Z", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Null_test", + "LinkTitle": "Null_test", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "" + } + } + ] +} +``` +
    + +### Update Item Of a List + +This operation updates an existing item in a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Item ID**: The ID of the item to update +- **Body**: The updated values in JSON format + +
    + Update Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb +List ID: 1a64ae23-9cb6-4521-b489-61d558dde9f7 +Item ID: 1 +Body: +{ + "TaskName": "Update Documentation", + "Priority": "Medium", + "DueDate": "2023-11-15T00:00:00Z" +} +``` + +
    +**Response Example** + +```json +{ + "id": "1", + "fields": { + "TaskName": "Update Documentation", + "Priority": "Medium", + "DueDate": "2023-11-15T00:00:00Z" + } +} +``` +
    + +### Delete Item Of a List + +This operation removes an item from a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Item ID**: The ID of the item to delete + +
    + Delete Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,da60e844-ba1d-49bc-b4d4-d5e36bae9019 +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Item ID: 1 +``` + +
    +**Response Example** + +```json +{ + "code": 204, + "status": "No Content", + "message": "Item having id '1' in List '1a64ae23-9cb6-4521-b489-61d558dde9f7' has been deleted." +} +``` +
    + +### Add Item To a List + +This operation adds a new item to a list. + +#### Required Parameters +- **Site ID**: The ID of the site +- **List ID**: The ID of the list +- **Body**: The new item's data in JSON format + +
    + Add Item +
    + +#### Example: +```yaml +Site ID: tooljetxxxx.sharepoint.com,da60e844-ba1d-49bc-b4d4-d5e36bae9019 +List ID: 22f69173-0c1d-4c76-a721-5a31f0bd5af3 +Body: +{ + "fields": { + "Title": "Prepare Presentation" + } +} +``` + +
    +**Response Example** + +```json +{ + "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items/$entity", + "@odata.etag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "createdDateTime": "2024-11-05T11:40:52Z", + "eTag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "id": "69", + "lastModifiedDateTime": "2024-11-05T11:40:52Z", + "webUrl": "https://tooljetxxxx.sharepoint.com/sites/NewStyle/Lists/Test_table_query/69_.000", + "createdBy": { + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "lastModifiedBy": { + "application": { + "id": "0dc94ee2-9788-443c-8e67-ce714f0fe579", + "displayName": "Microsoft Graph" + }, + "user": { + "email": "oliver@tooljetxxxx.onmicrosoft.com", + "id": "90ccfd6b-17ea-402b-aa21-1a1799a547d6", + "displayName": "Oliver Smith" + } + }, + "parentReference": { + "id": "036d657d-ed69-4dcc-a669-483ce9788655", + "siteId": "tooljetxxxx.sharepoint.com,887cb371-e930-4e5b-a726-8d5769e6b946,6d653d09-1613-4663-99ab-1bb72ff6ceeb" + }, + "contentType": { + "id": "0x0100A3D887BE30452F4A9CBA7E684C523E2100098058C6B440D14786561D28914A3EDB", + "name": "Item" + }, + "fields@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('tooljetxxxx.sharepoint.com%2C887cb371-e930-4e5b-a726-8d5769e6b946%2C6d653d09-1613-4663-99ab-1bb72ff6ceeb')/lists('1a64ae23-9cb6-4521-b489-61d558dde9f7')/items('69')/fields/$entity", + "fields": { + "@odata.etag": ""95d95442-f155-45be-ae85-ef9acf1d35f9,1"", + "Title": "Prepare Presentation", + "id": "69", + "ContentType": "Item", + "Modified": "2024-11-05T11:40:52Z", + "Created": "2024-11-05T11:40:52Z", + "AuthorLookupId": "7", + "EditorLookupId": "7", + "_UIVersionString": "1.0", + "Attachments": false, + "Edit": "", + "LinkTitleNoMenu": "Prepare Presentation", + "LinkTitle": "Prepare Presentation", + "ItemChildCount": "0", + "FolderChildCount": "0", + "_ComplianceFlags": "", + "_ComplianceTag": "", + "_ComplianceTagWrittenTime": "", + "_ComplianceTagUserId": "", + "AppAuthorLookupId": "3", + "AppEditorLookupId": "3" + } +} +``` +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/supabase.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/supabase.md new file mode 100644 index 0000000000..0113b5f250 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/supabase.md @@ -0,0 +1,189 @@ +--- +id: marketplace-plugin-supabase +title: Supabase +--- + +# Supabase + +ToolJet connects to your Supabase database, allowing you to directly interact with your Supabase back-end from within your ToolJet application. + +:::info +**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 + +- To connect to Supabase you need to have the Project URL and Service Role Secret. You can find these credentials in your API Settings on the Supabase dashboard. Make sure to copy the Service Role Secret key. This key has the ability to bypass Row Level Security. + +
    + Supabase API Settings +
    + +- Establish a connection to Supabase by either clicking `+Add new Data source` on the query panel or navigating to the [Data Sources](/docs/data-sources/overview/) page from the ToolJet dashboard. + +- Enter your Project URL and Service Role Secret into their designated fields. + +- Click **Test Connection** to validate your credentials. Click **Save** to store the data source. + +
    + Supabase Install +
    + +## Querying Supabase + +- To perform queries on Supabase in ToolJet, click the **+Add** button in the [query manager](/docs/app-builder/query-panel/#query-manager) located at the bottom panel of the editor. +- Select the previously configured Supabase datasource. + +- In the Operation dropdown, select the desired operation type. ToolJet currently [supports](#supported-operations) five query types for Supabase interactions. + +- Enter the table name and other required parameters for the selected operation and click on **Run** button to run the query. + +
    + +Supabase query + +
    + +
    + +:::info +Query results can be transformed using transformations. Read our [transformations documentation](/docs/tutorial/transformations). +::: + +## Supported Operations + +You can create query for Supabase data source to perform several operations such as: + 1. **[Get Rows](#get-rows)** + 2. **[Create Row(s)](#create-rows)** + 3. **[Update Row(s)](#update-rows)** + 4. **[Delete Row(s)](#delete-rows)** + 5. **[Count Rows](#count-rows)** + +### Get Rows + + #### Required parameters: + - **Table** - Database table name. + + + + #### Optional Parameters: + - **Where** - Filter rows based on a condition. + - **Sort** - Sort rows based on a column. + - **Limit** - Limit the number of rows returned. + + +
    + Get Rows +
    + +
    +**Example Response** + +```yaml +[ + { + "id": 1, + "created_at": "2025-02-12T08:50:25.780412+00:00", + "likes": 99, + "content": "CFBR!" + }, + { + "id": 4, + "created_at": "2025-02-12T11:34:26.624735+00:00", + "likes": 108, + "content": "Saved!" + } +] +``` +
    + +### Create Row(s) + + #### Required parameters: + - **Table** - Database table name. + - **Body** - Data to be inserted into the table. It should be an array of object(s). + + + +
    + Create Rows +
    + +
    +**Example Response** + +```yaml +created: true +``` +
    + +### Update Row(s) + + #### Required parameters: + - **Table** - Database table name. + - **Columns** - Column name and value to be updated. + + + #### Optional Parameters: + - **Where** - Update rows based on a condition. If not provided, all rows will be updated. + +
    + Update Rows +
    + +
    +**Example Response** + +```yaml +[ + { + "id": 4, + "created_at": "2025-02-12T11:34:26.624735+00:00", + "likes": 50, + "content": "Saved!" + } +] +``` +
    + +### Delete Row(s) + + #### Required parameters: + - **Table** - Database table name. + - **Where** - Delete rows based on a condition. + +
    + Delete Rows +
    + +
    +**Example Response** + +```yaml +deleted: true +``` +
    + +### Count Rows + + #### Required parameters: + - **Table** - Database table name. + + + + #### Optional Parameters: + - **Where** - Filter rows based on a condition. + +
    + Count Rows +
    + +
    +**Example Response** + +```yaml +count: 2 +``` +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/textract.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/textract.md new file mode 100644 index 0000000000..32494d4141 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/textract.md @@ -0,0 +1,60 @@ +--- +id: marketplace-plugin-textract +title: Amazon Textract +--- + +ToolJet integrates with Amazon Textract to facilitate the extraction of text and data from various document types, such as scanned documents, forms, and tables. Supported document formats include PDF, JPEG/JPG, and PNG. + +## Connection + +To connect ToolJet with Amazon Textract, you will need the following credentials: +- **Access key** +- **Secret key** +- **Region** + +:::caution +- Access to the S3 bucket is dependent on the permissions granted to the IAM role added for the connection. +- Only single page documents are supported. For multi-page PDFs, consider converting them to single-page formats with online tools. +::: + +
    + +Amazon Textract Configuration + +
    + +## Supported Queries + +- **[Analyze Document](#analyze-document)** +- **[Analyze document stored in AWS S3](#analyze-document-stored-in-aws-s3)** + +:::info +The data returned by the queries is in **JSON** format and may include additional information such as confidence scores and the location of the extracted content within the original document. +::: + +### Analyze Document + +This operation lets you analyze the document using the document data in **base64** format. + +#### Required Parameters: + +- **Document**: Supply the document data in base64 format. File Picker component can be used here to pick the document from the local system and retrieve the base64 data dynamically using exposed variables. Example: `{{components.filepicker1.file[0].base64Data}}`. +- **Data Output**: Choose the desired data output types for the document analysis. Options include: + 1. **Forms**: Extract key and value pairs from forms. + 2. **Tables**: Extract data from tables, including headers and cell content. + 3. **Queries**: Extract data from databases and other structured sources. + 4. **Signature Detection**: Identify and extract signatures. + +### Analyze Document Stored in AWS S3 + +This operation let's you analyze the document stored in your AWS S3 buckets by providing the **bucket** and **object** name. + +#### Required Parameters: + +- **Bucket**: Specify the S3 bucket containing the document. +- **Key**: Provide the name of the document (object) to be analyzed. +- **Data Output**: Select one or more type of data output of the document. Options include: + 1. **Forms**: Extract key and value pairs from forms. + 2. **Tables**: Extract data from tables, including headers and cell content. + 3. **Queries**: Extract data from databases and other structured sources. + 4. **Signature Detection**: Identify and extract signatures. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/weaviate.md b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/weaviate.md new file mode 100644 index 0000000000..893515a551 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/marketplace/plugins/weaviate.md @@ -0,0 +1,523 @@ +--- +id: marketplace-plugin-weaviate +title: Weaviate +--- + +Weaviate is a vector database, integrating Weaviate with ToolJet enables efficient vector search and semantic querying, allowing applications to retrieve relevant information based on meaning rather than exact keywords. This integration is ideal for building AI-powered search engines, recommendation systems, and knowledge retrieval applications that enhance user experience with context-aware results. + +## Connections + +### Cloud + +To connect with Weaviate Cloud, you will need the **Instance URL** and the **API Key**, which can be generated from **[Weaviate Console](https://weaviate.io/developers/wcs/connect)**. + +Weaviate Configuration + +### Local + +To connect ToolJet with Weaviate Local, you will need the **Host** and the **Port**. + +Run the following Docker command to start the container locally. This will set the host to `localhost` and port to `8080`. + +```yaml +docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:1.28.4 +``` + +Weaviate Configuration + +## Supported Operations + +## Data Type - Schema + +### Get Database Schema + +Run this opetation to get the database schema. + +**Optional Patameter** + +- **Consistency**: Ensures the request is handled by the leader node to maintain accuracy. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "classes": [ + { + "class": "Createcollection", + "description": "Test collection create", + "invertedIndexConfig": { + "bm25": { + "b": 0.75, + "k1": 1.2 + }, + "cleanupIntervalSeconds": 300, + "indexNullState": true, + "indexPropertyLength": true, + "indexTimestamps": true, + "stopwords": { + "additions": [ + "custom1" + ], + "preset": "en", + "removals": [ + "the" + ] + } + }, + "moduleConfig": { + "text2vec-contextionary": { + "vectorizeClassName": true + } + }, + "multiTenancyConfig": { + "autoTenantActivation": false, + "autoTenantCreation": false, + "enabled": false + }, + "properties": [ + { + "dataType": [ + "text" + ], + "description": "Main text field", + "indexFilterable": true, + "indexRangeFilters": false, + "indexSearchable": true, + "name": "content", + "tokenization": "word" + } + ], + "replicationConfig": { + "asyncEnabled": true, + "deletionStrategy": "NoAutomatedResolution", + "factor": 1 + }, + "shardingConfig": { + "virtualPerPhysical": 128, + "desiredCount": 1, + "actualCount": 1, + "desiredVirtualCount": 128, + "actualVirtualCount": 128, + "key": "_id", + "strategy": "hash", + "function": "murmur3" + }, + "vectorIndexConfig": { + "skip": false, + "cleanupIntervalSeconds": 300, + "maxConnections": 64, + "efConstruction": 128, + "ef": -1, + "dynamicEfMin": 100, + "dynamicEfMax": 500, + "dynamicEfFactor": 8, + "vectorCacheMaxObjects": 1000000000000, + "flatSearchCutoff": 40000, + "distance": "cosine", + "pq": { + "enabled": false, + "bitCompression": false, + "segments": 0, + "centroids": 256, + "trainingLimit": 100000, + "encoder": { + "type": "kmeans", + "distribution": "log-normal" + } + }, + "bq": { + "enabled": false + }, + "sq": { + "enabled": false, + "trainingLimit": 100000, + "rescoreLimit": 20 + }, + "filterStrategy": "sweeping" + }, + "vectorIndexType": "hnsw", + "vectorizer": "none" + } + ] +} +``` + +
    + +## Data Type - Collection + +### Get Collection + +**Required Parameter** + +- **Collection Name**: Name of the desired collection to fetch details. + +**Optional Parameter** + +- **Consistency**: Ensures the request is handled by the leader node to maintain accuracy. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ +[ + { + "dataType":["text"], + "description":"Main text field", + "indexFilterable":true, + "indexRangeFilters":false, + "indexSearchable":true, + "name":"content", + "tokenization":"word" + } +], +"replicationConfig":{ + "asyncEnabled":true, + "deletionStrategy":"NoAutomatedResolution", + "factor":1 +}, +"shardingConfig":{ + "virtualPerPhysical":128, + "desiredCount":1, + "actualCount":1, + "desiredVirtualCount":128, + "actualVirtualCount":128, + "key":"_id", + "strategy":"hash", + "function":"murmur3" +}, +"vectorIndexConfig":{ + "skip":false, + "cleanupIntervalSeconds":300, + "maxConnections":64, + "efConstruction":128, + "ef":-1, + "dynamicEfMin":100, + "dynamicEfMax":500, + "dynamicEfFactor":8, + "vectorCacheMaxObjects":1000000000000, + "flatSearchCutoff":40000, + "distance":"cosine", + "pq":{ + "enabled":false, + "bitCompression":false, + "segments":0, + "centroids":256, + "trainingLimit":100000, + "encoder":{ + "type":"kmeans", + "distribution":"log-normal" + } + }, + "bq":{ + "enabled":false + }, + "sq":{ + "enabled":false, + "trainingLimit":100000, + "rescoreLimit":20 + }, + "filterStrategy":"sweeping" +}, +"vectorIndexType":"hnsw", +"vectorizer":"none" +} +``` + +
    + +### Create Collection + +Use this operation to create a new collection. + +**Required Parameters** + +- **Collection Name**: The name of the collection. +- **Vectorizer**: Vectorizer to use for data objects added to this collection. +- **Vector index config**: Vector index type specific settings, including distance metric. +- **Module config**: Module-specific settings. +- **Description**: A description for your reference. +- **Properties**: An array of the properties you are adding, same as a Property Object. + +**Required Parameters** + +- **Consistency**: Ensures the request is handled by the leader node to maintain accuracy. +- **Sharding config**: Controls behavior of the collection in a multi-node setting. +- **Stop words**: Controls which words should be ignored in the inverted index. +- **Index time stamps**: Maintains inverted indexes for each object by its internal timestamps. +- **Index null state**: Maintains inverted indexes for each property regarding its null state. +- **Index property length**: Maintains inverted indexes for each property by its length. +- **Bm 25**: Search ranking method that boosts result accuracy using adjustable k1 and b values. By default, k1 = 1.2 and b = 0.75. +- **Factor**: Controls replication or sharding behavior for scaling. +- **Async enabled**: Runs operations in the background for better performance. +- **Deletion strategy**: Defines how deleted data is handled (e.g., immediate or delayed). +- **Cleanup interval seconds**: Sets how often old or deleted data is removed. + +Refer to **[weaviate documentation](https://weaviate.io/developers/weaviate/config-refs/schema)** for more information. + +Weaviate Configuration + +
    +**Response Example** + +```json + +{ + "class":"Newcollection", + "description":"Test collection create", + "invertedIndexConfig":{ + "bm25":{ + "b":0.75, + "k1":1.2 + }, + "cleanupIntervalSeconds":300, + "indexNullState":true, + "indexPropertyLength":true, + "indexTimestamps":true, + "stopwords":{ + "additions":[ + "custom1" + ], + "preset":"en", + "removals":[ + "the" + ] + } + }, + "moduleConfig":{ + "text2vec-contextionary":{ + "vectorizeClassName":true + } + }, + "multiTenancyConfig":{ + "autoTenantActivation":false, + "autoTenantCreation":false, + "enabled":false + }, + "properties":[ + { + "dataType":[ + "text" + ], + "description":"Main text field", + "indexFilterable":true, + "indexRangeFilters":false, + "indexSearchable":true, + "name":"content", + "tokenization":"word" + } + ], + "replicationConfig":{ + "asyncEnabled":true, + "deletionStrategy":"NoAutomatedResolution", + "factor":1 + }, + "shardingConfig":{ + "virtualPerPhysical":128, + "desiredCount":1, + "actualCount":1, + "desiredVirtualCount":128, + "actualVirtualCount":128, + "key":"_id", + "strategy":"hash", + "function":"murmur3" + }, + "vectorIndexConfig":{ + "skip":false, + "cleanupIntervalSeconds":300, + "maxConnections":64, + "efConstruction":128, + "ef":-1, + "dynamicEfMin":100, + "dynamicEfMax":500, + "dynamicEfFactor":8, + "vectorCacheMaxObjects":1000000000000, + "flatSearchCutoff":40000, + "distance":"cosine", + "pq":{ + "enabled":false, + "bitCompression":false, + "segments":0, + "centroids":256, + "trainingLimit":100000, + "encoder":{ + "type":"kmeans", + "distribution":"log-normal" + } + }, + "bq":{ + "enabled":false + }, + "sq":{ + "enabled":false, + "trainingLimit":100000, + "rescoreLimit":20 + }, + "filterStrategy":"sweeping" + }, + "vectorIndexType":"hnsw", + "vectorizer":"none" +} +``` + +
    + +### Delete Collection + +Use this operation to delete a collection. + +**Required Parameters** + +- **Collection Name**: Collection name that needs to be deleted. + +Weaviate Configuration + +## Data Type - Objects + +### List Objects + +Use this operation to list all the objects of a collection. + +**Required Parameter** + +- **Collection Name**: Collection name to list its objects. + +**Optional Parameter** + +- **Include vectors**: Specify names of the vectors to include. +- **After**: A threshold UUID of the objects to retrieve after. +- **Offset**: The starting index of the result window. +- **Limit**: The maximum number of items to be returned per page. +- **Include**: Include additional information, such as classification infos. Allowed values include: classification, vector, interpretation. +- **Sort**: Name(s) of the property to sort by. +- **Order**: Determines sorting direction (asc or desc). +- **Tenant**: Specifies the tenant in a request targeting a multi-tenant class. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "deprecations":[], + "objects":[{ + "class":"Testcollection", + "creationTimeUnix":1739009190787, + "id":"296f9f17-628a-463a-b273-6ae369a3bb59", + "lastUpdateTimeUnix":1739009190787, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"New Sample Document" + }, + "vectorWeights":null + }, + { + "class":"Testcollection", + "creationTimeUnix":1738941448311, + "id":"550e8400-e29b-41d4-a716-446655440000", + "lastUpdateTimeUnix":1738941448311, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"Sample Document" + }, + "vectorWeights":null + }, + { + "class":"Testcollection", + "creationTimeUnix":1739008896994, + "id":"98a6628d-f07d-4f56-b64b-1b818201095c", + "lastUpdateTimeUnix":1739008896994, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"Sample Document" + }, + "vectorWeights":null + }], + "totalResults":3 +} +``` + +
    + +### Create Object + +Use this operation to create a new object within the selected collection. + +**Required Parameters** + +- **Collection Name**: Collection name to create an object inside it. +- **Properties**: An array of the properties you are adding, same as a Property Object. +- **Vector**: Enter the vector for the object. + +**Optional Parameter** + +- **Object uuid**: The UUID of the object. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "class":"Testcollection", + "creationTimeUnix":1739009190787, + "id":"296f9f17-628a-463a-b273-6ae369a3bb59", + "lastUpdateTimeUnix":1739009190787, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"New Sample Document" + }, + "vector":[0.12345,0.12345,.......,0.12345,0.12345] +} +``` + +
    + +### Get Object By Id + +Use this operation to fetch an object using it's ID. + +**Required Parameters** + +- **Collection Name**: Collection Name of the object. +- **Object ID**: Object ID to fetch the object details. + +Weaviate Configuration + +
    +**Response Example** + +```json +{ + "class":"Testcollection", + "creationTimeUnix":1738941448311, + "id":"550e8400-e29b-41d4-a716-446655440000", + "lastUpdateTimeUnix":1738941448311, + "properties":{ + "content":"This is a test document stored in Weaviate.", + "title":"Sample Document" + }, + "vectorWeights":null +} +``` + +
    + +### Delete Object By Id + +Use this operation to delete the object using it's ID. + +**Required Parameters** + +- **Collection Name**: Collection Name of the object. +- **Object ID**: Object ID of the object to be deleted. + +Weaviate Configuration diff --git a/docs/versioned_docs/version-3.0.0-LTS/project-overview/release-notes.md b/docs/versioned_docs/version-3.0.0-LTS/project-overview/release-notes.md new file mode 100644 index 0000000000..607c22168d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/project-overview/release-notes.md @@ -0,0 +1,72 @@ +--- +id: release-notes +title: Release Notes +--- + +# ToolJet 3.0 Release Notes + +This document outlines the key improvements introduced in ToolJet 3.0, a major upgrade focused on performance, scalability, and developer experience. + +## App Builder + +1. Up to 10 times faster app loading speeds +2. Smooth app development even with 1000s of components and 100s of queries +2. More intuitive experience in designing applications on the canvas with the new grid system +4. Highly configurable **[page management system](/docs/tutorial/pages)** +5. Revamped **[components](/docs/widgets/table/table-properties/)** with more styling and functionality customizations +6. Enhanced developer experience in managing queries with the **[new query manager UI](/docs/app-builder/query-panel)** +7. Improved coding experience with better code suggestions, linting, and type-casting +8. Better debugging with easy-to-understand error messages +9. Theme settings: Light/dark/auto mode at the application level + +## Platform Enhancements + +1. **[Group Sync OIDC](/docs/user-management/sso/oidc/setup)**: Easily manage user access to ToolJet applications from your Identity Provider (IDP) directly +2. **[Secrets constants](/docs/security/constants/)**: Ability to store encrypted credentials +3. **[User metadata](/docs/user-management/onboard-users/user-metadata)**: Store custom metadata with user details & access them while building applications +4. User roles: Revamped user groups with granular access control +5. **[User APIs](/docs/tooljet-api#get-all-users)**: External API for creating and managing users +6. Security fixes: Various improvements to enhance platform security + +## ToolJet Database (TJ DB) + +1. **[Custom primary key](/docs/tooljet-db/constraints/primary-key)** and **[foreign key support](/docs/tooljet-db/constraints/foreign-key)** +2. Support for more data types for advanced use cases +3. **[SQL mode](/docs/tooljet-db/querying-tooljet-db#sql-editor)** for complex querying +4. Bulk upload using CSV +5. GUI for **[complex SQL queries](/docs/tooljet-db/querying-tooljet-db#gui-mode)** like joins, aggregates, and group by + +## Integrations + +1. 15+ new integrations, including: + - AWS services (Textract, Lambda, Redshift) + - OpenAI + - Databricks + - Salesforce + - Jira + - Sharepoint + - Supabase +2. Client Credentials Grant Type + +## AI Apps + +Build AI apps using **[OpenAI](/docs/marketplace/plugins/marketplace-plugin-openai)**, and **[Portkey](/docs/marketplace/plugins/marketplace-plugin-portkey)** integrations + +## Workflows + +1. Introduction of **[loop node](/docs/workflows/nodes#loop-node)** to implement iterative processes +2. Improved error handling and debugger: Improved troubleshooting +3. Support for multiple deployment environments +4. **[Webhook triggers](/docs/workflows/workflow-triggers#webhooks)** to trigger workflows from external apps and services +5. **[Multiple result nodes](/docs/workflows/results)** for greater flexibility in defining the output + +## Migration Steps + +Ready to upgrade to ToolJet 3.0? Follow our migration guides: +- **[For Self-Hosted Users](/docs/setup/upgrade-to-v3)** +- **[For Cloud Users](/docs/setup/cloud-v3-migration)** + +This release significantly enhances ToolJet's capabilities across its platform, focusing on improved performance, expanded integrations, and smoother development experience for building complex applications. The addition of AI-powered features and the release of Workflows provide users with advanced tools for creating sophisticated, automated solutions. + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/security/audit-logs.md b/docs/versioned_docs/version-3.0.0-LTS/security/audit-logs.md new file mode 100644 index 0000000000..a8fb0e3714 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/security/audit-logs.md @@ -0,0 +1,190 @@ +--- +id: audit-logs +title: Audit Logs +--- + +
    + Icon + Paid feature +
    + +The audit log is the report of all the activities done in your ToolJet account. It will capture and display events automatically by recording who performed an activity, what when, and where the activity was performed, along with other information such as IP address. + +
    + +Audit logs + +
    + +
    + +### Date Range + +Retrieve the log of events that occurred within the specified date and time range using the range picker. By default, the system loads 24-hour logs for the initial view. The maximum duration that can be specified for the "from" and "to" dates is 30 days. + +:::info +Pagination at the bottom allows navigation through the pages, with each page displaying a maximum of 7 logs. +::: + +
    + +Audit logs + +
    + +
    + +
    + +## Filter Audit Logs + +You can apply filters to the audited events based on the following criteria. + +### Select Users + +Choose a specific user from the dropdown list to view all their activities. + +### Select Apps + +The dropdown will display all the apps associated with your account. Select an app to filter the logs related to that particular app. + +### Select Resources + +|
    Resources
    |
    Description
    | +| ----------- | ----------- | +| User | Filter all the User events like `USER_LOGIN`, `USER_SIGNUP`, `USER_INVITE`, AND `USER_INVITE_REDEEM`. | +| App | Filter all the App events like `APP_CREATE`, `APP_UPDATE`,`APP_VIEW`,`APP_DELETE`,`APP_IMPORT`,`APP_EXPORT`,`APP_CLONE`. | +| Data Query | Filters the events associated with Data Query like `DATA_QUERY_RUN`. | +| Group Permission | All the events associated with Group Permissions will be filtered. Group Permissions include `GROUP_CREATE`, `GROUP_UPDATE`, `GROUP_DELETE`. | +| App Group Permission | Within each group, you can set apps for read or edit privileges. These events get recorded as App Group Permissions. | + +### Select Actions + +|
    Actions
    |
    Description
    | +| ----------- | ----------- | +| USER_LOGIN | This event is recorded everytime a user logins. | +| USER_SIGNUP | This event is recorded everytime a new signup is made. | +| USER_INVITE | You can invite users to your account from `Manage Users` section and an event is audited everytime an invite is sent. | +| USER_INVITE_REDEEM | This event is recorded whenever an invite is redeemed. | +| APP_CREATE | This event is recorded when a user creates a new app. | +| APP_UPDATE | This event is recorded whenever actions like renaming the app, making the app public, editing shareable link, or deploying the app are made. | +| APP_VIEW | This event is logged when someone views the launched app. (public apps aren't accounted for) | +| APP_DELETE | This event is recorded whenever a user deletes an app from the dashboard. | +| APP_IMPORT | This event is recorded whenever a user imports an app. | +| APP_EXPORT | This event is recorded whenever an app is exported. | +| APP_CLONE | This event is recorded whenever a clone of the existing app is created. | +| DATA_QUERY_RUN | This event is logged whenever a data source is added, a query is created, or whenever a query is run either from the query editor or from the launched app. | +| GROUP_PERMISSION_CREATE | This event is recorded whenever a group is created. | +| GROUP_PERMISSION_UPDATE | This event is recorded whenever an app or user is added to or removed from a group, or the permissions for a group are updated. | +| GROUP_PERMISSION_DELETE | This event is recorded whenever a user group is deleted from an account. | +| APP_GROUP_PERMISSION_UPDATE | For every app added in to user group, you can set privileges like `View` or `Edit` and whenever these privileges are updated this event is recorded. By default, the permission of an app for a user group is set to `View`. | + +
    + +
    + +## Understanding Log Information + +
    + +Audit logs + +
    + +|
    Property
    |
    Description
    | +| ----------- | ----------- | +| action_type | This indicates the type of action that was logged in the event. Refer to [this](#select-actions) for more information on actions. | +| created_at | Shows the date and time when the event was logged. | +| id | Each logged event is assigned a unique event ID. | +| ip_address | Displays the IP address from which the event was logged. | +| metadata | The metadata includes two sub-properties: `tooljet_version` and `user_agent`. `tooljet_version` shows the version of ToolJet used for the event, while `user_agent` contains information about the device and browser used. | +| organization_id | Every organization in ToolJet has a unique ID associated with it, which is recorded when an event occurs. | +| resource_id | Different [resources](#select-resources) have their respective IDs associated with them. These IDs are assigned when the resources are created. | +| resource_name | Shows the name of the [resources](#select-resources) that were involved in the logged event. For example, if an app was created or deleted, it will display the name of that app. | +| resource_type | Indicates the type of the [resources](#select-resources) involved in the logged event. | +| user_id | Each user account in ToolJet has a unique ID associated with it, which is recorded when an event occurs. | + +
    + +
    + +### Log File + +The file will contain all the data from audit logs. The log file can be created by specifying the path in the [environment variables](/docs/setup/env-vars). The log file is rotated on a daily basis and is updated dynamically every time a new audit log is generated. + +Learn more about **setting up the log file generation** [here](/docs/how-to/setup-rsyslog). + +### Log Rotation + +The log file is configured to rotate on a daily basis. This means that a new log file will be created every day, ensuring efficient management and organization of audit data. + +### Log Redaction + +ToolJet implements log redaction to protect sensitive information. By default, the following headers are masked in the logs: + +- authorization +- cookie +- set-cookie +- x-api-key +- proxy-authorization +- www-authenticate +- authentication-info +- x-forwarded-for + +Additionally, you can specify custom fields to be masked using the `LOGGER_REDACT` environment variable. + +|
    Variable
    |
    Description
    | +| -------- | --------------------------------------------------------------------------- | +| LOGGER_REDACT | Comma-separated list of additional fields to be masked in logs (e.g., req.headers["x-session-id"],req.headers["x-device-fingerprint"]) | + +For example: +```bash +LOGGER_REDACT=res.headers["x-rate-limit-remaining"],res.headers["x-request-id"] +``` + +### Log File Path + +The path for the log file is defined using the `LOG_FILE_PATH` variable in the environment. It's important to understand that this path is relative to the home directory of the machine. For instance, if `LOG_FILE_PATH` is set to `hsbc/dashboard/log`, the resulting log file path will be structured as follows: +``` +homepath/hsbc/dashboard/log/tooljet_log/{process_id}-{date}/audit.log +``` +Here, `{process_id}` is a placeholder for the unique process identifier, and `{date}` represents the current date. This structured path ensures that audit logs are organized by both process and date, facilitating easy traceability and analysis. + +|
    Variable
    |
    Description
    | +| -------- | --------------------------------------------------------------------------- | +| LOG_FILE_PATH | the path where the log file will be created ( eg: tooljet/log/tooljet-audit.log) | + +
    +Example Log file data + +```bash +{ + level: 'info', + message: 'PERFORM APP_CREATE OF awdasdawdwd APP', + timestamp: '2023-11-02 17:12:40', + auditLog: { + userId: '0ad48e21-e7a2-4597-9568-c4535aedf687', + organizationId: 'cf8e132f-a68a-4c81-a0d4-3617b79e7b17', + resourceId: 'eac02f79-b8e2-495a-bffe-82633416c829', + resourceType: 'APP', + actionType: 'APP_CREATE', + resourceName: 'awdasdawdwd', + ipAddress: '::1', + metadata: { + userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', + tooljetVersion: '2.22.2-ee2.8.3' + } + }, + label: 'APP' +} +``` + +
    + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/security/compliance.md b/docs/versioned_docs/version-3.0.0-LTS/security/compliance.md new file mode 100644 index 0000000000..d6dc34bd5b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/security/compliance.md @@ -0,0 +1,55 @@ +--- +id: compliance +title: Compliance +--- + +## Uncompromised Data Security with SOC 2 Type II Compliance + +With SOC 2 Type II compliance, ToolJet ensures the highest level of data security. The adherence to SOC 2 Type II standards mirrors the rigorous data protection measures in place, covering everything from encryption to robust access controls. It also guarantees a consistent level of service availability and process integrity, instilling confidence in our customers and stakeholders about the safe handling of their sensitive information. + +## Data Protection +We take extensive measures to protect your data. All data transmitted between users and our servers is encrypted using TLS to prevent unauthorized access during transit. Sensitive data stored on our servers is encrypted at rest, following industry-standard protocols. Access to this data is tightly controlled through role-based permissions, ensuring only authorized personnel can access sensitive information. + +We also adhere to a **GDPR-compliant data deletion policy**, ensuring that personal data is permanently removed from our servers upon user request or at the end of the data retention period. Furthermore, we maintain comprehensive audit logs to track data access and modifications for monitoring and compliance purposes. + +## Compliance and Certifications +We adhere to globally recognized standards for data security and compliance. ToolJet meets the requirements of the following certifications: + +**GDPR**: ToolJet fully complies with the General Data Protection Regulation (GDPR), ensuring your personal data is processed and stored securely. + +**SOC 2**: We undergo regular SOC 2 Type II audits to validate our commitment to maintaining high security, availability, and confidentiality standards. + +**ISO 27001**: ToolJet follows the ISO 27001 standard for information security management, ensuring a systematic approach to managing sensitive information. + +## Incident Response +We continuously monitor our systems for suspicious activities or security incidents. In the event of a security breach, we have a detailed incident response plan in place. This plan ensures immediate action is taken to contain the breach, communicate with affected parties, and implement remediation steps to prevent future incidents. + +## Secure Development Practices +We adhere to globally recognized standards for data security and compliance. ToolJet meets the requirements of the certifications below. + +We undergo regular **SOC 2 Type II audits** to validate our commitment to maintaining high standards in security, availability, and confidentiality. + +## User Responsibility +We encourage all our users to practice good security habits to enhance security further. This includes creating strong, unique passwords for ToolJet accounts and enabling two-factor authentication for added protection. Users should also keep their devices and applications updated to guard against vulnerabilities. + + +## Data Storage + +ToolJet does not store data returned from your data sources. ToolJet server acts as a proxy and passes the data as it is to the ToolJet client. The credentials for the data sources are handled by the server and never exposed to the client. For example, if you are making an API request, the query is run from the server and not from the frontend. + + +## Datasource Credentials +All the datasource credentials are securely encrypted using `aes-256-gcm`. The credentials are never exposed to the frontend ( ToolJet client ). + +## Privacy Policy +ToolJet takes privacy seriously. Our transparent privacy policies ensure customers understand how their data is collected, stored, and processed. We adhere to privacy regulations in all regions in which we operate. + +## Other Security Features +- **TLS**: If you are using ToolJet cloud, all connections are encrypted using TLS. We also have documentation for setting up TLS for self-hosted installations of ToolJet. +- **Audit logs**: Audit logs are available on the enterprise edition of ToolJet. Every user action is logged along with the IP addresses and user information. +- **Request logging**: All the requests to server are logged. If self-hosted, you can easily extend ToolJet to use your preferred logging service. ToolJet comes with built-in Sentry integration. +- **Whitelisted IPs**: If you are using ToolJet cloud, you can whitelist our IP address (34.86.81.252) so that your datasources are not exposed to the public. +- **Backups**: ToolJet cloud is hosted on AWS using EKS with autoscaling and regular backups. + +If you notice a security vulnerability, please let the team know by sending an email to [security@tooljet.com](mailto:security@tooljet.com). + diff --git a/docs/versioned_docs/version-3.0.0-LTS/security/constants/constants.md b/docs/versioned_docs/version-3.0.0-LTS/security/constants/constants.md new file mode 100644 index 0000000000..db21d12e0f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/security/constants/constants.md @@ -0,0 +1,133 @@ +--- +id: constants +title: Workspace Constants +--- + +ToolJet allows you to set workspace constants to store pre-defined values that can be used across your application to maintain consistency, facilitate easy updates, and securely store sensitive information. Workspace constants are specific to the workspace where they are created and cannot be accessed in other workspaces. To enhance security, all constants and secrets are encrypted before being stored in the database, providing an additional layer of protection for sensitive data. + +There are two types of constants: +1. **Global Constants:** These are predefined values that can be used across your applications within a workspace. They allow you to store frequently used values, such as API URLs, configuration settings, etc. and access them within the workspace. Global Constants are resolved on the client side. +2. **Secret Constants:** These are a specific type of workspace constants designed for securely storing sensitive information like API keys and database credentials. Secrets are masked and stored in encrypted format to prevent exposure to unauthorized users. Secret Constants are resolved on the server side, preventing exposure to the client.
    + **Note**: Secret Constants cannot be used in RunJS or RunPy queries. + +## Characteristics and Usage + +| Characteristic | Global Constants | Secrets | +|-------------------------|:-----------------------------:|:-------------------------:| +| Components | ✅ | ❌ | +| Data Queries * | ✅ | ✅ | +| Data Sources | ✅ | ✅ | +| Workflows | ✅ | Coming Soon | +| Encrypted in DB | ✅ | ✅ | +| Masked in Frontend | ❌ | ✅ | +| Resolved on Client Side | ✅ | ❌ | +| Resolved on Server Side | ❌ | ✅ | +| Naming Convention | `{{constants.constant_name}}` | `{{secrets.secret_name}}` | + +***Note**: +1. Secret Constants cannot be used in RunJS or RunPy queries. +2. Secret Constants can only be used as a singular key and can't be used in a composite key manner. + +## Environment Specific Configurations + +ToolJet allows users to define environment-specific configurations by assigning different values to constants and secrets across various environments. This approach is essential for managing sensitive information, such as API keys, database credentials, and external service endpoints, which may differ between development, staging, and production environments. + +For example, you can configure unique API keys for each environment to ensure seamless integration and security. + +Environment-Specific Constants + +## Creating Workspace Constants + +Workspace constants/variables permissions is needed to Create, Update or Delete workspace constants, refer to **[Access Control](/docs/user-management/role-based-access/access-control)** guide for more information. After having the required permission, follow these steps to create a workspace constant: + +1. Navigate to the Workspace Constants tab from the left sidebar in ToolJet dashboard.
    + (Example URL - `https://app.corp.com/nexus/workspace-constants`) + Environment-Specific Constants + +2. Click on **Create new constant** button to open the configuration drawer. + Create New Constant + +3. Enter a name and value for the workspace constant. + +4. Select the type of workspace constant: + - **Global constant** + - **Secret** + +5. Click the **Add constant** button to save. + +:::info +Once a constant or secret is created, its type cannot be changed. You'll need to delete it and create a new one of the desired type. +::: + +## Accessing Workspace Constants + +### Global Constants + +Global constants can be accessed using the syntax `{{constants.constant_name}}` can be used in the [app builder](#in-app-builder), data sources, data queries, and workflows. + +#### In App Builder + +Inside the App Builder, you can find all the constants inside the inspector element on the left sidebar. + +Use Global Constants Inside App Builder + +#### In Data Sources and Queries + +Global constants in ToolJet allow you to define values once and reuse them across your data sources and queries. + +- Data Source Connection Form: + Use Global Constants Data Source Connection Form + +- Inside Queries in Query Manager: + Use Global Constants Inside Queries in Query Manager + +### Using Secrets + +Secrets are designed for secure storage of sensitive information like API keys, database credentials, and can be access using the syntax `{{secrets.secret_name}}`. + +#### In Data Sources and Queries + +In Data Sources and Queries, secret values are masked in the frontend and can only be viewed in the Workspace Constants dashboard. + +- Data Source Connection Form: + Use Secrets in Data Source Connection Form + +- Inside Queries in Query Manager: + Use Secrets Inside Queries in Query Manager + +## Mapping Workspace Constants from Environment Variables + +From version **`v3.5.8-ee-lts`**, you can use environment variables to set global and secret constants. Workspace constants set using environment variables will have a `.env` tag in front of them. If there are two constants with the same name, the one set through the environment variable will be used in the app builder, while the constant set through the UI will have a `duplicate` tag in front of it. + +Users cannot edit or delete constants created from environment variables through the UI. To add, update, or delete any values from an environment variable, the container must be restarted. + +Mapping Workspace Constants from Environment Variables + +### Setting Global Constants + +**Setting Individual Global Constant** + +Syntax - `TOOLJET_GLOBAL_CONSTANTS____constant_name` + +Example - TOOLJET_GLOBAL_CONSTANTS__development__companyName = "Corp Pvt. Ltd." + +**Setting Multiple Global Constants** + +Syntax - `TOOLJET_GLOBAL_CONSTANTS__ = {“name1”: “value1", “name2”: “value2"}` + +Example - TOOLJET_GLOBAL_CONSTANTS__development = `{"company1": "corp.com", "company2": "example.com"}` + + +### Setting Secret Constants + +**Setting Individual Global Constant** + +Syntax - `TOOLJET_SECRET_CONSTANTS____constant_name` + +Example - TOOLJET_SECRET_CONSTANTS__development__apiKey = "agdagdagdg" + +**Setting Multiple Global Constants** + +Syntax - `TOOLJET_SECRET_CONSTANTS__ = {“name1”: “value1", “name2”: “value2"}` + +Example - TOOLJET_SECRET_CONSTANTS__development = `{"api_url": "https://api.example.com", "password" : "12345", "key" : "agdagdagdg"}` diff --git a/docs/versioned_docs/version-3.0.0-LTS/security/constants/variables.md b/docs/versioned_docs/version-3.0.0-LTS/security/constants/variables.md new file mode 100644 index 0000000000..475ca58f2c --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/security/constants/variables.md @@ -0,0 +1,40 @@ +--- +id: variables +title: Workspace Variables Migration +--- + +
    Deprecated
    +

    + +Workspace variables were used in ToolJet to store values such as tokens, secret keys, API keys, etc. But currently **Workspace variables are marked as deprecated, indicating that it will be removed in future releases**. In the current version, you are still able to delete existing variables and use it through out any ToolJet apps, but creating and updating variables are no longer supported. + +Please use **[Workspace Constants](/docs/security/constants/)** instead. This guide will help you migrate from **Workspace Variables** to **Workspace Constants**. + +## Workspace Constants + +Workspace Constants are predefined values that enhance consistency, simplify updates, and securely store sensitive information across applications within a workspace. Unlike other variables, they are resolved exclusively on the server side, ensuring a high level of security by preventing client-side exposure. Refer to **[Workspace Constants](/docs/security/constants/)** guide for more information. + +## Migrating from Workspace Variables to Workspace Constants + +To migrate from Workspace Variables to Workspace Constants, you need to create new constants and store each value, follow the steps in **[Creating Workspace Constants](/docs/security/constants/#creating-workspace-constants)** guide. + +Once you have migrated all the Workspace Variables to Workspace Constants, you can replace the Workspace Variables in your apps with their corresponding Workspace Constants. + +### Replacing Workspace Variables with Workspace Constants + +- Navigate to the app or data source where you want to replace the Workspace Variables. +- Replace the Workspace Variables with their corresponding Workspace Constants.
    + For example, if you have a Client Workspace Variable like `%%client.pi%%`, replace it with `{{constants.pi}}`.
    + Workspace constants + + Workspace constants + +### Deleting Workspace Variables + +After migrating all Workspace Variables to Workspace Constants and thoroughly testing your applications, you can delete the Workspace Variables. To remove a Workspace Variable, follow these steps: + +1. Navigate to the Workspace Variables tab in the Workspace Settings.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-variables`) + +2. Click on the delete icon next to the Workspace Variable you want to delete. + Workspace constants \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/setup/_category_.json new file mode 100644 index 0000000000..1211453a23 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Setup", + "position": 2, + "collapsed": true +} diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/azure-container.md b/docs/versioned_docs/version-3.0.0-LTS/setup/azure-container.md new file mode 100644 index 0000000000..b3d30f9193 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/azure-container.md @@ -0,0 +1,101 @@ +--- +id: azure-container +title: Azure container apps +--- + +# Deploying ToolJet on Azure container apps + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai. +::: + +:::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-service setup, it's recommended to use an external Redis instance. +::: + +## Deploying ToolJet application + +1. Open the Azure dashboard at https://portal.azure.com, navigate to Container Apps, and click on "Create container app". +
    + + Deploying ToolJet on Azure container apps + +
    + +2. Select the appropriate subscription and provide basic details such as the container name. +
    + + Deploying ToolJet on Azure container apps + +
    + +3. In the container tab, uncheck the "Use quickstart image" option to select the image source manually. +
    + + Deploying ToolJet on Azure container apps + +
    + + - Make sure to provide the image tag, and then enter `server/entrypoint.sh, npm, run, start:prod` in the "Arguments override" field. + - Add the following ToolJet application variables under the "Environmental variable" section. You can refer to this [**documentation**](/docs/setup/env-vars) for more information on environment variables. + + **Note**: ToolJet requires: + - **TOOLJET_DB** + - **TOOLJET_DB_HOST** + - **TOOLJET_DB_USER** + - **TOOLJET_DB_PASS** + - **PG_HOST** + - **PG_DB** + - **PG_USER** + - **PG_PASS** + - **SECRET_KEY_BASE** + - **LOCKBOX_KEY** + + If using Azure Database for Postgresql-Flexible server, add: + - **PGSSLMODE = require** + +
    + + Deploying ToolJet on Azure container apps + +
    + +4. 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 + +
    + +5. Click on "Review + create" and wait for the template to be verified and passed, as shown in the screenshot below. +
    + + Deploying ToolJet on Azure container apps + +
    + + +6. Once the container is deployed, you can verify its status under revision management. +
    + + Deploying ToolJet on Azure container apps + +
    + +You can access ToolJet via the application URL provided in the overview tab. + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/choose-your-tooljet.md b/docs/versioned_docs/version-3.0.0-LTS/setup/choose-your-tooljet.md new file mode 100644 index 0000000000..beefb5fea2 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/choose-your-tooljet.md @@ -0,0 +1,61 @@ +--- +id: choose-your-tooljet +title: Deployment Version +--- + +ToolJet versions are categorized into three main types: **Long-Term Support (LTS)**, **Pre-Release**, and **Past versions**. Understanding these categories helps users choose the most suitable version for their needs. + +## Long-Term Support (LTS) Versions + +We highly recommend using LTS versions for most users. These versions are prioritized for bug fixes, updates, and overall stability, ensuring a reliable experience. LTS versions are ideal for production environments where stability and consistent performance are crucial. + +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 +Starting from **`v3.5.0-ee-lts`** all releases are AI releases. 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://tooljet.ai/slack) or send us an email at hello@tooljet.com. +::: + +| Version | Release Date | Docker Pull Command | +|---------|--------------|----------------------| +| Latest EE-LTS | N/A | `docker pull tooljet/tooljet:ee-lts-latest` | +| [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` | +| [v3.0.21-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.21-ee-lts/images/sha256-88de45e3e32df48c7451a9f6ae505f985ca7a32d2b59c3a4ba9f9da992e8cafe?context=explore) | December 20, 2024 | `docker pull tooljet/tooljet:v3.0.21-ee-lts` | +| [v3.0.20-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.20-ee-lts/images/sha256-898f75a8c6a879014b890a47fa8fd6d2be41ea7f77d549bc2616e0db84788fd2?context=explore) | December 20, 2024 | `docker pull tooljet/tooljet:v3.0.20-ee-lts` | +| [v3.0.19-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.19-ee-lts/images/sha256-eb873525f3fe3a5838fcf72d38d1b9d4ffcb661f59e9af4c466f0041de882a0e?context=explore) | December 17, 2024 | `docker pull tooljet/tooljet:v3.0.19-ee-lts` | +| [v3.0.18-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.18-ee-lts/images/sha256-89e309a8a3a40c967e3bddfbb82adff9332d6b72322cf5ad40f575c03bf7dab1?context=explore) | December 12, 2024 | `docker pull tooljet/tooljet:v3.0.18-ee-lts` | +| [v3.0.17-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.17-ee-lts/images/sha256-0777d52d83a93b3729f8a9b1e6e63a66e9e7bef913adad5eda655a9a009540e0?context=explore) | December 9, 2024 | `docker pull tooljet/tooljet:v3.0.17-ee-lts` | +| [v3.0.16-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.16-ee-lts/images/sha256-9602149f5538af46288f6a33c9c239c336444781ee308c8866d3dca3a747660f?context=explore) | December 9, 2024 | `docker pull tooljet/tooljet:v3.0.16-ee-lts` | +| [v3.0.15-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.15-ee-lts/images/sha256-1fc16533d34695715debb1f3394b18a18431342c1b0d82ff168c5e936cff5d2e?context=explore) | December 5, 2024 | `docker pull tooljet/tooljet:v3.0.15-ee-lts` | +| [v3.0.14-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.14-ee-lts/images/sha256-aa12b3de3d09e4c1122050ee2dd0550152d7d7777d4f75953f4e9d55d652aa2f?context=explore) | December 3, 2024 | `docker pull tooljet/tooljet:v3.0.14-ee-lts` | +| [v3.0.13-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.13-ee-lts/images/sha256-1e469017cb03245eb1ad457219ac60a293d0f9e1b365d0dabf77cf4272cabe58?context=explore) | December 2, 2024 | `docker pull tooljet/tooljet:v3.0.13-ee-lts` | +| [v3.0.12-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.12-ee-lts/images/sha256-7c0aec97e1d630c827d42b21fb9aee853730ea72026f4c89630b6f2f6ce4bca5?context=explore) | November 29, 2024 | `docker pull tooljet/tooljet:v3.0.12-ee-lts` | +| [v3.0.11-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.11-ee-lts/images/sha256-2c102a11d7f497804586368e2e1f350ee386551c7ab5063b298aa68c9c5853dd?context=explore) | November 29, 2024 | `docker pull tooljet/tooljet:v3.0.11-ee-lts` | +| [v3.0.10-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.10-ee-lts/images/sha256-4839e8f18427b47859287c76058a0964d029eeaf8f4c4825c7d77fdb371eb857?context=explore) | November 28, 2024 | `docker pull tooljet/tooljet:v3.0.10-ee-lts` | +| [v3.0.9-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.9-ee-lts/images/sha256-bec9665a3ef51acbf8e93c5ebc47227dc4fd6cb8084d4ad811a808a46edb743d?context=explore) | November 27, 2024 | `docker pull tooljet/tooljet:v3.0.9-ee-lts` | +| [v3.0.8-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.8-ee-lts/images/sha256-8b4658e7d5c8f795b55d4187cc6acddabb9463e33bb62624d0ce3710c887ef0c?context=explore) | November 27, 2024 | `docker pull tooljet/tooljet:v3.0.8-ee-lts` | +| [v3.0.7-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.7-ee-lts/images/sha256-4e5e2b52279a127a001c1c7e93893794799fe8cdb40b15203220d030d4c415ce?context=explore) | November 26, 2024 | `docker pull tooljet/tooljet:v3.0.7-ee-lts` | +| [v3.0.6-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.6-ee-lts/images/sha256-52632c7d70f6334c84d7e3945bf118a4a627eb0081f29420eb3af7788e53f989?context=explore) | November 26, 2024 | `docker pull tooljet/tooljet:v3.0.6-ee-lts` | +| [v3.0.5-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.5-ee-lts/images/sha256-daa03ea3ef9a6a94032476fae0f57f6828869863690346fa325a5937746fe5f6?context=explore) | November 25, 2024 | `docker pull tooljet/tooljet:v3.0.5-ee-lts` | +| [v3.0.4-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.4-ee-lts/images/sha256-7dc2041bdb98674f1058381fbbc93d167ba1a66238e642c6f0cb599987a87ec1?context=explore) | November 20, 2024 | `docker pull tooljet/tooljet:v3.0.4-ee-lts` | +| [v3.0.3-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.3-ee-lts/images/sha256-ba3596677cfb885a91197c1187191afb6eabd7dd8f7f6fdb20514ce716182f8f?context=explore) | November 18, 2024 | `docker pull tooljet/tooljet:v3.0.3-ee-lts` | +| [v3.0.2-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.2-ee-lts/images/sha256-6cb558e5e3337c7fc1b9ffc830ce7096f19253ff5f2fad177afdb46fb0b0ea9d?context=explore) | November 13, 2024 | `docker pull tooljet/tooljet:v3.0.2-ee-lts` | +| [v3.0.1-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.1-ee-lts/images/sha256-b4f2e0779f76db07606ddd8a688cb7e06824837be3f507026ff91bb235efcc1d?context=explore) | November 12, 2024 | `docker pull tooljet/tooljet:v3.0.1-ee-lts` | +| [v3.0.0-ee-lts](https://hub.docker.com/layers/tooljet/tooljet/v3.0.0-ee-lts/images/sha256-989f1370c502e97555dd7e669f896ef6ba2ad1d4f317c53335105bf937b5b189?context=explore) | November 12, 2024 | `docker pull tooljet/tooljet:v3.0.0-ee-lts` | + +:::info +Users are encouraged to upgrade to the latest LTS version to ensure they benefit from the latest improvements and maintain a secure and efficient environment. +::: + +## Pre-Release Versions + +Pre-Release versions are designed for those looking to explore the latest features and advancements in ToolJet. These versions are experimental and may include new functionalities not yet available in LTS versions. However, due to their experimental nature, they may also contain bugs and lack the stability of LTS versions. Therefore, we advise against using Pre-Release versions in production environments. + +*All versions starting from **3.1.x.x** are considered Pre-Release versions.* + +## Past versions (Not maintained anymore) + +Past versions of ToolJet are those that are no longer actively maintained or supported. These versions may still be available but are not recommended, especially in production environments, as they do not receive updates, bug fixes, or security patches. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/cloud-v3-migration.md b/docs/versioned_docs/version-3.0.0-LTS/setup/cloud-v3-migration.md new file mode 100644 index 0000000000..1b20da7f3a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/cloud-v3-migration.md @@ -0,0 +1,208 @@ +--- +id: cloud-v3-migration +title: ToolJet 3.0 Cloud Migration Guide +--- + +# ToolJet 3.0 Cloud Migration Guide + +ToolJet Cloud will be upgraded to 3.0 on November 11th, 2024. This update includes breaking changes that may affect your applications. Please review and update your applications before November 11th to ensure they continue working after the upgrade. + +:::warning Important + +You must make these changes before November 11th to prevent disruption to your applications. The upgrade will happen automatically and cannot be postponed. + +::: + +## Dynamic Input Restrictions + +You can no longer dynamically change references to component names. + +### Action Required +- Review your applications for any dynamic component name references and refactor as necessary +- Replace all dynamic component references with static references +- Test all component interactions after making these changes + +### Examples and Details + +The following patterns are no longer supported: + +1. Using variables to construct component names: + ```javascript + // This will no longer work + {{components[variables.componentNameVariable].value}} + ``` + +2. Dynamically referencing components: + ```javascript + // This is not supported + {{components['textinput' + components.tabs1.currentTab].value}} + ``` + +3. Dynamically accessing nested properties: + ```javascript + // This dynamic property access is not allowed + {{components.table1[components.textinput1.value]}} + ``` + +Instead, use static references to components: + +```javascript +{{components.textinput1.value}} +{{components.table1.selectedRow}} +{{queries.query1.data}} +``` + +## Component and Query Naming + +:::note +This is only an issue during the upgrade process. Once your application is running on ToolJet 3.0, you can use identical names for components and queries without any problems. +::: + +### Action Required +- Review your applications for any instances where queries and components share the same name +- Temporarily rename either the component or the query to ensure unique names +- Document all renamed components/queries for potential post-upgrade reversion +- Test affected components and queries after renaming + +### Details and Examples + +When upgrading, if a component is referencing a query with the same name, the upgrade process may break that mapping. This occurs because ToolJet previously used a global ID-to-name map for both components and queries, which is now split in 3.0. + +Example scenario: If a table component named `userData` is referencing a query also named `userData`, this reference may break during the upgrade process. + +## Property Panel Logic + +### Action Required +- Review all property panel variable checks +- Update any existing variable existence checks to use the new recommended format +- Remove any instances of unsupported logic patterns +- Test all components using variable checks after updates + +### New Variable Access Rules + +There are changes to how you can access and check for the existence of variables in the property panel: + +- For components, queries, and page variables, a minimum of two keys must be available after the `component/query/page` keyword +- For variables, a minimum of one key should be present after the `variables` keyword + +```javascript +// Supported formats +components.textinput1.value +components?.textinput1?.value +components["textinput1"].value +queries.restapi1.data +page.variables.name +variables["name"] +variables.name + +// No longer supported +{{'name' in variables}} +{{Object.keys(variables).includes('name')}} +{{variables.hasOwnProperty('name')}} + +// Recommended approach for checking existence +{{variables['name'] ?? false}} +``` + +:::caution +These changes may affect how your application interacts with variables and components. Be sure to test thoroughly after making these updates. +::: + +## Multi-Page Component Names + +### Action Required +- Review multi-page applications for components with identical names +- Either rename components to ensure uniqueness across pages +- Or modify queries to use query parameters instead of direct references +- Document all component name changes +- Test affected pages and their interactions after making changes + +### Current Limitations and Details + +When the same component name exists on multiple pages and is linked to queries, the query will only work correctly on the page where the component was originally associated with it. + +Example scenario: +1. You have `page1` and `page2`, each containing a component named `textinput1` +2. You create a query in `page1` that is linked to `textinput1` +3. The query will only function properly on `page1` +4. When you switch to `page2`, the query will not work as expected, even though there's a component with the same name + +:::tip +When building multi-page applications, it's recommended to use unique component names across all pages to avoid any potential issues with query bindings. +::: + +Future resolution: We will be adding functionality to enforce unique component names across all pages in upcoming releases. + +## Removal of Deprecated Features + +### Kanban Board + +The old deprecated **Kanban Board** component will cease functioning entirely. Applications using this component will crash after the upgrade if not updated. +
    +ToolJet - Widget Reference - Kanban widget +
    + +#### Required Actions + +1. Immediately identify all instances of the old **Kanban Board** component in your applications +2. Create new boards using the new **Kanban** component. +3. Transfer your data and configuration to the new component +4. Remove the old Kanban Board components +5. Update any queries or workflows that were connected to the old boards +6. Test thoroughly to ensure all functionality is preserved + +:::caution +After November 11th, applications with the old Kanban Board component will crash and become unusable. +::: + +### Local Data Sources + +#### Action Required +- Identify all local data sources in your applications +- Migrate them to global workspace data sources +- Update all queries and components using these data sources +- Test all affected components and queries after migration + +#### Action Required After Upgrade + +If you haven't migrated your local data sources to global data sources, you will encounter an error message indicating that local data sources are no longer supported. For detailed instructions on migrating from Local Data Sources to the new Data Sources, please refer to our [Local Data Sources Migration Guide](/docs/data-sources/local-data-sources-migration). + +### Workspace Variables + +#### Action Required +- Identify all uses of Workspace Variables +- Replace them with Workspace Constants +- Update all components and queries using these variables +- Configure appropriate role-based access for the new constants +- Test all affected functionality after migration + +Workspace Constants are designed to be resolved on the server-side only, ensuring a high level of security. You can assign users to a specific role and provide create, update, and delete access to Workspace Constants. + +For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](/docs/security/constants/variables). + + +## Response Headers and Metadata + +#### Action Required +- Identify all instances where response headers are being accessed +- Update the code to use the new metadata format +- Test all affected queries and components after migration + +We've introduced a capability to expose additional information through metadata for all datasources. Previously, this was only available for REST API and GraphQL data sources. + +Before, you could access response headers like this: +```javascript +{{queries..responseHeaders}} +``` + +Now, you should use: +```javascript +{{queries..metadata}} +``` + +The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/data-sources/restapi/metadata-and-cookies/#metadata). + +## Help and Support + +- Feel free to join our [Slack Community](https://tooljet.com/slack) or you can also e-mail us at hello@tooljet.com. +- If you have found a bug, please create a [GitHub issue](https://github.com/ToolJet/ToolJet/issues) for the same. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/digitalocean.md b/docs/versioned_docs/version-3.0.0-LTS/setup/digitalocean.md new file mode 100644 index 0000000000..dd9d4c690d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/digitalocean.md @@ -0,0 +1,91 @@ +--- +id: digitalocean +title: DigitalOcean +--- + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai. +::: + +Follow the steps below to deploy ToolJet on a DigitalOcean Droplet. + +**1. Navigate to the Droplets section in DigitalOcean.** + +
    + + create a Droplet + +
    + +**2. Configure the **Droplet** with the following options:** + + - **Image**: Ubuntu + - **Plan**: Choose a plan (e.g., Basic, 4GB RAM, 2 vCPU) + +
    + use a droplet plan +
    + + - **Auth**: For authentication, use password or ssh + - Click **Create Droplet** and note the assigned public IP + +**3. Create a Firewall for the **Droplets** to allow required ports.** + + protocol | port | allowed_cidr| + :---| :---------- | :---------- | + tcp | 22 | your IP | + tcp | 80 | 0.0.0.0/0 | + tcp | 443 | 0.0.0.0/0 | + +**4. Connect to the **Droplets** via SSH.** + +**5. Install Docker and Docker Compose using the following commands:** + +```bash +apt update && apt upgrade -y +apt install -y docker.io +``` + +Enable and start Docker: + +```bash +systemctl enable docker +systemctl start docker +``` + +Install Docker Compose: + +```bash +apt install -y curl +curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose +chmod +x /usr/local/bin/docker-compose +``` + +Verify installation: + +```bash +docker --version +docker-compose --version +``` + +**6. Update the `TOOLJET_HOST` in the `.env` file:** + +`TOOLJET_HOST=http://:80` + +**7. Use the [Docker Documentation](https://docs.tooljet.ai/docs/setup/docker) to deploy ToolJet.** + + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com. diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/docker.md b/docs/versioned_docs/version-3.0.0-LTS/setup/docker.md new file mode 100644 index 0000000000..b8d5251ae1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/docker.md @@ -0,0 +1,168 @@ +--- +id: docker +title: Docker +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Deploying ToolJet using Docker Compose + +Follow the steps below to deploy ToolJet on a server using Docker Compose. ToolJet requires a PostgreSQL database to store applications definitions, (encrypted) credentials for datasources and user authentication data. + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai. +::: + +:::info +If you rather want to try out ToolJet on your local machine with Docker, you can follow the steps [here](/docs/setup/try-tooljet/). +::: + +### Installing Docker and Docker Compose +Install docker and docker-compose on the server. + - Docs for [Docker Installation](https://docs.docker.com/engine/install/) + - Docs for [Docker Compose Installation](https://docs.docker.com/compose/install/) + +### Deployment options + +There are two options to deploy ToolJet using Docker Compose: +1. **With in-built PostgreSQL database (recommended)**. This setup uses the official Docker image of PostgreSQL. +2. **With external PostgreSQL database**. This setup is recommended if you want to use a managed PostgreSQL service such as AWS RDS or Google Cloud SQL. + +Confused about which setup to select? Feel free to ask the community via Slack: https://tooljet.com/slack. + + + + + + 1. Download our production docker-compose file into the server. + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/docker-compose-db.yaml + mv docker-compose-db.yaml docker-compose.yaml + mkdir postgres_data + ``` + + 2. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded as in step 1): + + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/.env.internal.example + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/internal.sh && chmod +x internal.sh + mv .env.internal.example .env && ./internal.sh + ``` + + `internal.sh` helps to generate the basic .env variables such as the LOCKBOX_MASTER_KEY, SECRET_KEY_BASE, and the password for postgreSQL database. + + 3. To start the docker container, use the following command: + + ```bash + docker-compose up -d + ``` + + 4. **(Optional)** `TOOLJET_HOST` environment variable can either be the public ipv4 address of your server or a custom domain that you want to use. Which can be modified in the .env file. + + Also, for setting up additional environment variables in the .env file, please check our documentation on [environment variable](/docs/setup/env-vars) + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the server. + + :::info + i. Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + + ii. Setup docker to run without root privileges by following the instructions written here https://docs.docker.com/engine/install/linux-postinstall/ + + iii. If you're running on a linux server, `docker` might need sudo permissions. In that case you can either run: + `sudo docker-compose up -d` + ::: + +### Docker Backup (Only For In-Built PostgreSQL) + +The below bash script will help with taking back-up and as well as restoring: + +1. Download the script: +```bash +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/backup-restore.sh && chmod +x backup-restore.sh +``` + +2. Run the script with the following command: +```bash +./backup-restore.sh +``` + +
    + Docker - Backup and Restore +
    + + + +
    + + + 1. Setup a PostgreSQL database and make sure that the database is accessible. + + 2. Download our production docker-compose file into the server. + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/docker-compose.yaml + ``` + + 3. Create `.env` file in the current directory (where the docker-compose.yaml file is downloaded as in step 1): + + Kindly set the postgresql database credentials according to your external database. Please enter the database details with the help of the bash as shown below. + +
    + + + +
    + + ```bash + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/.env.external.example + curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/docker/external.sh && chmod +x external.sh + mv .env.external.example .env && ./external.sh + ``` + + 4. To start the docker container, use the following command: + + ```bash + docker-compose up -d + ``` + + 5. **(Optional)** `TOOLJET_HOST` environment variable can either be the public ipv4 address of your server or a custom domain that you want to use. Which can be modified in the .env file. + + Also, for setting up additional environment variables in the .env file, please check our documentation on [environment variable](/docs/setup/env-vars) + + Examples: + `TOOLJET_HOST=http://12.34.56.78` or + `TOOLJET_HOST=https://tooljet.yourdomain.com` + + If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the server. + + :::info + i. Please make sure that `TOOLJET_HOST` starts with either `http://` or `https://` + + ii. 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. + + iii. If you're running a linux server, `docker` might need sudo permissions. In that case you can either run: + `sudo docker-compose up -d` + + iv. Setup docker to run without root privileges by following the instructions written here https://docs.docker.com/engine/install/linux-postinstall/ +::: + +
    +
    + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/ec2.md b/docs/versioned_docs/version-3.0.0-LTS/setup/ec2.md new file mode 100644 index 0000000000..4dfafee9fe --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/ec2.md @@ -0,0 +1,131 @@ +--- +id: ec2 +title: AWS EC2 +--- + +# Deploying ToolJet on Amazon EC2 + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai. +::: + +:::info +You should setup a PostgreSQL database manually to be used by the ToolJet server. +::: + + +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 EC2 instances. + +To deploy all the services at once, simply employ the following template: +``` +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/cloudformation/EC2-cloudfomration.yml +``` + +Follow the steps below to deploy ToolJet on AWS EC2 instances. + +1. Setup a PostgreSQL database and make sure that the database is accessible from the EC2 instance. +2. Login to your AWS management console and go to the EC2 management page. +3. Under the **Images** section, click on the **AMIs** button. +4. Find the [ToolJet version](/docs/setup/choose-your-tooljet) you want to deploy. Now, from the AMI search page, select the search type as "Public Images" and input the version you'd want `AMI Name : tooljet_vX.X.X.ubuntu_bionic` in the search bar. +5. Select ToolJet's AMI and bootup an EC2 instance.
    + Creating a new security group is recommended. For example, if the installation should receive traffic from the internet, the inbound rules of the security group should look like this: + + protocol| port | allowed_cidr| + ----| ----------- | ----------- | + tcp | 22 | your IP | + tcp | 80 | 0.0.0.0/0 | + tcp | 443 | 0.0.0.0/0 | + + +6. Once the instance boots up, SSH into the instance by running `ssh -i ubuntu@`. + +7. Switch to the app directory by running `cd ~/app`.
    Modify the contents of the `.env` file. ( Eg: `vim .env` ) + + The default `.env` file looks like this: + ```bash + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + PG_DB= + PG_USER= + PG_HOST= + PG_PASS= + TOOLJET_DB= + TOOLJET_DB_HOST= + TOOLJET_DB_USER= + TOOLJET_DB_PASS= + ``` + Read **[environment variables reference](/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. + ::: + +8. `TOOLJET_DB_HOST` environment variable determines where you can access the ToolJet client. It can either be the public ipv4 address of your instance or a custom domain that you want to use. + + Examples: + `TOOLJET_DB_HOST=http://12.34.56.78` or + `TOOLJET_DB_HOST=https://yourdomain.com` or + `TOOLJET_DB_HOST=https://tooljet.yourdomain.com` + + :::info + We use a [lets encrypt](https://letsencrypt.org/) plugin on top of nginx to create TLS certificates on the fly. + ::: + + :::info + Please make sure that `TOOLJET_DB_HOST` starts with either `http://` or `https://` + ::: + +9. Once you've configured the `.env` file, run `./setup_app`. This script will install all the dependencies of ToolJet and then will start the required services. +10. If you've set a custom domain for `TOOLJET_HOST`, add a `A record` entry in your DNS settings to point to the IP address of the EC2 instance. +12. You're all done, ToolJet client would now be served at the value you've set in `TOOLJET_HOST`. + +#### Deploying ToolJet Database + +ToolJet AMI comes inbuilt with PostgREST. If you intend to use this feature, you'd only have to setup the environment variables in `~/app/.env` file and run `./setup_app` script. + +You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + + +## Upgrading to the Latest LTS Version + +:::note +Users on versions earlier than **v2.23.0-ee2.10.2** must first upgrade to this version before proceeding to the 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`. + +Since ToolJet is deployed using an AMI (Amazon Machine Image), upgrading to a new LTS version requires launching a new EC2 instance with the updated AMI instead of upgrading in place. + +#### Steps to Upgrade: + +**1. Backup Your Data** +- Perform a comprehensive backup of your PostgreSQL database to prevent data loss. + +**2. Copy the .env File from the old Instance** +- Before stopping the old instance, copy the `.env` file and store it safely. + +**3. Stop the old EC2 Instance** +- To prevent conflicts, stop the old EC2 instance before proceeding with the new deployment. +- Ensure that the old instance remains stopped while setting up the new one. + +**4. Launch a New EC2 Instance with the Latest AMI** + +- Go to the AWS EC2 dashboard and find the latest ToolJet AMI. +- Launch a new EC2 instance using this AMI. +- Configure security group rules as needed. + +**5. Transfer the .env File to the New Instance** +- Upload the saved `.env` file to the appropriate directory on the new instance. + +**6. Start the Application** +- SSH into the new instance, navigate to the app directory, and run the setup script: + + ```bash + cd ~/app + ./setup_app + ``` + +**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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/ecs.md b/docs/versioned_docs/version-3.0.0-LTS/setup/ecs.md new file mode 100644 index 0000000000..8e95aeb9f8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/ecs.md @@ -0,0 +1,156 @@ +--- +id: ecs +title: AWS ECS +--- + +# Deploying ToolJet on Amazon ECS + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai. +::: + +:::info +You should setup 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-service setups, it's recommended to use an external Redis instance. +::: + +You can effortlessly deploy Amazon Elastic Container Service (ECS) by utilizing a [CloudFormation template](https://aws.amazon.com/cloudformation/): + +To deploy all the services at once, simply employ the following template: + +``` +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/cloudformation/Cloudfomation-template-one-click.yml +``` + +If you already have existing services and wish to integrate ToolJet seamlessly into your current Virtual Private Cloud (VPC) or other setups, you can opt for the following template: + +``` +curl -LO https://tooljet-deployments.s3.us-west-1.amazonaws.com/cloudformation/Cloudformation-deploy.yml +``` + +## ToolJet + +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 + + 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 + + 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 + + For the setup, ToolJet requires: + + ``` + TOOLJET_HOST= + LOCKBOX_MASTER_KEY= + SECRET_KEY_BASE= + + PG_USER= + PG_HOST= + PG_PASS= + PG_DB=tooljet_production + ``` + Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars). + + 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. + +:::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. +::: + +## ToolJet Database + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break. Checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: + +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) + +#### Setting Up ToolJet Database + +To set up ToolJet Database, the following **environment variables are mandatory** and must be configured: + +```env +TOOLJET_DB= +TOOLJET_DB_HOST= +TOOLJET_DB_USER= +TOOLJET_DB_PASS= +``` + +Additionally, for **PostgREST**, the following **mandatory** environment variables must be set: + +:::tip +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. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +**Ensure these configurations are correctly set up before proceeding with deployment. Please make sure these environment variables are set in the same ToolJet task definition's environment variables.** + + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/env-vars.md b/docs/versioned_docs/version-3.0.0-LTS/setup/env-vars.md new file mode 100644 index 0000000000..867872a384 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/env-vars.md @@ -0,0 +1,240 @@ +--- +id: env-vars +title: Environment Variables +--- + +ToolJet requires several environment variables to function properly. Below is a simplified guide to setting them up. + +## ToolJet Server + +### Required Variables + +#### ToolJet Host + +- `TOOLJET_HOST`: Public URL of ToolJet (e.g., `https://app.tooljet.ai`) + +#### 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: + +``` +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 +- `TOOLJET_DB_PASS`: Database password +- `TOOLJET_DB_PORT`: Database port + +**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. +- `PGRST_DB_URI`: Database connection string +- `PGRST_LOG_LEVEL=info` + +If you intent to make changes in the above configuration. Please refer [PostgREST configuration docs](https://postgrest.org/en/stable/configuration.html#environment-variables). + +#### Configuring PGRST_DB_URI + +`PGRST_DB_URI` is required for PostgREST, which is responsible for exposing the database as a REST API. It must be explicitly set to ensure proper functionality. + +This follows the format: + +``` +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +Ensure that: + +- `username` and `password` match the credentials for the PostgREST database user. +- `hostname` is correctly set (`postgres` if using Docker Compose setup with an in-built PostgreSQL). +- `port` is the PostgreSQL port (default: `5432`). +- `database_name` is the database used for PostgREST (`tooljet_db` in this example). + +#### 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. + +``` +REDIS_HOST= +REDIS_PORT= +REDIS_USER= +REDIS_PASSWORD= +``` + +### Optional Configurations + +#### Comments Feature + +- `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. +- `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 +Set `DISABLE_SIGNUPS=true` to allow only invited users to sign up. The signup page will still be visible but unusable. + +#### Serving the Client +- `SERVE_CLIENT=false`: Stops the backend from serving the frontend. + +#### SMTP Configuration +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. +::: + +For **Enterprise Edition**, configure SMTP in the ToolJet Settings UI. + +For **Community Edition**, use these environment variables: + +- `DEFAULT_FROM_EMAIL`: Sender email address +- `SMTP_USERNAME`: SMTP username +- `SMTP_PASSWORD`: SMTP password +- `SMTP_DOMAIN`: SMTP host +- `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). + +### 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 + +#### 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. + +#### Asset Path + +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/`) + +## 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. + +**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: + + +
    + +
    + +| Language | Code | Native Name | +|-------------|------|-------------------| +| English | en | English | +| French | fr | Français | +| Spanish | es | Español | +| Italian | it | Italiano | + +
    + +
    + +
    + +| Language | Code | Native Name | +|-------------|------|-------------------| +| Indonesian | id | Bahasa Indonesia | +| Ukrainian | uk | Українська | +| Russian | ru | Русский | +| German | de | Deutsch | + +
    + +
    + +Example: `LANGUAGE=fr` (for French). + +**Note:** This setting is not available in ToolJet Cloud. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/google-cloud-run.md b/docs/versioned_docs/version-3.0.0-LTS/setup/google-cloud-run.md new file mode 100644 index 0000000000..a10012f2f8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/google-cloud-run.md @@ -0,0 +1,161 @@ +--- +id: google-cloud-run +title: Google Cloud Run +--- + +# Deploying ToolJet on Google Cloud Run + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist https://api-gateway.tooljet.ai. +::: + +:::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 setups, it's recommended to use an external Redis instance. +::: + + + +## Deploying ToolJet application + +### Services and Components + +| Service | Component | Description | +|----------------|-----------------|-------------| +| **Cloud Run** | `tooljet-app` | Runs the main ToolJet application. | +| **Cloud SQL** | `TOOLJET_DB` | Stores ToolJet-created tables and app data. | +| **Cloud SQL** | `PG_DB` | Database used to store application data | + +**1. Create a new Google Cloud Run Service:** + +
    + 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 +
    + +**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 +
    + +**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= + +PG_USER= +PG_HOST= +PG_PASS= +PG_DB=tooljet_production +``` + +Update `TOOLJET_HOST` environment variable if you want to use the default url assigned with Cloud run after the initial deploy. + +## ToolJet Database + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break. Checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: + +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) + +#### Setting Up ToolJet Database + +To set up ToolJet Database, the following **environment variables are mandatory** and must be configured: + +```env +TOOLJET_DB= +TOOLJET_DB_HOST= +TOOLJET_DB_USER= +TOOLJET_DB_PASS= +``` + +Additionally, for **PostgREST**, the following **mandatory** environment variables must be set: + +:::tip +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. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +**Ensure these configurations are correctly set up before proceeding with the ToolJet deployment. Make sure these environment variables are set in the same environment as the ToolJet container.** + + +**Note:** These environment variables are in general and might change in the future. You can also refer env variable [**here**](/docs/setup/env-vars). + + + +:::tip +If you are using [Public IP](https://cloud.google.com/sql/docs/postgres/connect-run) for Cloud SQL, then database host connection (value for `PG_HOST`) needs to be set using unix socket format, `/cloudsql/`. +::: + + +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. + ::: + + +## Upgrading to the Latest LTS Version + +New LTS versions are released every 3-5 months with an end-of-life of 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/helm.md b/docs/versioned_docs/version-3.0.0-LTS/setup/helm.md new file mode 100644 index 0000000000..3fd6fcf2d7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/helm.md @@ -0,0 +1,48 @@ +--- +id: helm +title: Helm +--- + +# Deploying ToolJet with Helm Chart + +This repository contains Helm charts for deploying [ToolJet](https://github.com/ToolJet/helm-charts) on a Kubernetes Cluster using Helm v3. The charts include an integrated PostgreSQL server that is enabled by default. However, you have the option to disable it and configure a different PostgreSQL server by updating the `values.yml` file. + +## Installation + +### From Helm repo +```bash +helm repo add tooljet https://github.com/ToolJet/helm-charts.git +helm install tooljet tooljet/tooljet +``` + +### From the Source +1. Clone the repository and navigate to this directory +2. Run `helm dependency update` +3. It is recommended but optional to modify the values in the `values.yaml` file, such as usernames, passwords, persistence settings, etc. +4. Run `helm install -n $NAMESPACE --create-namespace $RELEASE .` + +Remember to replace the variables with your specific configuration values. + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist `https://api-gateway.tooljet.ai`. +::: + +## ToolJet Database + +ToolJet offers a hosted database solution that allows you to build applications quickly and manage your data effortlessly. The ToolJet database requires no setup and provides a user-friendly interface for data management. + +For more information about the ToolJet database, you can visit [here](/docs/tooljet-db/tooljet-database). + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/http-proxy.md b/docs/versioned_docs/version-3.0.0-LTS/setup/http-proxy.md new file mode 100644 index 0000000000..33778e0f0e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/http-proxy.md @@ -0,0 +1,34 @@ +--- +id: http-proxy +title: Connecting via HTTP proxy +--- + +The server will connect to the internet via the configured HTTP proxy when the below environment variable is set. + +| Variable | Description | +| :--------------------- | :------------------------------------ | +| TOOLJET_HTTP_PROXY | Used for both HTTP and HTTPS requests | + +*If you have any questions, feel free to join our [Slack Community](https://tooljet.com/slack) or send us an email at hello@tooljet.com.* + + +
    + +## Package Information + +We use the [global-agent](https://www.npmjs.com/package/global-agent) package to manage HTTP proxies. + +This package allows you to configure global HTTP/HTTPS proxies for your Node.js application. It is particularly useful when you need to route all outgoing HTTP and HTTPS requests through a proxy server. This can be beneficial for scenarios such as bypassing network restrictions, logging, or adding an extra layer of security. + +
    + +
    + +## URL Format + +The environment variable format follows the standard host and port notation: +``` +http://127.0.0.1:8080 +``` + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/index.md b/docs/versioned_docs/version-3.0.0-LTS/setup/index.md new file mode 100644 index 0000000000..8f2c73bd5b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/index.md @@ -0,0 +1,10 @@ +# Deploy ToolJet + +Check out the different methods you can use to deploy ToolJet on your machine. + +```mdx-code-block +import {DocsCardList} from '../../../src/components/DocsCard'; +import {useCurrentSidebarCategory} from '@docusaurus/theme-common'; + + +``` diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-aks.md b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-aks.md new file mode 100644 index 0000000000..eb29d0613d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-aks.md @@ -0,0 +1,118 @@ +--- +id: kubernetes-aks +title: Kubernetes (AKS) +--- + +# Deploying ToolJet on Kubernetes (AKS) + +:::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. + +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. +::: + +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= +SECRET_KEY_BASE= + +PG_USER= +PG_HOST= +PG_PASS= +PG_DB=tooljet_production +``` +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. +::: + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist `https://api-gateway.tooljet.ai`. +::: + +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 + ``` + +4. Apply YAML configs + + ```bash + kubectl apply -f deployment.yaml, service.yaml + ``` + +You will be able to access your ToolJet installation once the pods and services running. + +## ToolJet Database + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break. Checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: + +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) + +#### Setting Up ToolJet Database + +To set up ToolJet Database, the following **environment variables are mandatory** and must be configured: + +```env +TOOLJET_DB= +TOOLJET_DB_HOST= +TOOLJET_DB_USER= +TOOLJET_DB_PASS= +``` + +Additionally, for **PostgREST**, the following **mandatory** environment variables must be set: + +:::tip +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. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +**Ensure these configurations are correctly set up before proceeding with the ToolJet deployment. Make sure these environment variables are set in the same environment as the ToolJet deployment.** + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-eks.md b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-eks.md new file mode 100644 index 0000000000..fcde1167c7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-eks.md @@ -0,0 +1,109 @@ +--- +id: kubernetes-eks +title: Kubernetes (EKS) +--- + +Follow the steps below to deploy ToolJet on an EKS Kubernetes cluster. + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist `https://api-gateway.tooljet.ai`. +::: + +:::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/setup/system-requirements#database-software). + +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. +::: + +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= + +PG_USER= +PG_HOST= +PG_PASS= +PG_DB=tooljet_production +``` +Make sure to edit the environment variables in the `deployment.yaml`. You can check out the available options [here](/docs/setup/env-vars). + +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. + +**Example:** +- [Application load balancing on Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) + +## ToolJet Database + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break. Checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: + +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) + +#### Setting Up ToolJet Database + +To set up ToolJet Database, the following **environment variables are mandatory** and must be configured: + +```env +TOOLJET_DB= +TOOLJET_DB_HOST= +TOOLJET_DB_USER= +TOOLJET_DB_PASS= +``` + +Additionally, for **PostgREST**, the following **mandatory** environment variables must be set: + +:::tip +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. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +**Ensure these configurations are correctly set up before proceeding with the ToolJet deployment. Make sure these environment variables are set in the same environment as the ToolJet deployment.** + +## Upgrading to the Latest LTS Version + +New LTS versions are released every 3-5 months with an end-of-life of at least 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-gke.md b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-gke.md new file mode 100644 index 0000000000..096519fc92 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes-gke.md @@ -0,0 +1,144 @@ +--- +id: kubernetes-gke +title: Kubernetes (GKE) +--- + +# Deploying ToolJet on Kubernetes (GKE) + +:::info +You should setup 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. +::: + +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. + +2. Reserve a static IP address using `gcloud` cli + +```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 +``` +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. +::: + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist `https://api-gateway.tooljet.ai`. +::: + +4. Create k8s service + +```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. + +6. Apply YAML configs + +```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). +::: + +You will be able to access your ToolJet installation once the pods, service and the ingress is running. + +## ToolJet Database + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break. Checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: + +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) + +#### Setting Up ToolJet Database + +To set up ToolJet Database, the following **environment variables are mandatory** and must be configured: + +```env +TOOLJET_DB= +TOOLJET_DB_HOST= +TOOLJET_DB_USER= +TOOLJET_DB_PASS= +``` + +Additionally, for **PostgREST**, the following **mandatory** environment variables must be set: + +:::tip +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. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +**Ensure these configurations are correctly set up before proceeding with the ToolJet deployment. Make sure these environment variables are set in the same environment as the ToolJet deployment.** + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes.md b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes.md new file mode 100644 index 0000000000..daf1b58dec --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/kubernetes.md @@ -0,0 +1,130 @@ +--- +id: kubernetes +title: Kubernetes +--- + +# Deploying ToolJet on Kubernetes + +:::info +You should setup 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. +::: + +Follow the steps below to deploy ToolJet on a Kubernetes cluster. + +1. **Setup a PostgreSQL database** + 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= +SECRET_KEY_BASE= + +PG_USER= +PG_HOST= +PG_PASS= +PG_DB=tooljet_production +``` +Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars). + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist `https://api-gateway.tooljet.ai`. +::: + +3. Create a Kubernetes deployment + + ```bash + kubectl apply -f https://tooljet-deployments.s3.us-west-1.amazonaws.com/kubernetes/deployment.yaml + ``` + +:::info +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. +::: + +:::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. Verify if ToolJet is running + + ```bash + kubectl get pods + ``` + +5. Create a Kubernetes services to publish the Kubernetes deployment that you've created. This step varies with cloud providers. 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 loadbalancer. + + **Examples:** + + - [Application load balancing on Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/alb-ingress.html) + - [GKE Ingress for HTTP(S) Load Balancing](https://cloud.google.com/kubernetes-engine/docs/concepts/ingress) + +:::tip +If you want to serve ToolJet client from services such as Firebase or Netlify, please read the client Setup documentation **[here](/docs/setup/client)**. +::: + +## ToolJet Database + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break. Checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: + +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) + +#### Setting Up ToolJet Database + +To set up ToolJet Database, the following **environment variables are mandatory** and must be configured: + +```env +TOOLJET_DB= +TOOLJET_DB_HOST= +TOOLJET_DB_USER= +TOOLJET_DB_PASS= +``` + +Additionally, for **PostgREST**, the following **mandatory** environment variables must be set: + +:::tip +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. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +**Ensure these configurations are correctly set up before proceeding with the ToolJet deployment. Make sure these environment variables are set in the same environment as the ToolJet deployment.** + + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/openshift.md b/docs/versioned_docs/version-3.0.0-LTS/setup/openshift.md new file mode 100644 index 0000000000..c66b9dd10a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/openshift.md @@ -0,0 +1,132 @@ +--- +id: openshift +title: Openshift +--- + +# Deploying ToolJet on Openshift + +:::info +You should setup 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 setups, it's recommended to use an external Redis instance. +::: + +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 +``` +Also, for setting up additional environment variables in the .env file, please check our documentation on environment variables [here](/docs/setup/env-vars). + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist `https://api-gateway.tooljet.ai`. +::: + +3. 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 + +
    + +## ToolJet Database + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. You can learn more about this feature [here](/docs/tooljet-db/tooljet-database). + +Deploying ToolJet Database is mandatory from ToolJet 3.0 or else the migration might break. Checkout the following docs to know more about new major version, including breaking changes that require you to adjust your applications accordingly: + +- [ToolJet 3.0 Migration Guide for Self-Hosted Versions](./upgrade-to-v3.md) + +#### Setting Up ToolJet Database + +To set up ToolJet Database, the following **environment variables are mandatory** and must be configured: + +```env +TOOLJET_DB= +TOOLJET_DB_HOST= +TOOLJET_DB_USER= +TOOLJET_DB_PASS= +``` + +Additionally, for **PostgREST**, the following **mandatory** environment variables must be set: + +:::tip +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. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +**Ensure these configurations are correctly set up before proceeding with the ToolJet deployment. Make sure these environment variables are set in the same environment as the ToolJet deployment.** + +## 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`. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest LTS Version: + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/system-requirements.md b/docs/versioned_docs/version-3.0.0-LTS/setup/system-requirements.md new file mode 100644 index 0000000000..c1ba630189 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/system-requirements.md @@ -0,0 +1,42 @@ +--- +id: system-requirements +title: System Requirements +--- + +This document covers all the system requirements for self-hosting ToolJet. + +:::info +The official Docker tag for the Enterprise Edition is tooljet/tooljet:ee-lts-latest. +::: + +## Operating Systems + +### Supported Linux distribution + +[ToolJet images](https://hub.docker.com/r/tooljet/tooljet/tags) can run on any Linux machine with x86 architecture (64-bit). Ensure that your system meets the minimum requirements specified below before installing ToolJet. + +### Microsoft Windows + +ToolJet is developed for Linux-based operating systems. Please consider using a virtual machine or Windows Subsystem for Linux 2 (WSL2) to run ToolJet on Windows. + +## VM deployments: + +- **Operating System:** Ubuntu 22.04 or later +- **Processor Architecture:** x86 (arm64 is not supported) +- **RAM:** 2GB +- **CPU:** 1 vCPU +- **Storage:** At least 8GiB, but can increase according to your requirements. + +## Orchestrated Deployments: + +- When employing container orchestration frameworks like Kubernetes, it's imperative to ensure that your cluster hosts at least one node equipped with the above specifications for seamlessly executing ToolJet deployments. + +Note: Adjustments can be made based on specific needs and the expected load on the server. + +:::info +To enable multiplayer editing and background jobs in ToolJet, you need to configure Redis. It is recommended to use Redis version 6.x. +::: + +## Database software: + +- It is recommended that your PostgreSQL database is of version 13.x. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/tooljet-subpath.md b/docs/versioned_docs/version-3.0.0-LTS/setup/tooljet-subpath.md new file mode 100644 index 0000000000..2f1f63fb80 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/tooljet-subpath.md @@ -0,0 +1,34 @@ +--- +id: tooljet-subpath +title: Deploying ToolJet on a subpath +--- + +ToolJet can now be deployed at a subpath rather than the root (`/`) of a public domain. Example subpath installation URL: **`http://www.yourcompany.com/apps/tooljet`** + +You'll need to setup the following environment variables if ToolJet installation is on a domain subpath: + +| variable | value | +| -------- | ---------------------- | +| TOOLJET_HOST | the public URL ( eg: https://www.yourcompany.com ) | +| SUB_PATH | Set a subpath to this variable. The subpath is to be set with trailing `/` and is applicable only when the server is serving the frontend client. ( eg: `/apps/tooljet/` ) | + + +:::info +See all **[Environment Variables](/docs/setup/env-vars)** here. +::: + +## Upgrading to the Latest Version + +The latest version includes architectural changes and, hence, comes with new migrations. + +If this is a new installation of the application, you may start directly with the latest version. This guide is not required for new installations. + +#### Prerequisites for Upgrading to the Latest Version: + +- It is **crucial to perform a comprehensive backup of your database** before starting the upgrade process to prevent data loss. + +- Ensure that your current version is v2.23.0-ee2.10.2 before upgrading. + +- 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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/try-tooljet.md b/docs/versioned_docs/version-3.0.0-LTS/setup/try-tooljet.md new file mode 100644 index 0000000000..95c57f19dc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/try-tooljet.md @@ -0,0 +1,53 @@ +--- +id: try-tooljet +title: Try ToolJet +--- + +# Try ToolJet + +## On local with Docker + +:::warning +To enable ToolJet AI features in your ToolJet deployment, whitelist `https://api-gateway.tooljet.ai`. +::: + + +You can run the command below to have ToolJet up and running right away. + +```bash +docker run \ + --name tooljet \ + --restart unless-stopped \ + -p 80:80 \ + --platform linux/amd64 \ + -v tooljet_data:/var/lib/postgresql/13/main \ + tooljet/try:ee-lts-latest +``` + +#### Setup information + +- Runs the ToolJet server on the port 80 on your machine. +- Container has postgres already configured within. All the data will be available in the docker volume `tooljet_data`. +- You can make use of `--env` or `--env-file` flag to test against various env configurables mentioned [here](/docs/setup/env-vars). +- Use `docker stop tooljet` to stop the container and `docker start tooljet` to start the container thereafter. + +#### Dynamic Port Setup +To run the ToolJet server on a different port, such as 8080 or any other port of your choice, use the following command: + +```sh +docker run \ + --name tooljet \ + --restart unless-stopped \ + -p 8080:8080 \ + -e PORT=8080 \ + --platform linux/amd64 \ + -v tooljet_data:/var/lib/postgresql/13/main \ + tooljet/try:ee-lts-latest +``` + +- This command will start the ToolJet server on port 8080. +- The `-e PORT=8080` flag sets the `PORT` environment variable to 8080, allowing the ToolJet server to listen on port 8080. + +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://tooljet.com/slack) or send us an email at hello@tooljet.com.* diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/upgrade-to-lts.md b/docs/versioned_docs/version-3.0.0-LTS/setup/upgrade-to-lts.md new file mode 100644 index 0000000000..0df918a9be --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/upgrade-to-lts.md @@ -0,0 +1,34 @@ +--- +id: upgrade-to-lts +title: Upgrading ToolJet to the LTS Version + +--- + +ToolJet has released its first Long Term Support (LTS) version, which provides extended support and stability for your environments. Upgrading to this LTS version ensures you benefit from the latest features and security updates while maintaining a stable and supported environment. + +### Check the latest LTS Version + +ToolJet will be releasing new LTS versions 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`. + +### Prerequisites + +- 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. + +### Upgrade Process + +The upgrade process depends on your deployment method. You can follow the upgrade process under the respective setup guides: + +- [Upgrade ToolJet on DigitalOcean](/docs/setup/digitalocean#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Docker](/docs/setup/docker#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on AWS EC2](/docs/setup/ec2#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on AWS ECS](/docs/setup/ecs#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on OpenShift](/docs/setup/openshift#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Helm](/docs/setup/helm#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Kubernetes](/docs/setup/kubernetes#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Kubernetes(GKE)](/docs/setup/kubernetes-gke#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Kubernetes(AKS)](/docs/setup/kubernetes-aks#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Azure Container Apps](/docs/setup/azure-container#upgrading-to-the-latest-lts-version) +- [Upgrade ToolJet on Google Cloud Run](/docs/setup/google-cloud-run#upgrading-to-the-latest-lts-version) + diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/upgrade-to-v3.md b/docs/versioned_docs/version-3.0.0-LTS/setup/upgrade-to-v3.md new file mode 100644 index 0000000000..0b97f138ab --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/upgrade-to-v3.md @@ -0,0 +1,231 @@ +--- +id: upgrade-to-v3 +title: ToolJet 3.0 Migration Guide Self-Hosted +--- + +ToolJet 3.0 is a new **major version**, including **breaking changes** that require you to adjust your applications accordingly. We will guide you through this process and mention a few important changes. + +:::tip Before upgrading +Before upgrading, we recommend reviewing your existing applications for any usage of deprecated features. Addressing these ahead of time will help reduce the work needed to upgrade to ToolJet 3.0. + +For complex applications, we also recommend setting up thorough testing procedures to ensure your apps function correctly after the upgrade. +::: + +## Upgrading to ToolJet 3.0 + +### Prerequisites ⚠️ + +Before attempting to upgrade to the ToolJet 3.0: + +- **Database Backup**: Create a complete backup of your database +- **Application Review**: Check your apps for breaking and deprecated features listed in this guide. +- **Test Environment**: Only attempt upgrade in a testing environment first. + +To upgrade, checkout the latest docker image **[here](/docs/setup/choose-your-tooljet)**. + +## Breaking Changes + +The following changes are breaking and require immediate action to ensure your applications continue to function correctly after the upgrade. + +## Dynamic Input Restrictions + +You can no longer dynamically change references to component names. + +### Action Required +- Review your applications for any dynamic component name references and refactor as necessary +- Replace all dynamic component references with static references +- Test all component interactions after making these changes + +### Examples and Details + +The following patterns are no longer supported: + +1. Using variables to construct component names: + ```javascript + // This will no longer work + {{components[variables.componentNameVariable].value}} + ``` + +2. Dynamically referencing components: + ```javascript + // This is not supported + {{components['textinput' + components.tabs1.currentTab].value}} + ``` + +3. Dynamically accessing nested properties: + ```javascript + // This dynamic property access is not allowed + {{components.table1[components.textinput1.value]}} + ``` + +Instead, use static references to components: + +```javascript +{{components.textinput1.value}} +{{components.table1.selectedRow}} +{{queries.query1.data}} +``` + +## Component and Query Naming + +:::note +This is only an issue during the upgrade process. Once your application is running on ToolJet 3.0, you can use identical names for components and queries without any problems. +::: + +### Action Required +- Review your applications for any instances where queries and components share the same name +- Temporarily rename either the component or the query to ensure unique names +- Document all renamed components/queries for potential post-upgrade reversion +- Test affected components and queries after renaming + +### Details and Examples + +When upgrading, if a component is referencing a query with the same name, the upgrade process may break that mapping. This occurs because ToolJet previously used a global ID-to-name map for both components and queries, which is now split in 3.0. + +Example scenario: If a table component named `userData` is referencing a query also named `userData`, this reference may break during the upgrade process. + +## Property Panel Logic + +### Action Required +- Review all property panel variable checks +- Update any existing variable existence checks to use the new recommended format +- Remove any instances of unsupported logic patterns +- Test all components using variable checks after updates + +### New Variable Access Rules + +There are changes to how you can access and check for the existence of variables in the property panel: + +- For components, queries, and page variables, a minimum of two keys must be available after the `component/query/page` keyword +- For variables, a minimum of one key should be present after the `variables` keyword + +```javascript +// Supported formats +components.textinput1.value +components?.textinput1?.value +components["textinput1"].value +queries.restapi1.data +page.variables.name +variables["name"] +variables.name + +// No longer supported +{{'name' in variables}} +{{Object.keys(variables).includes('name')}} +{{variables.hasOwnProperty('name')}} +// Recommended approach for checking existence +{{variables['name'] ?? false}} +``` + +:::caution +These changes may affect how your application interacts with variables and components. Be sure to test thoroughly after making these updates. +::: + +## Multi-Page Component Names + +### Action Required +- Review multi-page applications for components with identical names +- Either rename components to ensure uniqueness across pages +- Or modify queries to use query parameters instead of direct references +- Document all component name changes +- Test affected pages and their interactions after making changes + +### Current Limitations and Details + +When the same component name exists on multiple pages and is linked to queries, the query will only work correctly on the page where the component was originally associated with it. + +Example scenario: +1. You have `page1` and `page2`, each containing a component named `textinput1` +2. You create a query in `page1` that is linked to `textinput1` +3. The query will only function properly on `page1` +4. When you switch to `page2`, the query will not work as expected, even though there's a component with the same name + +:::tip +When building multi-page applications, it's recommended to use unique component names across all pages to avoid any potential issues with query bindings. +::: + +Future resolution: We will be adding functionality to enforce unique component names across all pages in upcoming releases. + +## Removal of Deprecated Features + +### Kanban Board + +The old deprecated **Kanban Board** component will cease functioning entirely. Applications using this component will crash after the upgrade if not updated. +
    +ToolJet - Widget Reference - Kanban widget +
    + +#### Required Actions + +1. Immediately identify all instances of the old **Kanban Board** component in your applications +2. Create new boards using the new **Kanban** component. +3. Transfer your data and configuration to the new component +4. Remove the old Kanban Board components +5. Update any queries or workflows that were connected to the old boards +6. Test thoroughly to ensure all functionality is preserved + +:::caution +After the 3.0 upgrade, applications with the old Kanban Board component will crash and become unusable. Make sure to replace all instances of the old component with the new Kanban component before upgrading. +::: + +### Local Data Sources + +#### Action Required +- Identify all local data sources in your applications +- Migrate them to global workspace data sources +- Update all queries and components using these data sources +- Test all affected components and queries after migration + +#### Action Required After Upgrade + +If you haven't migrated your local data sources to global data sources, you will encounter an error message indicating that local data sources are no longer supported. For detailed instructions on migrating from Local Data Sources to the new Data Sources, please refer to our [Local Data Sources Migration Guide](/docs/data-sources/local-data-sources-migration). + +### Workspace Variables + +#### Action Required +- Identify all uses of Workspace Variables +- Replace them with Workspace Constants +- Update all components and queries using these variables +- Configure appropriate role-based access for the new constants +- Test all affected functionality after migration + +Workspace Constants are designed to be resolved on the server-side only, ensuring a high level of security. You can assign users to a specific role and provide create, update, and delete access to Workspace Constants. + +For detailed instructions on migrating from Workspace Variables to Workspace Constants, please refer to our [Workspace Variables Migration Guide](/docs/security/constants/variables). + + +## Response Headers and Metadata + +#### Action Required +- Identify all instances where response headers are being accessed +- Update the code to use the new metadata format +- Test all affected queries and components after migration + +We've introduced a capability to expose additional information through metadata for all datasources. Previously, this was only available for REST API and GraphQL data sources. + +Before, you could access response headers like this: +```javascript +{{queries..responseHeaders}} +``` + +Now, you should use: +```javascript +{{queries..metadata}} +``` + +The `metadata` object will contain detailed information about the request and response, including request URL, method, headers, parameters, response status code, and headers. You can read more about metadata [here](/docs/data-sources/restapi/metadata-and-cookies/#metadata). + +## System Changes + +### ToolJet Database + +ToolJet Database is now a core requirement for the ToolJet 3.0. +To use ToolJet Database, you'd have to set up and deploy PostgREST server which helps querying ToolJet Database.
    +Please check the environment variables that you need to configure to set up: +- [PostgREST](/docs/setup/env-vars#postgrest-server-required) +- [ToolJet Database](/docs/setup/env-vars#enable-tooljet-database-required) + +## Help and Support + +- Feel free to join our [Slack Community](https://tooljet.com/slack) or you can also e-mail us at hello@tooljet.com. +- If you have found a bug, please create a [GitHub issue](https://github.com/ToolJet/ToolJet/issues) for the same. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/setup/v2-migration.md b/docs/versioned_docs/version-3.0.0-LTS/setup/v2-migration.md new file mode 100644 index 0000000000..317a5f2135 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/setup/v2-migration.md @@ -0,0 +1,33 @@ +--- +id: v2-migration-guide +title: V2 migration guide +--- +# Version 2 migration guide + +ToolJet version 2 comes with a bunch of exciting features, with the major ones being: +1. Multi page +2. Multi env +3. Forms widget +4. [Database](/docs/tooljet-db/tooljet-database) (Requires opt-in) +5. [Marketplace](/docs/marketplace/marketplace-overview) (Requires opt-in) + +Checkout the latest changelog for v2 [here](https://github.com/ToolJet/ToolJet/releases). + +## Deployment + +Based on your opted deployment method from our [setup doc](/docs/setup/), you can directly deploy v2 without any additional configuration for the default setup. + +Additional configuration are only required for the opt-in features mentioned above. You can check the respective documentation of those features for the configuration changes needed. + +:::info +Server may take some time to be ready to handle the HTTP request as v2 changes requires some data migrations for the initial deployment. This is automatically triggered as a part of the server boot. +:::: + +## Deprecations + +#### Deployments +- Docker compose deployments with [auto SSL](/docs/1.x.x/setup/docker) is deprecated + +## Help and Support +- Feel free to join our highly active **[Slack Community](https://tooljet.com/slack)** or you can also e-mail us at **hello@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.0.0-LTS/tj-setup/instances.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/instances.md new file mode 100644 index 0000000000..01ad1dd147 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/instances.md @@ -0,0 +1,40 @@ +--- +id: 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. + +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. + +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 diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/licensing/cloud.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/licensing/cloud.md new file mode 100644 index 0000000000..4d4b775d4e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/licensing/cloud.md @@ -0,0 +1,93 @@ +--- +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)**. + +## 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. + +### Basic Subscription + +This is a free subscription where a user can access basic offerings such as creating apps, limited access to the ToolJet Database, community support, etc. This is ideal for individuals or small teams who just need the essentials. + +### Trial Subscription + +ToolJet offers a trial subscription which is valid for 14 days, where users can access all premium features and evaluate ToolJet according to their needs. Once the trial period is over premium features, such as OpenID SSO login and Audit logs, will no longer be accessible. You can upgrade to a paid subscription by simply clicking on the upgrade button. + +### 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. + +## 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. + +### Credit Usage + +**Standard Operations** + + +AI-powered assistance for the following actions consumes **3 credits**: + +- Generating or editing single UI components +- Generating or modifying queries +- Incorporating business logic +- Debugging assistance +- Generating database tables +- Bulk modifying component styles +- Generating or modifying multi-component layouts +- Receiving guidance from documentation + +**Advanced Builds** + +The entire app UI generation consumes **10 credits**. + +### Credit Calculation + +AI credits are calculated based on the pricing plan and are assigned per builder in a workspace. These credits are then available for use by all users in the workspace. + +## Upgrading Your Subscription + +### Start Trial Subscription + +If you are not currently on a paid plan and have not yet used your free trial, you will see a **Start Trial** banner within the ToolJet dashboard. Click on the **Start free trial** button inside this banner to initiate your free trial. + +TJ Dashboard: Start free trial + +### Upgrading to Paid Subscription + +When you've identified the ideal paid plan to meet your needs, the next step is to complete the purchase process, ensuring seamless access to premium features. Follow these steps to upgrade your subscription: + +Role Required: **Admin** + +1. Click the gear icon (⚙️) at the bottom of the left sidebar and select **Settings** from the dropdown. + +2. In the Settings page, choose the **Subscription** tab.
    + (Example URL - `https://app.corp.com/nexus/settings/subscription`) + +3. The subscription tab displays a subscription overview card summarizing your current plan. Locate the **Upgrade** button in the lower left corner and click on it. + +4. A modal window will appear. Enter the desired number of builder and end-user seats, then click the **Upgrade** button within the modal. + +5. You'll be directed to a payment gateway. Complete the payment process. + +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. + +## FAQs + +
    + + **Q. What happens if my subscription expires?** + + +If your paid or trial license key expires, your instance will revert to the Basic plan. You will lose access to premium features such as OpenID SSO login and Audit logs, but no data will be lost. You can renew anytime to regain access to premium features. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/licensing/self-hosted.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/licensing/self-hosted.md new file mode 100644 index 0000000000..da5329077e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/licensing/self-hosted.md @@ -0,0 +1,86 @@ +--- +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)**. + +
    + +## 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. + +### Basic License + +This is a free license where a user can access basic offerings such as creating apps, pre-defined user groups, community support, etc. This is ideal for individuals or small teams who just need the essentials. No license key is required for this option. + +### 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. + +### 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. + +
    + +## AI Credit System + +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. + +### Credit Usage + +**Standard Operations** + +AI-powered assistance for the following actions consumes **3 credits**: + +- Generating or editing single UI components +- Generating or modifying queries +- Incorporating business logic +- Debugging assistance +- Generating database tables +- Bulk modifying component styles +- Generating or modifying multi-component layouts +- Guidance from documentation + +**Advanced Builds** + +The entire app UI generation consumes **10 credits**. + + +### Credit Calculation + +AI credits are calculated based on the pricing plan and are assigned per builder in an instance. These credits are then available for use by all users in the instance across all workspaces. + +## Updating License Key + +Once you have received the license key from the ToolJet Team, you can update the license key by following the steps: + +Role Required: **Super Admin** + +1. Go to the Settings page.
    + (Example URL - `https://app.corp.com/instance-settings/license`) + +2. In the license key tab, update the provided license key. + Licensing + +3. Within the license tab of the Settings page, you can access the limit tab, which provides details about available total users, builders, and end users. You can also see the expiry date of your license key. + Licensing + +## FAQs + +
    + + **Q. What happens if my subscription expires?** + + +If your paid or trial license key expires, your instance will revert to the Basic plan. You will lose access to premium features such as OpenID SSO login and Audit logs, but no data will be lost. You can renew anytime to regain access to premium features. + +
    + +:::caution +**Please keep in mind that your license key is private and strictly prohibited from being shared with any third parties.** +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/org-branding/custom-domain.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/org-branding/custom-domain.md new file mode 100644 index 0000000000..aee2927262 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/org-branding/custom-domain.md @@ -0,0 +1,35 @@ +--- +id: custom-domain +title: Custom Domain +--- + +In a self-hosted deployment of ToolJet, you can configure a custom domain by setting the `TOOLJET_HOST `environment variable. + +## Prerequisites + +- A running self-hosted instance of ToolJet. + +- A registered domain name. + +- A configured DNS record pointing your domain to the ToolJet server. + + +## Configuration Steps + +### 1. Set the TOOLJET_HOST Environment Variable + +The TOOLJET_HOST variable defines the public URL where ToolJet will be accessible. You need to update this variable with your desired domain. + +| variable | description | +| ------------ | ---------------------------------------------------------------- | +| TOOLJET_HOST | the public URL of ToolJet client ( eg: `https://app.corp.ai`,`https://corp.ai`,`https://corp.ai/app` ) | + + +### 2. Restart Services + +After setting the environment variable and DNS configurations, restart your ToolJet deployment to apply the changes. + + +:::info +Custom domains will soon be supported in ToolJet Cloud. +::: \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/org-branding/white-labeling.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/org-branding/white-labeling.md new file mode 100644 index 0000000000..dc21103a08 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/org-branding/white-labeling.md @@ -0,0 +1,57 @@ +--- +id: white-labeling +title: White Labeling +--- + +
    + Icon + Paid feature +
    + +The White Label feature in ToolJet lets you customize the look and feel of your ToolJet deployment to match your branding guidelines, including your logo, favicon, and page title, making ToolJet appear like your own product. This guide will help you understand the configuration of White labelling for your organization. For **self-hosted** instances, the white labelling is set at the [instance level](/docs/user-management/authentication/self-hosted/instance-login) and for the **cloud**, it is applied at the [workspace level](/docs/user-management/authentication/self-hosted/workspace-login). + + +whitelable your brand + + + +## Self-hosted Configuration: + +To access the White Labelling configuration, go to **Settings > White Labelling**. ( Example URL - `https://app.corp.com/instance-settings/white-labelling`) + +In this section you can configure the following branding elements: + +- **Application Logo**: This includes the logo displayed on the login screen, dashboard, and app-editor and deployed application. (Preferred dimensions: 130px by 26px). +- **Favicon**: It is an icon associated with the webpage displayed in the browser tab. (Preferred dimensions: 32px x 32px or 16px x 16px.) +- **Page Title**: This is the title associated with the webpage displayed in the browser tab. (Preferred title length: 50-60 characters.) + + +whitelabelling selfhosted + +## Cloud Configuration: + +To access the White Labelling configuration, go to **Settings > White Labelling**. ( Example URL - `https://app.corp.com//settings/white-labelling`) + +In this section you can configure the following branding elements: + +- **Application Logo**: This includes the logo displayed on the login screen, dashboard, and app-editor and deployed application. (Preferred dimensions: 130px by 26px). +- **Favicon**: It is an icon associated with the webpage displayed in the browser tab. (Preferred dimensions: 32px x 32px or 16px x 16px.) +- **Page Title**: This is the title associated with the webpage displayed in the browser tab. (Preferred title length: 50-60 characters.) + +whitelabelling selfhosted + + +## FAQ + +
    + + **Q. What happens to white labeling if the license or subscription expires?** + +If your license or subscription expires, white labeling will automatically revert to ToolJet's default branding until the license is renewed. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/overview.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/overview.md new file mode 100644 index 0000000000..45bb932539 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/overview.md @@ -0,0 +1,22 @@ +--- +id: overview +title: Overview +--- + +ToolJet provides a variety of configuration options to help your organization tailor the platform to your specific needs. This section outlines key setup areas for your organization, including branding, subscription plans, deployment options, and workspace management, to ensure an optimized experience for your team. + +## Deployment Options and Subscription Plans + +ToolJet provides two deployment options — **Self-Hosted** and **Cloud** — enabling users to select the model that best suits their requirements. In addition to deployment options, ToolJet provides a range of subscription plans for each deployment model, offering various features and benefits. Refer to the **[Choose Your ToolJet](/docs/tj-setup/tj-deployment)** guide for further details. + +## Instances and Workspaces + +In ToolJet, a self-hosted deployment of the platform is referred to as an **[instance](/docs/tj-setup/instances)**. Each instance operates independently, maintaining its own configuration, data, and user base. Within each instance, **[workspaces](/docs/tj-setup/workspaces)** provide isolated spaces for different teams or projects, enabling users to manage apps, resources, and access controls effectively. + +## Organization Branding + +ToolJet offers customization through **[white labeling](/docs/tj-setup/org-branding/white-labeling)** and **[custom domain](/docs/tj-setup/org-branding/custom-domain)** setup, allowing you to tailor your instance to align with your brand guidelines. White labeling ensures the platform reflects your organization’s brand identity, while a custom domain allows you to use your own web address for the ToolJet instance. + +## SMTP Server + +Additionally, ToolJet enables you to **[set up your email communication server](/docs/tj-setup/smtp-setup/configuration)** to manage tasks such as sending invitations and password reset requests, facilitating seamless communication within your team and with external stakeholders. diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/smtp-setup/configuration.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/smtp-setup/configuration.md new file mode 100644 index 0000000000..0a32632121 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/smtp-setup/configuration.md @@ -0,0 +1,73 @@ +--- +id: configuration +title: Configuration +--- + +This feature is exclusive to self-hosted ToolJet, allowing you to configure a custom SMTP email server. This feature allows you to choose your own email server, which helps to seamlessly send emails for various purposes, including invitations, password reset requests, and notifications. + +There are two ways to setup your email server in ToolJet: +1. **[Using the GUI](#configuration-using-gui)**: This method involves directly entering SMTP settings into the ToolJet interface, which is suitable for simpler setups. +2. **[With environment variables](#configuration-with-environment-variables)**: This method utilizes environment variables for configuring the email server. It offers enhanced flexibility and security, making it particularly suitable for managing sensitive credentials in production environments. + +Both methods are designed to ensure that your ToolJet instance can send emails as needed, depending on your setup preferences and security requirements. + +
    + +## Prerequisites + +Before you begin, ensure you have: +- Super Admin access to ToolJet +- SMTP server details from your email service provider + +
    + +:::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. +::: + +
    + +## Configuration Using GUI + +1. Navigate to the **Settings** section in ToolJet. +2. Select the **Email protocol (SMTP)** tab. +3. Toggle the switch to enable **Email protocol (SMTP)**. +4. Configure the following fields:
    + | Field | Description | Example | + |---------------|--------------------------|-----------------------------------| + | Host | SMTP server hostname | smtp.gmail.com | + | Port | SMTP server port number | 587 | + | User | SMTP account username | hello@johndoe.tech | + | Password | SMTP account password | a13d0sd344 | + | Sender's email| Email address of the sender | hello@johndoe.tech | + +5. Click **Save changes** to apply the new SMTP configuration. + SMTP     Configuration Without Environment Variables + +
    + +
    + +## Configuration With Environment Variables + +ToolJet allows you to configure SMTP settings using environment variables. You can enable a toggle in the Email protocol (SMTP) settings to apply or fetch the configuration directly from your .env file. + +SMTP Configuration Without Environment Variables + +**Example Environment Variables**:
    + + ```javascript + DEFAULT_FROM_EMAIL=hello@tooljet.io + SMTP_USERNAME=your-username + SMTP_PASSWORD=your-password + SMTP_DOMAIN=smtp.mailgun.org + SMTP_PORT=587 + SMTP_SSL=false + SMTP_DISABLED=false + ``` + +- For new installations, if SMTP is configured in the .env file, the **Apply configuration from environment variables** toggle will be turned on by default. +- When the toggle is enabled, the SMTP settings fields in the UI will be populated with values from the environment variables and will be read-only. +- Disabling the toggle allows you to manually enter or edit SMTP settings directly in the UI. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/smtp-setup/email-providers.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/smtp-setup/email-providers.md new file mode 100644 index 0000000000..aab218b7e6 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/smtp-setup/email-providers.md @@ -0,0 +1,38 @@ +--- +id: email-providers +title: Commonly Used Email Providers +--- + +Here are some general settings for the most commonly used email providers: + +| Provider | Host | Port | Username | Password | Sender's email | +|--------------------|----------------------|------------------|---------------|-----------|----------------| +| Gmail | smtp.gmail.com | 587 or 465 (SSL) | Email | Password | Email | +| Yahoo Mail | smtp.mail.yahoo.com | 465 (SSL) | Email | Password | Email | +| Outlook.com/Hotmail| smtp.office365.com | 587 or 465 (SSL) | Email | Password | Email | +| Zoho Mail | smtp.zoho.com | 587 or 465 (SSL) | Email | Password | Email | +| SendGrid | smtp.sendgrid.net | 587 or 465 (SSL) | apikey | API key | Email | +| Mailgun | smtp.mailgun.org | 587 or 465 (SSL) | SMTP username | Password | Email | + + +## SendGrid + +To configure SendGrid, use **`apikey`** as the username and the generated API key as the password. + +SMTP Configuration Without Environment Variables + +#### Steps to Generate API Key +1. Log in to your [SendGrid](https://sendgrid.com/en-us) account. + +2. Navigate to the [API Keys](https://app.sendgrid.com/settings/api_keys) page under Settings. + +3. Generate a new API key for SMTP usage. + SMTP Configuration Without Environment Variables + +## Mailgun + +Mailgun provides specific credentials for SMTP configuration. +1. Retrieve the **SMTP username** from the SMTP Credentials tab in the Domain Settings page. + +2. Use the password associated with your Mailgun account to authenticate the SMTP connection. + SMTP Configuration Without Environment Variables diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/tj-deployment.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/tj-deployment.md new file mode 100644 index 0000000000..5364c6de00 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/tj-deployment.md @@ -0,0 +1,42 @@ +--- +id: tj-deployment +title: Choose Your ToolJet +--- + +ToolJet offers two deployment options — **Self-Hosted** and **Cloud** — enabling users to select the model that best suits their requirements. Choosing the right deployment method is crucial since it affects data control, scalability, and operational efficiency. This guide explains these options and helps you decide which one best suits your specific requirements. + +
    + +## Self-Hosted ToolJet + +With the self-hosted option, ToolJet can be deployed on your own infrastructure (on-premises or private cloud). This provides more control over data, customization, and integrations, making it an ideal choice for organizations seeking full control over their application development environment to meet compliance, security, and operational requirements. + +#### Why Choose Self-Hosted ToolJet? + +1. **Complete Data Control**: Deploying ToolJet on your infrastructure ensures your data stays within your control, meeting stringent compliance and privacy requirements. +2. **Customizability**: Self-hosted deployments allow for deeper customization to align with your organization's workflows, integrations, and unique needs. +3. **Enhanced Security**: By hosting ToolJet on-premises or in your private cloud, you can implement your own security measures, providing an added layer of protection for sensitive data. + +
    + +
    + +## ToolJet Cloud + +ToolJet Cloud is a managed service hosted by the ToolJet team. It eliminates the need for infrastructure management, providing a quick setup and seamless updates. This option is ideal for teams looking for rapid deployment, seamless scalability, and reduced operational complexity. + +#### Why Choose ToolJet Cloud? + +1. **Hassle-Free Setup**: With ToolJet Cloud, there’s no need to manage servers or infrastructure. Everything is set up and maintained by the ToolJet team, allowing you to focus solely on building applications. +2. **Seamless Updates and Maintenance**: ToolJet Cloud ensures you always have access to the latest features and updates without manual intervention. Maintenance, backups, and uptime are handled for you. +3. **Scalability**: The cloud deployment is designed to scale automatically as your team or application requirements grow, ensuring consistent performance. + +
    + +
    + +## ToolJet Subscription Plans + +ToolJet offers various subscription plans for both deployment models. Refer to the **[ToolJet Pricing](https://www.tooljet.com/pricing)** page for detailed information on features and costs. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tj-setup/workspaces.md b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/workspaces.md new file mode 100644 index 0000000000..5d590d54f7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tj-setup/workspaces.md @@ -0,0 +1,106 @@ +--- +id: workspaces +title: Workspaces +--- +# Workspaces + +Workspaces are collaborative environments that enable teams to build, customize, and deploy applications, as well as manage data, workflows, and permissions. It helps you organize your organization's apps based on hierarchy or departments, making them easier to manage. For example, if your organization has departments, you can create separate workspaces for each to isolate apps or limit access to particular set of users or developers. + +Workspace contains applications, data sources, users (admins, developers, or builders, end users), [access and permission ](/docs/user-management/role-based-access/access-control)settings, and more. You can also set different [login configurations](/docs/user-management/authentication/self-hosted/overview) for each workspace. You can have multiple workspaces within an instance. + +## Workspace Creation + +**Role required** - Workspace Admin + +To create a new workspace, + +1. Open the workspace dropdown at the bottom left on dashboard (Example URL - `https://app.corp.com/`) +2. Select **Add a new workspace**. +3. Fill in the workspace name and slug in the modal. +4. Click **Create workspace**. + +Create workspace + +## Editing Workspaces +**Role required** - Workspace Admin + +To edit a workspace, + +1. Open the workspace dropdown at the bottom left on dashboard (Example URL - `https://app.corp.com/`) +2. Hover over the **current workspace** in the dropdown menu. +3. Click the **edit icon** to modify the workspace name or slug. +4. Save the changes, and the updates will reflect immediately across the platform. + +## Switching Workspaces + +To switch between the workspaces, + +1. Open the workspace dropdown at the bottom left on dashboard (Example URL - `https://app.corp.com/`) +2. Select the desired workspace from the list to switch instantly. +Archive workspace + +## Archiving Workspaces +**Role required** - Super Admin + +- This feature is available only for self-hosted users, and only [Super Admin](/docs/user-management/role-based-access/super-admin) can archive workspaces. A Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance +- To archive a workspace, at least one active workspace must exist in the instance. + +- **Impact** + - The apps within the archived workspace will no longer be accessible through the URL. + - Users without access to any active workspace will be logged out. + +- To archive a workspace: + +1. Go to **Settings** > **All Workspaces**. ( Example URL - `https://app.corp.com/instance-settings/all-workspaces`) +2. A table listing all workspaces will appear. +3. Click the Archive button to open a confirmation modal. Once you confirm, the selected workspace will be archived. + + +Archive workspace + +## Unarchive Workspace + +**Role required** - Super Admin + +- To unarchive a workspace: + +1. Go to **Settings** > **All Workspaces**. ( Example URL - `https://app.corp.com/instance-settings/all-workspaces`) +2. A table displaying all workspaces will appear. Click on the Archived tab to view archived workspaces. +3. Click the Unarchive button to unarchive the selected workspace. + +## Workspace Admin + +- A Workspace has a three predefined roles, Admins, Builders and Endusers with predefined permissions. Checkout the [users and groups](/docs/user-management/role-based-access/user-roles) docs for more details. +- The user who creates a workspace is automatically assigned as its **Admin**. +- An **Admin** can: + - Manage users, groups, data and apps within each workspace. + - Configure authentication methods for their workspaces. + +Admin user has access to all the permission at workspace level, while an end user can only view and use the released apps they are given access to and permissions can be configured for a builder. + +| Permission | Admin | Builder | End User | +|:------------------------------|:-----:|:-------:|:--------:| +| App | ✅ | Configurable | ❌ | +| Data sources | ✅ | Configurable | ❌ | +| Folder | ✅ | Configurable | ❌ | +| Workspace constants/variables | ✅ | Configurable | ❌ | + + +## FAQ + +
    + + **Q. Can applications and workspace settings be shared between workspaces?** + +**No**, applications and workspace settings cannot be shared directly between workspaces. Each workspace operates independently, maintaining its own applications and configurations. However, you can **export an application** from one workspace and **import it** into another. For more details, refer to the [Import and Export Applications](/docs/app-builder/importing-exporting-applications/) documentation. + +
    + +
    + + **Q. Do users have access to all workspaces by default?** + +**No**, users need to be **invited** to a specific workspace to access the apps and data within that workspace. Refer to [invite users](/docs/user-management/role-based-access/user-roles) documentation for more details + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-api.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-api.md new file mode 100644 index 0000000000..4cac44ad87 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-api.md @@ -0,0 +1,1368 @@ +--- +id: tooljet-api +title: ToolJet API +--- + +
    + Icon + Paid feature +
    + +ToolJet API allows you to interact with the ToolJet platform programmatically. You can use the APIs to manage users and their workspaces relations. The API endpoints are secured with an access token. You can perform various operations using the API such as: + +- [Get All Users](#get-all-users) +- [Get All Workspaces](#get-all-workspaces) +- [Get All App Details](#get-all-app-details) +- [Get User by ID](#get-user-by-id) +- [Create User](#create-user) +- [Update User](#update-user) +- [Update User Role](#update-user-role) +- [Replace User Workspace](#replace-user-workspace) +- [Replace User Workspaces Relations](#replace-user-workspaces-relations) +- [Export Application](#export-application) +- [Import Application](#import-application) + +## Enabling ToolJet API + +By default, the ToolJet API is disabled. To enable the API, add these variables to your `.env` file: + +| variable | description | +| :-----------------------: | :---------------------------------------------: | +| ENABLE_EXTERNAL_API | `true` or `false` | +| EXTERNAL_API_ACCESS_TOKEN | `` (To authenticate API requests) | + +## Security + +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' \ +-H 'Authorization: Basic ' \ +-H 'Content-Type: application/json' + +``` + +
    + +## API Endpoints + +### Get All Users + + - **Description:** Retrieves a list of all the users. + - **URL:** `/api/ext/users` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Response:** Array of User objects. + +
    + **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": "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" + } + ] + } + ] + } + ] +``` +
    + +### Get All Workspaces + + - **Description:** Retrieves a list of all workspaces. + - **URL:** `/api/ext/workspaces` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Response:** Array of Workspace objects. + +
    +Response Example + +```json +[ + { + "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" + } + ] + } +] +``` + +
    + +### Get All App Details + + - **Description:** Get the app details for all the applications in the workspace. + - **URL:** `/api/ext/workspace/:workspace_id/apps` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - **workspace_id**: The ID of the workspace. + - **Response:** Array of app details for all the applications in the workspace. + +
    + **Response Example** + ```json + [ + { + "id": "ae06cc7a-2922-4fe7-9064-462741558813", + "name": "Applicant tracking system", + "slug": "ae06cc7a-2922-4fe7-9064-462741558813", + "versions": [ + { + "id": "37be6442-ca1b-4a5a-a6f4-f929e00a0ac1", + "name": "v1" + }, + { + "id": "be8a96c3-f7a4-4f82-b282-23678c52c973", + "name": "v3" + }, + { + "id": "19405d8c-be75-47ad-aa96-36f2b1728e77", + "name": "v2" + }, + { + "id": "15bd421d-54ce-44d5-8eef-39911fc2d4cb", + "name": "v4" + } + ] + }, + { + "id": "b68f87ca-6620-4cbf-83d6-becf073d8e96", + "name": "Aws Tracker", + "slug": "b68f87ca-6620-4cbf-83d6-becf073d8e96", + "versions": [ + { + "id": "466a1cc4-62cf-4b46-b71d-114af61c04ca", + "name": "v1" + }, + { + "id": "b65f1ae2-3702-4cba-91f3-3e5bddd55dbc", + "name": "v2" + } + ] + } + ] + ``` +
    + +### Get User by ID + + - **Description:** Returns a user by their ID. + - **URL:** `/api/ext/user/:id` + - **Method:** GET + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - **Response:** User object. + +
    + **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": "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" + } + ] + } + ] +} +``` +
    + +### Create User + + - **Description:** Creates a new user. + - **URL:** `/api/ext/users` + - **Method:** POST + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Body:** The body object can contain the following fields: + - `name` (string, required): The name of the user. + - `email` (string, required): The email address of the user. + - `password` (string, optional): The user's password. Must be between 5 and 100 characters. + - `status` (string, optional): The status of the user. Can be either `active` or `archived`. Defaults to `archived` if not provided. + - `workspaces` (array, required): An array of workspace objects associated with the user. Each workspace object should contain: + - `id` (string, required): The unique identifier of the workspace. + - `name` (string, required): The name of the workspace. + - `status` (string, optional): The status of the workspace. Can be either `active` or `archived`. + - `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`. + +
    + **Request Body Example** +```json +{ + "name": "Alice Johnson", + "email": "alice@example.com", + "password": "qwy@4xt123", + "status": "active", + "workspaces": [ + { + "name": "team-spac", + "status": "active", + "groups": [ + { + "name": "all_users" + } + ] + } + ] +} +``` +
    + - **Response:** `201 Created` + +### Update User + + - **Description:** Finds and updates a user by their ID. + - **URL:** `/api/ext/user/:id` + - **Method:** PATCH + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - **Body:** The body object can contain the following fields: + - `name` (string, optional): The updated name of the user. + - `email` (string, optional): The updated email address of the user. + - `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`. + + +
    + +Request Body Example + +```json +{ + "name": "Jane Doe", + "email": "jane.doe@example.com", + "password": "newsecurepassword", + "status": "active" +} +``` + +
    + + - **Response:** `200 OK` + +### Update User Role + + - **Description:** Updates the user role for a particular workspace. + - **URL:** `/api/ext/update-user-role/workspace/workspaceId` + - **Method:** PUT + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - workspaceId (string): The unique identifier of the workspace. + - **Body:** The body object can contain the following fields: + - `newRole` (string, required): The updated user role of the user. + - `userId` (string, required): The unique identifier of the user. + + +
    + +Request Body Example + +```json +{ + "newRole": "end-user", + "userId": "f2065dd1-e5ea-4793-af91-4a8831de68e6" +} +``` + +
    + + - **Response:** `200 OK` + +### Replace User Workspaces Relations + + - **Description:** Replaces all workspaces relations associated with a user. + - **URL:** `/api/ext/user/:id/workspaces` + - **Method:** PUT + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - **Body:** Array of workspace data transfer objects. It may contain the following fields: + - `id` (string, required): The unique identifier of the workspace. + - `name` (string, required): The name of the workspace. + - `status` (string, optional): The status of the workspace. Can be either `active` or `archived`. + - `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`. + - **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` + - **Method:** PATCH + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - id (string): The ID of the user. + - workspaceId (string): The ID of the workspace. + - **Body:** The body object can contain the following fields: + - `id` (string, optional): The ID of the workspace. + - `name` (string, optional): The updated name of the workspace. + - `status` (string, optional): The updated status of the workspace. Can be either `active` or `archived`. + - `groups` (array, optional): An array of group objects associated with the workspace. Each group object can contain: + - `id` (string, optional): The ID of the group. + - `name` (string, optional): The name of the group. + +
    + +Request Body Example + +```json +{ + "status": "archived", + "groups": [ + { + "name": "all_users" + } + ] +} +``` + +
    + - **Note:** If no body is given or body is an empty object, it will not do anything. + - **Response:** `200 OK` + +### 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 + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - **workspace_id**: The ID of the workspace. + - **app_id**: The ID of the application. + - **Query Params:** + - **exportTJDB** (boolean): Specifies whether to export TJDB data or not. By default **true**. + - **appVersion** (string): Accepts a specific version of the application that is to be exported. + - **exportAllVersions** (boolean): Defines whether to export all the available versions. By default it exports the latest version of the app. + - **Response:** Exported application json. + +
    +Response Example + +```json +{ + "app": [ + { + "definition": { + "appV2": { + "type": "front-end", + "id": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "name": "ToolJet API Application", + "slug": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "isPublic": false, + "isMaintenanceOn": false, + "icon": "home", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "currentVersionId": null, + "userId": "3ca0bd7a-b8e0-40d9-a2d8-2c7531dc3bee", + "workflowApiToken": null, + "workflowEnabled": false, + "createdAt": "2025-02-28T06:21:34.962Z", + "creationMode": "DEFAULT", + "updatedAt": "2025-02-28T06:21:34.961Z", + "editingVersion": { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + }, + "components": [ + { + "id": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "name": "table1", + "type": "Table", + "pageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "parent": null, + "properties": { + "title": { + "value": "Table" + }, + "visible": { + "value": "{{true}}" + }, + "loadingState": { + "value": "{{false}}" + }, + "data": { + "value": "{{ [ \n\t\t{ id: 1, name: 'Olivia Nguyen', email: 'olivia.nguyen@example.com', date: '15/05/2022', mobile_number: 9876543210, interest: ['Reading', 'Traveling','Photography'], photo: 'https://reqres.in/img/faces/7-image.jpg' }, \n\t\t{ id: 2, name: 'Liam Patel', email: 'liam.patel@example.com', date: '20/09/2021', mobile_number: 8765432109, interest: ['Cooking','Gardening','Hiking'], photo: 'https://reqres.in/img/faces/5-image.jpg' }\n] }}" + }, + "useDynamicColumn": { + "value": "{{false}}" + }, + "columnData": { + "value": "{{[{name: 'email', key: 'email', id: '1'}, {name: 'Full name', key: 'name', id: '2', isEditable: true}]}}" + }, + "rowsPerPage": { + "value": "{{10}}" + }, + "serverSidePagination": { + "value": "{{false}}" + }, + "enableNextButton": { + "value": "{{true}}" + }, + "enablePrevButton": { + "value": "{{true}}" + }, + "totalRecords": { + "value": "{{10}}" + }, + "enablePagination": { + "value": "{{true}}" + }, + "serverSideSort": { + "value": "{{false}}" + }, + "serverSideFilter": { + "value": "{{false}}" + }, + "displaySearchBox": { + "value": "{{true}}" + }, + "showDownloadButton": { + "value": "{{true}}" + }, + "showFilterButton": { + "value": "{{true}}" + }, + "autogenerateColumns": { + "value": true, + "generateNestedColumns": true + }, + "isAllColumnsEditable": { + "value": "{{false}}" + }, + "columns": { + "value": [ + { + "name": "id", + "id": "e3ecbf7fa52c4d7210a93edb8f43776267a489bad52bd108be9588f790126737", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 30, + "columnType": "string" + }, + { + "name": "photo", + "key": "photo", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a2", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "image", + "objectFit": "contain", + "borderRadius": "100", + "columnSize": 70 + }, + { + "name": "name", + "id": "5d2a3744a006388aadd012fcc15cc0dbcb5f9130e0fbb64c558561c97118754a", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 130, + "columnType": "string" + }, + { + "name": "email", + "id": "afc9a5091750a1bd4760e38760de3b4be11a43452ae8ae07ce2eebc569fe9a7f", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 230, + "columnType": "string" + }, + { + "name": "date", + "id": "27b75c8af9d34d1eaa1f9bb7f8f9f7b0abf1823e799748c8bb57e74f53b2c1dc", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "datepicker", + "isTimeChecked": false, + "dateFormat": "DD/MM/YYYY", + "parseDateFormat": "DD/MM/YYYY", + "isDateSelectionEnabled": true, + "columnSize": 130 + }, + { + "name": "mobile_number", + "id": "9c2e3c40572a4aefb8e179ee39a0e1ac9dc2b2e6634be56e1c05be13c3d1de56", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "number", + "columnSize": 140 + }, + { + "name": "interest", + "key": "interest", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a1", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "newMultiSelect", + "columnSize": 300, + "options": [ + { + "label": "Reading", + "value": "Reading" + }, + { + "label": "Traveling", + "value": "Traveling" + }, + { + "label": "Photography", + "value": "Photography" + }, + { + "label": "Music", + "value": "Music" + }, + { + "label": "Cooking", + "value": "Cooking" + }, + { + "label": "Crafting", + "value": "Crafting" + }, + { + "label": "Voluntering", + "value": "Voluntering" + }, + { + "label": "Garndening", + "value": "Garndening" + }, + { + "label": "Dancing", + "value": "Dancing" + }, + { + "label": "Hiking", + "value": "Hiking" + } + ] + } + ] + }, + "showBulkUpdateActions": { + "value": "{{true}}" + }, + "showBulkSelector": { + "value": "{{false}}" + }, + "highlightSelectedRow": { + "value": "{{false}}" + }, + "columnSizes": { + "value": "{{({})}}" + }, + "actions": { + "value": [] + }, + "enabledSort": { + "value": "{{true}}" + }, + "hideColumnSelectorButton": { + "value": "{{false}}" + }, + "defaultSelectedRow": { + "value": "{{{\"id\":1}}}" + }, + "showAddNewRowButton": { + "value": "{{true}}" + }, + "allowSelection": { + "value": "{{true}}" + }, + "visibility": { + "value": "{{true}}" + }, + "disabledState": { + "value": "{{false}}" + } + }, + "general": {}, + "styles": { + "textColor": { + "value": "#000" + }, + "columnHeaderWrap": { + "value": "fixed" + }, + "actionButtonRadius": { + "value": "0" + }, + "cellSize": { + "value": "regular" + }, + "borderRadius": { + "value": "8" + }, + "tableType": { + "value": "table-classic" + }, + "maxRowHeight": { + "value": "auto" + }, + "maxRowHeightValue": { + "value": "{{0}}" + }, + "contentWrap": { + "value": "{{true}}" + }, + "boxShadow": { + "value": "0px 0px 0px 0px #00000090" + }, + "padding": { + "value": "default" + } + }, + "generalStyles": { + "boxShadow": { + "value": "0px 0px 0px 0px #00000040" + } + }, + "displayPreferences": { + "showOnDesktop": { + "value": "{{true}}" + }, + "showOnMobile": { + "value": "{{false}}" + } + }, + "validation": {}, + "createdAt": "2025-02-28T06:21:45.706Z", + "updatedAt": "2025-02-28T06:23:49.872Z", + "layouts": [ + { + "id": "f72adb7f-708c-4c5f-9a3b-be9467f7dcc0", + "type": "mobile", + "top": 180, + "left": 18, + "width": 35, + "height": 456, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:21:45.706Z" + }, + { + "id": "d6c8807f-dde5-4d0a-83f3-2a8036c4c147", + "type": "desktop", + "top": 30, + "left": 2, + "width": 39, + "height": 630, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:23:32.534Z" + } + ] + } + ], + "pages": [ + { + "id": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "name": "Home", + "handle": "home", + "index": 1, + "disabled": null, + "hidden": null, + "icon": null, + "createdAt": "2025-02-28T06:21:34.961Z", + "updatedAt": "2025-02-28T06:21:36.766Z", + "autoComputeLayout": true, + "appVersionId": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "pageGroupIndex": 1, + "pageGroupId": null, + "isPageGroup": false + } + ], + "events": [], + "dataQueries": [], + "dataSources": [], + "appVersions": [ + { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + } + ], + "appEnvironments": [ + { + "id": "60eff059-202a-4c12-ae12-507874f9191d", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "development", + "isDefault": false, + "priority": 1, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "48aa7f50-8709-4ae1-92cd-049b2aa22080", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "staging", + "isDefault": false, + "priority": 2, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "8f0a5c41-cea1-452a-b27c-e93337b567bd", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "production", + "isDefault": true, + "priority": 3, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + } + ], + "dataSourceOptions": [], + "schemaDetails": { + "multiPages": true, + "multiEnv": true, + "globalDataSources": true + } + } + } + } + ], + "tooljet_version": "3.5.11-cloud-lts" +} +``` + +
    + +### 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 + - **Authorization:** `Basic ` + - **Content-Type:** `application/json` + - **Params:** + - **workspace_id**: The ID of the workspace. + - **Body:** The body object will contain following fields: + - Application JSON + - `appName` (string, optional): Defines the application name. If not defined then the app will be imported with the existing app name. + +:::info +By default, server accepts maximum JSON size as 50 MB. To increase this limit, use the following environment variable: +`MAX_JSON_SIZE` +::: + +
    + +Request Body Example + +```json +{ + "app": [ + { + "definition": { + "appV2": { + "type": "front-end", + "id": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "name": "ToolJet API Application", + "slug": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "isPublic": false, + "isMaintenanceOn": false, + "icon": "home", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "currentVersionId": null, + "userId": "3ca0bd7a-b8e0-40d9-a2d8-2c7531dc3bee", + "workflowApiToken": null, + "workflowEnabled": false, + "createdAt": "2025-02-28T06:21:34.962Z", + "creationMode": "DEFAULT", + "updatedAt": "2025-02-28T06:21:34.961Z", + "editingVersion": { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + }, + "components": [ + { + "id": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "name": "table1", + "type": "Table", + "pageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "parent": null, + "properties": { + "title": { + "value": "Table" + }, + "visible": { + "value": "{{true}}" + }, + "loadingState": { + "value": "{{false}}" + }, + "data": { + "value": "{{ [ \n\t\t{ id: 1, name: 'Olivia Nguyen', email: 'olivia.nguyen@example.com', date: '15/05/2022', mobile_number: 9876543210, interest: ['Reading', 'Traveling','Photography'], photo: 'https://reqres.in/img/faces/7-image.jpg' }, \n\t\t{ id: 2, name: 'Liam Patel', email: 'liam.patel@example.com', date: '20/09/2021', mobile_number: 8765432109, interest: ['Cooking','Gardening','Hiking'], photo: 'https://reqres.in/img/faces/5-image.jpg' }\n] }}" + }, + "useDynamicColumn": { + "value": "{{false}}" + }, + "columnData": { + "value": "{{[{name: 'email', key: 'email', id: '1'}, {name: 'Full name', key: 'name', id: '2', isEditable: true}]}}" + }, + "rowsPerPage": { + "value": "{{10}}" + }, + "serverSidePagination": { + "value": "{{false}}" + }, + "enableNextButton": { + "value": "{{true}}" + }, + "enablePrevButton": { + "value": "{{true}}" + }, + "totalRecords": { + "value": "{{10}}" + }, + "enablePagination": { + "value": "{{true}}" + }, + "serverSideSort": { + "value": "{{false}}" + }, + "serverSideFilter": { + "value": "{{false}}" + }, + "displaySearchBox": { + "value": "{{true}}" + }, + "showDownloadButton": { + "value": "{{true}}" + }, + "showFilterButton": { + "value": "{{true}}" + }, + "autogenerateColumns": { + "value": true, + "generateNestedColumns": true + }, + "isAllColumnsEditable": { + "value": "{{false}}" + }, + "columns": { + "value": [ + { + "name": "id", + "id": "e3ecbf7fa52c4d7210a93edb8f43776267a489bad52bd108be9588f790126737", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 30, + "columnType": "string" + }, + { + "name": "photo", + "key": "photo", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a2", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "image", + "objectFit": "contain", + "borderRadius": "100", + "columnSize": 70 + }, + { + "name": "name", + "id": "5d2a3744a006388aadd012fcc15cc0dbcb5f9130e0fbb64c558561c97118754a", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 130, + "columnType": "string" + }, + { + "name": "email", + "id": "afc9a5091750a1bd4760e38760de3b4be11a43452ae8ae07ce2eebc569fe9a7f", + "autogenerated": true, + "fxActiveFields": [], + "columnSize": 230, + "columnType": "string" + }, + { + "name": "date", + "id": "27b75c8af9d34d1eaa1f9bb7f8f9f7b0abf1823e799748c8bb57e74f53b2c1dc", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "datepicker", + "isTimeChecked": false, + "dateFormat": "DD/MM/YYYY", + "parseDateFormat": "DD/MM/YYYY", + "isDateSelectionEnabled": true, + "columnSize": 130 + }, + { + "name": "mobile_number", + "id": "9c2e3c40572a4aefb8e179ee39a0e1ac9dc2b2e6634be56e1c05be13c3d1de56", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "number", + "columnSize": 140 + }, + { + "name": "interest", + "key": "interest", + "id": "f23b7d134b2e490ea41e3bb8eeb8c8e37472af243bf6b70d5af294482097e3a1", + "autogenerated": true, + "fxActiveFields": [], + "columnType": "newMultiSelect", + "columnSize": 300, + "options": [ + { + "label": "Reading", + "value": "Reading" + }, + { + "label": "Traveling", + "value": "Traveling" + }, + { + "label": "Photography", + "value": "Photography" + }, + { + "label": "Music", + "value": "Music" + }, + { + "label": "Cooking", + "value": "Cooking" + }, + { + "label": "Crafting", + "value": "Crafting" + }, + { + "label": "Voluntering", + "value": "Voluntering" + }, + { + "label": "Garndening", + "value": "Garndening" + }, + { + "label": "Dancing", + "value": "Dancing" + }, + { + "label": "Hiking", + "value": "Hiking" + } + ] + } + ] + }, + "showBulkUpdateActions": { + "value": "{{true}}" + }, + "showBulkSelector": { + "value": "{{false}}" + }, + "highlightSelectedRow": { + "value": "{{false}}" + }, + "columnSizes": { + "value": "{{({})}}" + }, + "actions": { + "value": [] + }, + "enabledSort": { + "value": "{{true}}" + }, + "hideColumnSelectorButton": { + "value": "{{false}}" + }, + "defaultSelectedRow": { + "value": "{{{\"id\":1}}}" + }, + "showAddNewRowButton": { + "value": "{{true}}" + }, + "allowSelection": { + "value": "{{true}}" + }, + "visibility": { + "value": "{{true}}" + }, + "disabledState": { + "value": "{{false}}" + } + }, + "general": {}, + "styles": { + "textColor": { + "value": "#000" + }, + "columnHeaderWrap": { + "value": "fixed" + }, + "actionButtonRadius": { + "value": "0" + }, + "cellSize": { + "value": "regular" + }, + "borderRadius": { + "value": "8" + }, + "tableType": { + "value": "table-classic" + }, + "maxRowHeight": { + "value": "auto" + }, + "maxRowHeightValue": { + "value": "{{0}}" + }, + "contentWrap": { + "value": "{{true}}" + }, + "boxShadow": { + "value": "0px 0px 0px 0px #00000090" + }, + "padding": { + "value": "default" + } + }, + "generalStyles": { + "boxShadow": { + "value": "0px 0px 0px 0px #00000040" + } + }, + "displayPreferences": { + "showOnDesktop": { + "value": "{{true}}" + }, + "showOnMobile": { + "value": "{{false}}" + } + }, + "validation": {}, + "createdAt": "2025-02-28T06:21:45.706Z", + "updatedAt": "2025-02-28T06:23:49.872Z", + "layouts": [ + { + "id": "f72adb7f-708c-4c5f-9a3b-be9467f7dcc0", + "type": "mobile", + "top": 180, + "left": 18, + "width": 35, + "height": 456, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:21:45.706Z" + }, + { + "id": "d6c8807f-dde5-4d0a-83f3-2a8036c4c147", + "type": "desktop", + "top": 30, + "left": 2, + "width": 39, + "height": 630, + "componentId": "ebe9d705-a0df-4dbb-9bf3-ab28cab12ae3", + "dimensionUnit": "count", + "updatedAt": "2025-02-28T06:23:32.534Z" + } + ] + } + ], + "pages": [ + { + "id": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "name": "Home", + "handle": "home", + "index": 1, + "disabled": null, + "hidden": null, + "icon": null, + "createdAt": "2025-02-28T06:21:34.961Z", + "updatedAt": "2025-02-28T06:21:36.766Z", + "autoComputeLayout": true, + "appVersionId": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "pageGroupIndex": 1, + "pageGroupId": null, + "isPageGroup": false + } + ], + "events": [], + "dataQueries": [], + "dataSources": [], + "appVersions": [ + { + "id": "ab40f07f-96c7-4283-afb8-8cd88df7b195", + "name": "v1", + "definition": null, + "globalSettings": { + "hideHeader": false, + "appInMaintenance": false, + "canvasMaxWidth": 100, + "canvasMaxWidthType": "%", + "canvasMaxHeight": 2400, + "canvasBackgroundColor": "#edeff5", + "backgroundFxQuery": "", + "appMode": "auto" + }, + "pageSettings": null, + "showViewerNavigation": true, + "homePageId": "c7099c38-5e2a-4e68-9e30-9005f881d75b", + "appId": "ab65b201-4207-4876-a8a6-fdcbf31661b6", + "currentEnvironmentId": "60eff059-202a-4c12-ae12-507874f9191d", + "promotedFrom": null, + "createdAt": "2025-02-28T06:21:34.974Z", + "updatedAt": "2025-02-28T06:21:34.961Z" + } + ], + "appEnvironments": [ + { + "id": "60eff059-202a-4c12-ae12-507874f9191d", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "development", + "isDefault": false, + "priority": 1, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "48aa7f50-8709-4ae1-92cd-049b2aa22080", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "staging", + "isDefault": false, + "priority": 2, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + }, + { + "id": "8f0a5c41-cea1-452a-b27c-e93337b567bd", + "organizationId": "45892c81-c1f0-48c6-8875-c2e4fca516f8", + "name": "production", + "isDefault": true, + "priority": 3, + "enabled": true, + "createdAt": "2024-08-22T10:34:39.181Z", + "updatedAt": "2024-08-22T10:34:39.181Z" + } + ], + "dataSourceOptions": [], + "schemaDetails": { + "multiPages": true, + "multiEnv": true, + "globalDataSources": true + } + } + } + } + ], + "tooljet_version": "3.5.11-cloud-lts", + "appName": "ToolJet API Application" +} +``` + +
    + + - **Response:** `201 Created` \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/access-values.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/access-values.md new file mode 100644 index 0000000000..f23e931942 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/access-values.md @@ -0,0 +1,40 @@ +--- +id: how-to-access-values +title: Access Values +--- + + +In ToolJet, double curly braces `{{}}` can be used to retrieve data returned by queries, access values related to components and pass custom code. You can see the list of all accessible values in the **[Inspector](/docs/how-to/use-inspector/)** tab in the left sidebar. + +
    + +
    + +
    + +## Accessing Values + +The **queries** keyword can be used to access data returned by queries. For example:`{{queries.getSalesData.data}}` + +Similarly, the **components** keyword can be used to access data in the components and other component-related variables. For example: `{{components.table1.selectedRow.id}}`. + +
    + Check Available Values Using Inspector +
    + + +
    + +
    + +### Writing Custom Code + +You can write custom JavaScript code to set colors, enable or disable toggles and more by passing in JavaScript code inside double curly braces. To change Background Color of a button based on the light or dark theme using **fx** (next to properties in properties panel), you can use a code that returns a string value of hex code.
    + +For example, `{{globals.theme.name == "light" ? "#375FCF" : "#FFFFFF"}}` + +Similary, to enable or disable a button based on user input using **fx**, you can write a JavaScript code that returns true or false.
    + +For example, `{{components.form1.data.textinput1 == "" ? true : false}}`. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/actions.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/actions.md new file mode 100644 index 0000000000..3c0fafa224 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/actions.md @@ -0,0 +1,31 @@ +--- +id: actions +title: Actions +--- + +In ToolJet, actions are versatile functions that can be triggered by events within an app. Based on user interaction, actions can be configured to display alerts, run queries, switch pages, and perform other tasks. + +
    + +
    + +
    + +## Types of Actions +ToolJet supports a variety of actions. For instance, Show alert action displays a pop-up message, Run query executes data queries you've created, and Open webpage directs to a new webpage. Some of the other actions include navigating to another ToolJet app, managing modals, copying text to the clipboard, setting values in localStorage, and generating downloadable files from application data. + +
    + Preview Of Actions +
    + +
    + +
    + +## Ways to Configure Actions + +Actions can be triggered in response to various events, such as button presses or successful query executions. To set up actions, you can establish a **[new event](/docs/tooljet-concepts/what-are-events/)** within the configuration settings of any component or query. Alternatively, for more dynamic interactions, you can utilize a **[RunJS query](/docs/how-to/run-actions-from-runjs/)**. This approach enables action triggering based on user interactions or even at designated time intervals. + +
    + +Checkout all the available actions under the **[Actions Reference](/docs/actions/show-alert)** dropdown for more information. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/component-specific-actions.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/component-specific-actions.md new file mode 100644 index 0000000000..9099096ae9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/component-specific-actions.md @@ -0,0 +1,12 @@ +--- +id: component-specific-actions +title: Component Specific Actions +--- + +Component Specific Actions are specialized actions that are unique to each component, meaning they can perform tasks that are specific only to that component. For instance, the **Text Input** component has its own set of specific actions like `setText` that allows us to set the value of the component. Component Specific Actions actions can be triggered in two ways: through event handlers or by executing RunJS code. + +
    + +
    + +Read more about how you can utilize Component Specific Actions **[here](/docs/actions/control-component/)**. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/components.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/components.md new file mode 100644 index 0000000000..0b57790af8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/components.md @@ -0,0 +1,51 @@ +--- +id: what-are-components +title: Components +--- + +Components in ToolJet serve as the building blocks for creating applications. They are pre-designed elements that you can drag and drop onto the canvas in the App-Builder. ToolJet comes with 45+ built-in components. + +
    + +
    + +
    + +### Customizing Components + +Components are highly customizable and interactive. Once you place a component on the canvas, you can easily modify its properties, styles, and behaviors through the properties panel on the right side of the App-Builder. This allows you to make your application dynamic and responsive. + +
    + Component Configuration +
    + +
    + +
    + +### Using Components With Data + +In ToolJet, components can be easily connected to various data sources like databases, APIs, and third-party services through **[queries](what-are-queries)**. Once the data is fetched, you can bind it to components like tables, charts, and more. + +
    + Adding Data To Component +
    + +
    + +
    + +## Custom Components + +ToolJet allows for the creation of custom components using React. This feature is invaluable for developers who require functionalities beyond the 45+ built-in components that ToolJet offers. To create a custom component, you can drag and drop a **[Custom Component](/docs/widgets/custom-component/)** on the canvas and configure its data and code. + +
    + Custom Components +
    +By incorporating custom React components, you can significantly extend the capabilities of your ToolJet applications, allowing for a more tailored and unique user experience. + +
    + + +To explore the full list of components in ToolJet, go through the **[Component Library](/docs/widgets/bounded-box)**. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/data-sources.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/data-sources.md new file mode 100644 index 0000000000..77eca0aa03 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/data-sources.md @@ -0,0 +1,36 @@ +--- +id: what-are-datasources +title: Data Sources +--- + +Data sources are pivotal as they enable us to fetch and send data to and from different sources including databases, external APIs, or services. Once a data source is configured, it can be shared across all apps within a workspace. + +
    + +
    + +
    + +## Types and Management of Data Sources + +Apart from its built-in database, ToolJet supports a range of external data sources which can be broadly categorized into databases, external APIs, and services. To manage these data sources, ToolJet provides a data source manager that can be opened by clicking on the **Data Sources** button located on the left-sidebar of the App-Builder. + +
    + Data Source Manager +
    + +
    + +
    + +## Adding a Data Source + +Adding a new data source is as easy as filling out a form; users can click on the Data Sources button in the left-sidebar, navigate to the required data source, click on the corresponding **Add** button and enter the credentials. + +
    + Configuring Data Source +
    + +
    + +To see a full list of compatible data sources and their set up details, checkout the **[Datasource Catalog](/docs/data-sources/overview)**. diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/events.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/events.md new file mode 100644 index 0000000000..60aa00a918 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/events.md @@ -0,0 +1,31 @@ +--- +id: what-are-events +title: Events +--- + +Events are used to run queries, show alerts and other functionalities based on triggers such as button clicks or query completion. Events can be chained together to run a series of logical operations. For example, the completion of one query could trigger another event that runs a second query, and so on. This way, a single user interaction, like clicking a button, could set off a chain of events. + +
    + +
    + +
    + +## Triggering Events +Suppose you have a query that refreshes data when a user clicks on a button, and you also want to display a pop-up alert upon successful data refresh. In ToolJet, you can configure an event to trigger a query upon clicking the button, followed by another event to display a pop-up alert confirming the successful data refresh after the query execution is completed. + +
    + Event Configuration +
    + +
    + +
    + +## Setting Up Event Handlers + +Setting up event handlers to manage such triggers and responses is a straightforward process in ToolJet. For instance, to set up an event that triggers on the click of a button, you simply navigate to the button component's configuration, click on **New Event Handler**, and define the Event and the Action to be taken. The actions could range from running a query, showing an alert, or even switching to a different page. + +
    + +For detailed information about the events related to components, please refer to their respective documentation. diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/exposed-variables.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/exposed-variables.md new file mode 100644 index 0000000000..9a4e20b408 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/exposed-variables.md @@ -0,0 +1,19 @@ +--- +id: exposed-variables +title: Exposed Variables +--- + +Exposed Variables help in accessing and manipulating data within components. These variables are automatically created and updated as users interact with the application. Whether it's capturing text from a text editor, checking the visibility of a component or retrieving selections from a dropdown menu, exposed variables are integral for dynamic data handling in ToolJet applications. + +
    + +
    + +
    + +## Accessing Exposed Variables +Each component in ToolJet has its own set of exposed variables, which hold specific data related to that component. For example, in the Text Input component, the `value` variable is used. This variable is updated every time a user enters something in the text editor. It can be dynamically accessed using JavaScript notation: `{{components.textinput1.value}}`. This feature allows developers to easily track and utilize the data entered by users in real-time. + +
    + +For detailed information about the exposed variables of the components, please refer to their respective documentation. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/inspector.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/inspector.md new file mode 100644 index 0000000000..cc0c53c977 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/inspector.md @@ -0,0 +1,25 @@ +--- +id: inspector +title: Inspector +--- + +ToolJet's Inspector is a valuable feature for viewing data related to various elements of your application. This includes information about queries, components, global variables, page-related variables, user-set variables, and constants. + +
    + +
    + + + +
    + +## Sections In Inspector +The Inspector panel is divided into six main sections: **Queries, Components, Globals, Variables, Page,** and **Constants**. In the Queries section, you can check the details of your executed queries. The Components section helps you check properties related to each component in your app. Globals provide important overall information about your app, like user details and settings. The Variables section shows custom variables you've set. In the Page section, you can see properties specific to each page. Lastly, Constants hold fixed values like API keys, ensuring consistency across your application. + +
    + Preview Of The Inspector Tab +
    + +
    + +To learn more about the Inspector option in the sidebar, go through this **[how-to](/docs/how-to/use-inspector)** guide. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/pages.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/pages.md new file mode 100644 index 0000000000..89e9a3a86a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/pages.md @@ -0,0 +1,30 @@ +--- +id: pages +title: Pages +--- + +ToolJet allows you to create multi-page applications. By using the **Pages** panel on the left sidebar of the app-builder, you can create, manage and navigate through different pages of your application. The ability to create multiple pages allows for diverse functionalities within a single app. + +
    + +
    + +
    + +## Managing Pages +The Pages panel provides several options for managing your pages. You can add new pages by clicking the `+` button on the Pages header. Each new page can be named and customized. The Settings option lets you hide the page navigation sidebar. Additionally, the Pages panel also offers various page-specific options like renaming, marking a page as the home page, hiding or duplicating pages, and adding event handlers. + +
    + Preview Of Pages Panel +
    + +
    + +
    + +## Advanced Page Features +ToolJet's Pages panel also includes advanced features like Page Handle, which is the unique slug at the end of the application URL, and can be customized. Pages can be set as the default landing (home) page, or hidden from the page navigation menu. You can duplicate pages, making exact copies for different uses or even add event handlers. Furthermore, pages can be disabled or deleted, with certain restrictions like the inability to delete a home page. + +
    + +To understand each functionality associated with Pages, read this **[document](/docs/tutorial/pages/)**. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/permissions.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/permissions.md new file mode 100644 index 0000000000..4e0635a91a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/permissions.md @@ -0,0 +1,27 @@ +--- +id: permissions +title: User Groups +--- + +ToolJet employs a Role-Based Access Control (RBAC) system to manage security and access to its resources, which include apps, folders, and workspace variables. In this system, Admins have the authority to invite Users to their workspaces and assign them to specific Groups. Each Group is associated with a set of Permissions that dictate what level of access its members have to various resources. + +
    + +
    + +
    + +## Groups and User Roles + +ToolJet provides a set of default user roles (e.g., Admin, Builder, End-user) and the ability to create custom groups (e.g., Support, Engineering, Finance) for more granular access control. These groups and roles determine the level of access a user has to resources within the workspace. + +
    + +
    + +## Setting Permissions Based on Groups and Permissions +To secure your applications in ToolJet, you can leverage Groups and Permissions. For instance, you could create a custom group named Finance Team and assign it permissions to only access financial apps and constants within the workspace. When you invite new users, you can directly assign them to this group, ensuring they only have access to the resources they need to perform their tasks. You can also make the app public and make it accessible to users without the need to log in. + +
    + +Read more about managing users and groups **[here](/docs/user-management/role-based-access/user-roles)**. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/queries.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/queries.md new file mode 100644 index 0000000000..47f0fdeb3f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/queries.md @@ -0,0 +1,40 @@ +--- +id: what-are-queries +title: Queries +--- + +
    + +**Queries** act as a bridge between the application and data sources. Queries help interact with data sources like databases or APIs. They fetch or update data based on events like button clicks, making apps dynamic. + +
    + +
    + +
    + +
    + +## Creation and Management + +**Query Panel** is the hub for creating and managing queries to interact with connected data sources. Located at the bottom of the app-builder, it allows users to perform API requests, database queries, and data manipulations using JavaScript and Python. The Query Panel is divided into two main sections: on the left, the **Query Manager** allows for the listing and management of queries; on the right, the **Query Editor** provides the functionality to construct queries either through a low-code interface or by manually entering the query text. + +
    + ToolJet Concepts: Queries +
    + +
    + +
    + +## Execution and Interaction + +Queries run when triggered by app events, such as clicking a button. They can fetch new data or change existing data, and the results can be displayed in the app using tables or charts. This makes data interaction in your app straightforward and effective. + +
    + Platform Overview +
    + +
    + +Learn more about queries in this **[detailed guide](/docs/app-builder/query-panel/)** for Query Panel. diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/run-js.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/run-js.md new file mode 100644 index 0000000000..5a77644863 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/run-js.md @@ -0,0 +1,35 @@ +--- +id: run-js +title: Run JavaScript code +--- + +The **Run JavaScript code** query in ToolJet enables users to write and execute custom JavaScript code within their applications. It provides a flexible way to add custom logic and interact with various components. Whether it’s transforming data, manipulating component properties, or performing actions based on certain conditions, Run JavaScript code significantly enhances the capabilities of your ToolJet applications. + +
    + +
    + +
    + +## Interacting with Components and Actions +The JavaScript code you write can interact with various components of the ToolJet application. For example, you could attach an event handler to a button so that when it's clicked, it triggers Run Javascript code to run. Additionally, you can construct the JavaScript code to manipulate the properties of other components. This allows for dynamic interactions within your application. + +
    + Preview Of Run JS +
    + +
    + +
    + +## Advanced Features and Libraries +Run JavaScript code also supports advanced functionalities such as setting and unsetting variables, showing or closing modals, copying content to the clipboard, and even logging out users. This is done by using specific syntax and functions. Moreover, you can utilize libraries like Moment, Lodash, and Axios for more complex operations. + +
    + +To learn more about Run JavaScript code, go through the below list of documents: + +- **[Use Axios in RunJS](/docs/how-to/use-axios-in-runjs/)** +- **[Run Actions From RunJS](/docs/how-to/run-actions-from-runjs/)** +- **[Import External Libraries Using RunJS](/docs/how-to/import-external-libraries-using-runjs/)** +- **[Access a User's Location Using RunJS](/docs/how-to/access-users-location/)** diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/styling-components.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/styling-components.md new file mode 100644 index 0000000000..4d003923ee --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/styling-components.md @@ -0,0 +1,33 @@ +--- +id: styling-components +title: Styling Components +--- + +Styling components in ToolJet is a straightforward yet powerful way to enhance the visual appeal and usability of your application. Once you've dragged and dropped a component onto the canvas in the App-Builder, you can access its styling options through the properties panel on the right side. The **Styles** tab on the properties panel allows you to modify various visual properties such as colors, fonts, borders, and dimensions. You can also apply conditional styling based on data or user interactions, enabling you to create a more dynamic and responsive user interface. + +
    + +
    + +
    + +## Styling Options +The styling options in ToolJet are designed to be intuitive, eliminating the need for extensive CSS or design experience. You can easily change the background color of a button, adjust the font size of a text field, or add padding and margins to layout components. These styling changes are immediately reflected on the canvas, providing real-time feedback as you build your application. + +
    + Styling Options +
    + +
    + +
    + +## Custom CSS +By injecting **Custom CSS**, users can easily override default styles, offering a straightforward and efficient approach to visual customization. To add Custom Styles, users can navigate to the **Custom styles** tab under Workspace Settings in the ToolJet dashboard. For instance, changing the default color of a button involves identifying the component's class and applying the desired CSS changes on the Custom Styles page. This approach ensures that all instances of the app reflect the new styling, like changing button colors, without the need to edit each button individually. This ensures consistent theming across the workspace. + +
    + +Continue reading about Custom CSS **[here](/docs/app-builder/customstyles/)**. + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/super-admin.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/super-admin.md new file mode 100644 index 0000000000..cffb817656 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/super-admin.md @@ -0,0 +1,11 @@ +--- +id: super-admin +title: Super Admin +--- + +The Super Admin in ToolJet plays a critical role in managing the instance by having full access to all workspaces, users, and groups. Super Admins differ significantly from standard Admins, possessing a broader range of privileges. They can manage users in any workspace, including archiving or unarchiving them, and have unrestricted access to all workspaces. This allows Super Admins to create, edit, or delete apps in any user's personal workspace. They also have the authority to access and modify the ToolJet database across all workspaces, an ability not granted to regular Admins. + +## Advanced Control and Customization +Beyond regular management tasks, Super Admins can implement more intricate settings like white labeling, enabling multiplayer editing, and managing instance licenses. They also have the power to restrict personal workspace creation for users, ensuring tighter control over the workspace environment. These advanced capabilities underscore the Super Admin's pivotal role in overseeing the comprehensive management and customization of the ToolJet instance. + +Read more about super admins **[here](/docs/user-management/role-based-access/super-admin)**. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/variables.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/variables.md new file mode 100644 index 0000000000..6e5a930c66 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/variables.md @@ -0,0 +1,57 @@ +--- +id: variables +title: Variables +--- + +Variables can be used to store data that can be accessed and manipulated inside your application or across a workspace. You can create and access a variety of variables in ToolJet: + +
    + +
    + +- **Variables** that can be defined and accessed anywhere within an application +- **Page Variables** that can be defined and accessed on a particular page of the application +- **Exposed Variables** that hold important values related to a component and are accessible within an application +- **Workspace Constants** that hold sensitive information and are available across all applications in a workspace +- **Environment Variables** for environment-specific settings, streamlining app development and configuration + +
    + +## Variables and Page Variables +You can use the `setVariable(key, value)` function to define a variable in a `Run Javascript code` query while a page variable can be defined using the `setPageVariable(key, value)`. Once defined these variables can be used to define the functionality of an application. For instance, you can use the `setVariable(key, value)` function to create a variable to keep a history of pages visited by the user within the application. This can be used for implementing custom back navigation or analytics on user flow and engagement within the app. Similarly, you can create and utilize a page variable to remember a user's filter selections (e.g., date range) on a reporting page. + +
    + Preview Of Variables +
    + +
    + +
    + +## Exposed Variables +**Exposed Variables** are used to access and manipulate data related to the components. These variables are automatically created and updated as users interact with the application. Whether it's capturing text from a text editor checking the visibility of a component, or retrieving selections from a dropdown menu, exposed variables are integral for dynamic data handling in ToolJet applications. + +
    + +
    + +## Workspace Variables +**Workspace variables** are designed to store values like tokens, secret keys, or API keys that applications across the same workspace may require. This facilitates secure and centralized management of sensitive information, ensuring that critical data is easily accessible to all relevant tools within the workspace without compromising security. + +
    + +
    + +## Environment Variables +**Environment variables** are often used to manage configuration settings that differ between deployment environments (e.g., development, testing, production). They can store database connection strings, external API URLs, or any other environment-specific information, enabling developers to tailor application behavior without altering the codebase. + +
    + +Together, these variable management functions and types provide a robust framework for organizing, sharing, and securing data across complex internal tool ecosystems, ensuring both flexibility and integrity in application development and deployment. + +To learn more about different types of variables and their usage, go through the below links: + +**[Setting and unsetting variables and page variables](/docs/how-to/run-actions-from-runjs)**
    +**[Exposed variables](/docs/tooljet-concepts/exposed-variables)**
    +**[Environment variables](/docs/setup/env-vars/)**
    +**[Workspace variables](/docs/security/constants/variables)** \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/workspace-constants.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/workspace-constants.md new file mode 100644 index 0000000000..67fa5a3220 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-concepts/workspace-constants.md @@ -0,0 +1,45 @@ +--- +id: workspace-constants +title: Workspace Constants and Secrets +--- + +Workspace Constants and Secrets in ToolJet help in maintaining consistency and security across your applications. These are essentially predefined values that remain unaltered during an application's runtime, serving two main purposes: reusable values (Global Constants) and secure storage of sensitive information (Secrets). + +
    + +
    +
    + +## Types of Constants + +1. **Global Constants**: Used for reusable values that can be applied consistently across the product. +2. **Secrets**: Used for secure storage of sensitive data like API keys, database credentials, and encryption keys. + +## Environment-Specific Configurations and Security + +One of the key functionalities of Workspace Constants and Secrets is allowing environment-specific configurations. This is particularly useful for managing both reusable values and sensitive data across different environments like development, staging, and production. + +To enhance security, both Global Constants and Secrets are resolved server-side. This means the actual values are not sent with network payloads; instead, the server resolves these values, thereby keeping them secure from client-side exposure. Additionally, Secrets are masked in the frontend, providing an extra layer of protection for sensitive information. + +
    + Workspace Constants and Secrets Preview +
    + +
    + +
    + +## Access Control and Usage in Application Development + +Access to creating, updating, or deleting Workspace Constants and Secrets is restricted to Admins, ensuring tight control over these critical values. Users with editing permissions can utilize these constants in various parts of the application: + +- Global Constants can be used in the app builder, data sources, data queries, and workflows. +- Secrets can be used in data sources and data queries, but not in the app builder or workflows. + +The syntax for using constants is straightforward: +- For Global Constants: `{{constants.constant_name}}` +- For Secrets: `{{secrets.secret_name}}` + +
    + +For a deep-dive into workspace constants and secrets, including how to create and manage them, go through **[this](/docs/security/constants/)** documentation. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/constraints/foreign-key.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/constraints/foreign-key.md new file mode 100644 index 0000000000..0093cf0e0b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/constraints/foreign-key.md @@ -0,0 +1,120 @@ +--- +id: foreign-key +title: Foreign Key +--- + +A foreign key relation refers to linking one column or set of columns of the current table with one column or set of columns in an existing table. This relationship establishes a connection between the two tables, enabling the current source table to reference the existing target table. While creating a Foreign Key relationship, you can select the desired [action](#foreign-key-actions) to be performed on the source row when the referenced(target) row is updated or deleted. + +
    + +## Constraints +- The target table must contain a column having the same data type as the column in the source table. +- The column that has to be referenced in the target table must have Unique constraint explicitly. +- The target table must already exist before adding the Foreign Key relationship in the source table. + +## Limitations +- Self-references are not allowed i.e. Target table and Source table cannot be the same. +- No foreign key can be created with a column of serial data type in the source table. +- No foreign key can be reference a column in target table that is a part of its composite Primary key. + +## Exception +- The foreign key created with a column having integer data type in the source table can also reference a column of serial data type in the target table. + +
    + +
    + +## Creating Foreign Key + +While creating/editing a table(target), you will be able to add one or more than one Foreign Keys referencing the column(s) of other existing(source) tables. +To create a Foreign Key relationship, follow these steps: + + - Create or edit an existing table. + - Click on the `+ Add Relation` button under the Foreign key relation section. + - The table which is being created/edited is the source table. + - Under the source section, select the desired column from the dropdown menu. + - Under the target section, select the desired target table and Column from the dropdown menu. + - Under the Actions section, select the desired action to be performed when the referenced row is updated or deleted. + - Click on the `Create` button to create the Foreign Key relationship. + +ToolJet database + +
    + +
    + +## Foreign Key Actions + +When creating a foreign key relationship, ToolJet Database lets you choose from several actions to be performed on the source row when the referenced row in the target table is updated or deleted. + +### On Update + +| Option | Description | +| --- | --- | +| Restrict (default) | Restrict any updates on target table if any referenced row is being updated. | +| Cascade | Any updates in referenced row in target table will show up in the source table as well. | +| Set NULL | Any updates in referenced row in target table will set it's instances in the source table as NULL. | +| Set to Default | Any updates referenced row in target table will set it's instances in the source table as default value of foreign key column of source table. | + +### On Delete + +| Option | Description | +| --- | --- | +| Restrict (default) | Restrict any deletion on target table if any referenced row is being updated. | +| Cascade | Any deletion of referenced row in target table will delete the row having it's instance in the source table as well. | +| Set NULL | Any deletion of referenced row in target table will set it's instances in the source table as NULL. | +| Set to Default | Any deletion of referenced row in target table will set it's instances in the source table as default value of foreign key column of source table. | + +
    + +
    + +## Referential Integrity + +The foreign key constraint ensures referential integrity between the source and target tables. This constraint enforces that the foreign key column in the source table has one of the unique values present in the foreign key column in the target table.
    +- When creating a new row in the source table the column with the foreign key relation will have a dropdown with the unique values present in the target table. This ensures that the data in the source table is always consistent with the data in the target table. +- On the bottom of the dropdown, there is a button to **Open referenced table** which will take you to the target table. + +ToolJet database + +- When editing the value of a foreign key cell in an existing row of the source table, the dropdown will show the unique values present in the target table. This ensures that even when the data in the source table is being updated, it is always consistent with the data in the target table. + +ToolJet database + +### Example + +Let's consider an example where we want to create a foreign key relationship between the `Orders` and `Customers` tables in an e-commerce application. + +First, create the following two tables in the ToolJet Database: + +**Customers** + +| Column Name | Data Type | Primary Key | Not Null | Unique | +|-------------|-----------|:--------------:|:--------:|:--------:| +| customer_id | int | ✅ | ✅ | ✅ | +| name | varchar | ❌ | ✅ | ❌ | +| email | varchar | ❌ | ✅ | ✅ | + +**Orders** + +| Column Name | Data Type | Primary Key | Not Null | Unique | +|--------------|-----------|:--------------:|:--------:|:--------:| +| order_id | int | ✅ | ✅ | ✅ | +| customer_id | int | ❌ | ✅ | ❌ | +| order_date | varchar | ❌ | ✅ | ❌ | +| total_amount | float | ❌ | ✅ | ❌ | + +We want to create a foreign key relationship between the `customer_id` column in the `Orders` table and the `customer_id` column in the `Customers` table. + +1. **Define the Foreign Key Relationship** + - Edit the `Orders` table. + - Click on the **+ Add Relation** button under the Foreign Key Relation section. + - In the **Source** section, select the `customer_id` column. + - In the **Target** section, select the `Customers` table and the `customer_id` column. + - Choose the desired action, for example, **RESTRICT** to prevent deleting a customer that has associated orders. + +3. **Save Changes**: Click the **Save Changes** button to create the foreign key relationship. + +Now, whenever you try to insert or update a record in the `Orders` table, the `customer_id` value must correspond to an existing `customer_id` value in the `Customers` table. This is also prevent you from deleting a customer that has associated orders. This ensures that orders are always associated with a valid customer, maintaining data integrity and consistency. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/constraints/primary-key.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/constraints/primary-key.md new file mode 100644 index 0000000000..ff0aa7a0a4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/constraints/primary-key.md @@ -0,0 +1,87 @@ +--- +id: primary-key +title: Primary Key +--- + +ToolJet Database supports both single field and composite primary keys. + +
    + +## Creating Single Field Primary Key + +When creating a new table, an `id` column with the `serial` data type is automatically generated to serve as the primary key. However, you can designate any other column as the primary key if desired. The primary key column can be of any supported data type except Boolean. +The constraints for the primary key column ensure the integrity and uniqueness of the primary key, which is essential for properly identifying and referencing records within the table. To create a single field primary key, follow these steps: + + - Create or edit an existing table. + - Check the **Primary** checkbox on the column which you want to set as the primary key. + - This will automatically add the primary key constraint to the column. + - Click on the **Create** button to create the table. + +ToolJet database + +### Constraints +- The primary key column cannot contain null values. +- The primary key column must have unique values across all rows. + +### Limitations +- Every table must have at least one primary key. +- The primary key column cannot have the Boolean data type. + +
    + +
    + +## Creating Composite Primary Key + +You have the option to convert an existing primary key column into a composite primary key, consisting of two or more columns. +By utilizing a composite primary key, you can uniquely identify records based on multiple column values, providing greater flexibility and control over your data structure. To create a composite primary key, follow these steps: + + - Create or edit an existing table. + - Check the **Primary** checkbox on multiple columns to set them as the composite primary key. + - This will automatically add the primary key constraint to the selected columns. + - Click on the **Save changes/Create** button to update/create the table. + +ToolJet database + +### Constraints +- None of the composite key columns can contain null values. +- The combination of values across all composite key columns must be unique for each row in the table. + +### Limitation +- The composite key columns cannot be of the Boolean data type. + +
    + +
    + +## Modifying Primary Key + +After creating a table, you can designate any column as the primary key, provided it adheres to the required constraints. If the chosen column already contains data, the existing values must comply with the primary key constraints. However, you cannot update or modify the primary key of a target table if it is currently being referenced as a foreign key in any other source tables. To modify the primary key, follow these steps: + + - Edit an existing table. + - Check the **Primary** checkbox on the column which you want to set as the primary key. + - This will automatically add the primary key constraint to the column. + - Uncheck the **Primary** checkbox on the existing primary key column. The primary key constraints will still stay in place for this column but are no longer necessary. + - Click on the **Save changes** button to update the table. + +ToolJet database + +
    + +
    + +## Deleting Primary Key + +An existing primary key column can be deleted through the **Edit Table** panel. To delete the primary key column, follow these steps: + +- Edit an existing table. +- Select a different column to serve as the new primary key for the table. +- Once the new primary key column is designated, you can proceed to the existing primary key column. +- Uncheck the **Primary** checkbox for the existing primary key column to remove its primary key status. +- After removing the primary key constraint, you can delete this column from the table. + +You cannot delete a Primary Key of a target table if it is being used as a foreign key in any source table(s). + +ToolJet database + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/data-types.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/data-types.md new file mode 100644 index 0000000000..fe592c6a5e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/data-types.md @@ -0,0 +1,36 @@ +--- +id: data-types +title: Data Types +--- + +ToolJet Database supports several data types to accommodate various kinds of information. Each data type has its own characteristics and uses. + +## Supported Data Types + +| Data Type | Description | Example | +|:--------------------|:----------- |:------- | +| **serial** | Used to generate a sequence of integers, often used as the Primary key of a table. When a new table is created in the ToolJet database, a column **id** with the serial data type is automatically created as the **primary key** of the table. | Numbers starting from 1, 2, 3, 4, 5, etc. | +| **varchar** | Used to store characters of indefinite length | Any string value | +| **int** | A numeric data type used to store whole numbers, without fractional components. | Numbers ranging from -2147483648 to 2147483647 | +| **bigint** | A numeric data type used to store larger whole numbers, without fractional components. | Numbers ranging from -9223372036854775808 to 9223372036854775807 | +| **float** | A numeric data type used to store inexact, variable-precision values. | Any floating-point number, ex: 3.14 | +| **boolean** | Can hold true, false, and null values. | `true` or `false` | +| **date with time** | Stores both date and time information in ISO 8601 format. The default timezone is set to the user's device time zone, with an option to specify a different timezone. All timestamp data is stored in UTC format and converted to the specified timezone when displayed. | '2024-07-22 15:30:00' | +| **jsonb** | Used to store JSON data, can store structured data like arrays or nested objects. | `{"name": "John Doe", "age": 30, "skills": ["JavaScript", "Python"], "address": {"city": "New York", "zip": "10001"}}` | + +ToolJet database + +## Permissible Constraints per Data Type + +The following table shows which constraints are permissible for each data type. For more detailed explanations of each constraint type, please refer to the [Column Constraints](/docs/tooljet-db/database-editor#column-constraints) section. + +| Data Type | Primary Key | Foreign Key | Unique | Not Null | +|:--------------:|:--------------:|:-------------:|:------:|:----------:| +| serial | ✅ | ❌ | ✅ | ✅ | +| varchar | ✅ | ✅ | ✅ | ✅ | +| int | ✅ | ✅ | ✅ | ✅ | +| bigint | ✅ | ✅ | ✅ | ✅ | +| float | ✅ | ✅ | ✅ | ✅ | +| boolean | ❌ | ❌ | ❌ | ✅ | +| date with time | ❌ | ❌ | ❌ | ✅ | +| jsonb | ❌ | ❌ | ❌ | ✅ | \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/database-editor.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/database-editor.md new file mode 100644 index 0000000000..68a406b884 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/database-editor.md @@ -0,0 +1,170 @@ +--- +id: database-editor +title: Database Editor +--- + +You can manage the ToolJet Database directly from the Database Editor. ToolJet Database organizes the data into **tables** that can have different structures. All the tables will be listed lexicographically on the left. Click on any of the tables to view the table data. + +ToolJet database + +The sidebar on the left can also be collapsed to give more space to the database editor. + +ToolJet database + +
    + +## Create New Table + +To create a new table in the ToolJet Database: + - Click on the **Create New Table** button on the top left corner of the Database editor. + - A drawer will open from the right. Enter the details of your new table. + +#### To create a new table, you'll need to: +- Enter a **Table name**. +- By default, an **id** column with **serial** data type is automatically created as the **primary key** of the table. You can change the primary key to any other column. + +ToolJet database + +- Add Columns: + +| **Option** | **Description** | +| --- | --- | +| **Column name** | Enter a unique name for the column. | +| **Data type** | Select the appropriate data type for the column from the dropdown menu. For more information on available data types, see the [Supported Data Types](/docs/tooljet-db/data-types#supported-data-types) section. | +| **Default value (optional)** | Specify any default value to be assigned to the column. If left blank, the column will allow null values. | +| **Primary Key** | Check this box to designate the column as the [Primary Key](/docs/tooljet-db/constraints/primary-key). Multiple columns can be selected, creating a composite primary key. | +| **NULL/NOT NULL toggle** | Use this toggle to determine whether the column should allow null values or require a value. By default, null values are permitted. | +| **Unique toggle** | Click the kebab menu and toggle the **Unique** option to add a unique constraint to the column, ensuring all values are distinct. By default, duplicate values are allowed. | +| **Foreign Key** | Click the **+ Add Relation** button to establish a foreign key relationship, linking this column to a primary key or unique constraint column(s) in another table. | + +
    + +
    + +## Column Constraints + +ToolJet Database supports several column constraints to maintain data integrity and enforce rules on the data stored in the tables. These constraints include: + +**Primary Key**: The primary key constraint ensures that the values in the designated column(s) are unique and not null across all rows in the table. It serves as a unique identifier for each record in the table. + +**Foreign Key**: The foreign key constraint establishes a link between the data in two tables, ensuring referential integrity. It requires that the values in the foreign key column(s) of the source table match the values in the primary key or unique constraint column(s) of the target table. + - Source Table: The current table on which constraint is to be added. + - Target Table: The table that contains the column to be referenced. + +**Unique**: The unique constraint ensures that the values in the designated column(s) are unique across all rows in the table, allowing for null values. + +**Not Null**: The not null constraint ensures that the designated column(s) cannot have null values, requiring a value for every row in the table. + +For a detailed overview of which constraints are allowed for each data type, refer to the [Permissible Constraints per Data Type](/docs/tooljet-db/data-types#permissible-constraints-per-data-type) table. + +
    + +
    + +## Adding and Modifying Data + +### Add New Data + +The Add new data button on the top of the table editor allows you to add data to the table. You can either **[Add new row](#add-new-row)** or **[Bulk upload data](#bulk-upload-data)** to add the data to the table. + +ToolJet database + +### Add New Row + +To add a new row to a table, either click on the `Add new data` button on top and then select the **Add new row** option or click on the **+** button present at the bottom left.
    +A drawer from the right will open up where the values for the new row can be provided. + +ToolJet database + +### Edit Row + +To edit a row, hover on the row that you want to edit and the expand icon will appear next to the checkbox of that row. Click on the Expand icon to open the drawer and edit the row. + +ToolJet database + +### Edit a Cell + +- Double-click on the cell you want to edit. +- Enter the new value. +- Click on the **Save** button or press **Enter** to save the changes. +- For boolean-type columns, use the toggle to change the value. + +ToolJet database + +### Bulk Upload Data + +You can bulk upload data to the ToolJet database by clicking the **Bulk upload data** button at the top of the database editor. On clicking the button, a drawer will open from the right from where you can upload a **CSV** file. This file is used to insert records onto the table. If data for the id column is missing, it will insert a new record with the row data; if the id is present, it will update the corresponding record with the row data. + +From the drawer, users can download the **template CSV file** in which they can enter the data to be uploaded to the ToolJet database's table or format their CSV file in the same way as the template file. + +Once the CSV file is ready, click on the file picker to select the file or drag and drop the file in the file picker. Now, click on the **Upload data** button to upload the data to the ToolJet database. + +**Requirements**: +- The data types of columns in the CSV file should match those in the ToolJet database table. +- The `id` column with a `serial` data type should not contain duplicate values. +- All the column constraints should be satisfied. For example, if a column is marked as `Unique`, it should not contain duplicate values in the CSV file. + +**Limitations**: +- There is a limit of 1000 rows per CSV file that can be uploaded to the ToolJet database. +- The CSV file should not exceed 2MB in size. + +:::info +You can overcome the above limitations in the self-hosted version by adding the following environment variables: +- `TOOLJET_DB_BULK_UPLOAD_MAX_ROWS`: Specifies the maximum number of rows that can be uploaded. The default is 1,000 rows. +- `TOOLJET_DB_BULK_UPLOAD_MAX_CSV_FILE_SIZE_MB`: Specifies the maximum CSV file size for bulk uploads. The default maximum size is 5 MB. +::: + +ToolJet database + +### Delete Records + +To delete one or many records/rows, click the checkbox to the right of the record or records you want to delete. As soon as you select a single record, the button to delete the record will appear on the top, click on the **Delete record** button to delete the selected records. + +ToolJet database + +## Filter + +### Add Filter + +You can add as many filters as you want into the table by clicking on the **Filter** button present on the top of the database editor. + +#### Adding a filter on the table data +- Select a **column** from the Columns dropdown. +- Choose an **[operation](#available-operations-are)**. +- Enter a **value** for the selected operation. + +#### Available operations are: +| **Operation** | **Description** | +| --- | --- | +| **equals** | This operation is used to check if the value of the column is equal to the value entered in the input field. | +| **greater than** | This operation is used to check if the value of the column is greater than the value entered in the input field. | +| **greater than or equal** | This operation is used to check if the value of the column is greater than or equal to the value entered in the input field. | +| **less than** | This operation is used to check if the value of the column is less than the value entered in the input field. | +| **less than or equal** | This operation is used to check if the value of the column is less than or equal to the value entered in the input field. | +| **not equal** | This operation is used to check if the value of the column is not equal to the value entered in the input field. | +| **like** | This operation is used to check if the value of the column is like the value entered in the input field. This operation is case-sensitive. ex: `ToolJet` will not match `tooljet` | +| **ilike** | This operation is used to check if the value of the column is like the value entered in the input field. This operation is case-insensitive. ex: `ToolJet` will match `tooljet` | +| **match** | This operation is used to check if the value of the column is like the value entered in the input field. This operation is case-sensitive. ex: `ToolJet` will not match `tooljet`. This operation uses regular expressions. ex: `^ToolJet$` will match `ToolJet` but not `ToolJet Inc`. | +| **imatch** | This operation is used to check if the value of the column is like the value entered in the input field. This operation is case-insensitive. This operation uses regular expressions. ex: `^ToolJet$` will match `ToolJet` but not `ToolJet Inc`. | +| **in** | This operation is used to check if the value of the column is in the list of values entered in the input field. ex: `(1,2,3)` | +| **is** | This operation is used to check if the value of the column is equal to the value entered in the input field. This operation is used for boolean data types. | + +ToolJet database + +### Clear Filter + +You can either delete filters individually or clear all the filters together. + +ToolJet database + +
    + +
    + +## Sort + +To sort the table data, click on the **Sort** button on top, select a **column** from the dropdown, and then choose an order **ascending** or **descending**. + +ToolJet database + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/querying-tooljet-db.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/querying-tooljet-db.md new file mode 100644 index 0000000000..c8483de264 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/querying-tooljet-db.md @@ -0,0 +1,298 @@ +--- +id: querying-tooljet-db +title: Querying Data +--- + +Querying the ToolJet database is as easy as querying any other data source on ToolJet. You can use either the GUI or the SQL editor to interact with your data. + +## GUI Mode + +1. Go to the **Query panel**, and click on the **+Add** button to add a new query, and select **ToolJet Database**. + +
    +ToolJet Database editor +
    + +2. Select the GUI mode from the toggle. + +3. Select the table you want to query and the operation from the dropdown, then enter the required parameters for the selected operation. + +4. Click on the **Run** button to execute the query. + +:::info +The selected operation should adhere to the column constraints of the selected table. +::: + +
    +ToolJet Database editor +
    + + +
    + +**Available Operations**: + + +### List Rows +This operation returns all the records from the table. + +#### Optional Parameters +- **Filter**: Add a condition by choosing a column, an operation, and the value for filtering the records. +- **Sort**: Sort the query response by choosing a column and the order (ascending or descending). +- **Limit**: Limit the number of records to be returned by entering a number. +- **Aggregate**: Perform calculations on a set of values and return a single result. + - Available functions: Count, Sum + - Limitations: + - Sum only for numeric columns. + - Count only for non-null values. +
    +ToolJet Database editor +
    + +- **Group By**: Group rows with the same values in specified columns. + - Can only be used after adding at least one aggregate condition. + - Select one or more columns to group by. + - Results are grouped based on unique combinations of values in selected columns. +
    +ToolJet Database editor +
    + + +
    + +### Create row +This operation creates a new record in the table. You can create a single record or multiple records at once. + +#### Required Parameters +- **Columns**: Choose the columns, add values for the new record, and enter the values. You can also add a new column by clicking on the **+Add column** button. + +
    + +
    + +### Update Row +This operation updates a record in the table. You can update a single record or multiple records at once. + +#### Required Parameter +- **Filter**: Add a condition by choosing a column, an operation, and the value for updating a particular record. +- **Columns**: Choose the columns, update the values for the selected record, and enter the values. + +
    + +
    + +### Delete Row +This operation deletes a record in the table. You can delete a single record or multiple records at once. + +#### Required Parameters +- **Filter**: Add a condition by selecting a column, an operation, and the value to delete a specific record. +- **Limit**: Limit the number of records to be deleted by entering a number. + +
    + +## SQL Editor + +The ToolJet **SQL editor** allows you to query the ToolJet Database by writing SQL queries, specifically supporting standard SQL syntax for **Data Manipulation Language (DML)** commands. + +### Supported SQL Commands + +- **DML Commands**: You can use the following DML commands to manipulate data: + - **SELECT**: Retrieve data from the database. + - **INSERT**: Add new records to the database. + - **UPDATE**: Modify existing data. + - **DELETE**: Remove records from the database. + +- **Restricted Commands**: + - **Data Definition Language (DDL)** commands like **CREATE**, **ALTER**, **TRUNCATE**, **DROP**, and **RENAME** are not allowed. + - **Data Control Language (DCL)** commands like **GRANT** and **REVOKE** are also restricted. + +### SQL Editor Usage + +1. In the Query panel, click on the **+Add** button to add a new query, and select **ToolJet Database**. +2. Select the **SQL** mode tab in the query editor. +3. Write your SQL query in the editor. +4. Click on the **Run** button to execute the query. + +
    +ToolJet Database SQL Editor +
    + +Example: +```sql +SELECT * FROM users WHERE age > 30 +``` + +## Modifying Tables with Foreign Key Constraints + +When you are creating, updating, or deleting records in a table that has a foreign key constraint, you need to ensure that the foreign key constraint is not violated. +- If you are trying to create/update a new row in the source table, you need to ensure that the foreign key value exists in the target table. Otherwise, the operation will fail with an error message. + +
    + 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 + +You can join two or more tables in the ToolJet database by using the **Join** operation. + +#### Required Parameters +- **From**: In the From section, the following parameters are available: + - **Selected Table**: Select the table from which you want to join the other table. + - **Type of Join**: Select the type of join you want to perform. The available options are: `Inner Join`, `Left Join`, `Right Join`, and `Full Outer Join`. + - **Joining Table**: Select the table that you want to join with the selected table. If the selected table has a foreign key relationship(s) with other tables, those tables will be listed with a foreign key icon next to their name. + - **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 + +
    + +- **Filter**: Add a condition by choosing a column, an operation, and the value for filtering the records. The operations supported are same as the [filter operations](/docs/tooljet-db/database-editor#available-operations-are) for the **List rows** operation. +- **Sort**: Sort the query response by choosing a column and the order (ascending or descending). +- **Limit**: Limit the number of records to be returned by entering a number. +- **Offset**: Offset the number of records to be returned by entering a number. This parameter is used for pagination. +- **Select**: Select the columns that you want to return in the query response. By default, all the columns are selected. + +
    +ToolJet Database editor +
    + +
    + +## Mapping Date with Time Column to Table Component + +The date with time column stores data in the ISO 8601 format. When querying a table with a date with time column, the column is displayed in the ISO 8601 format by default. To display the date with time column in a more readable format in the Table Component, follow these steps: + +1. Connect the query to the Table Component and navigate to its properties panel. +2. In the Columns section, select the column that stores the date with time. +3. Change the column type from String to **Date Picker**. +4. Under the date format section, toggle on the **Enable date** and **Enable time** options accordingly. +5. In the transformation field, the `{{cellValue}}` variable contains the ISO 8601 formatted date. Convert it to a Date object using `{{new Date(cellValue)}}`, then format the Date object to meet your requirements. + + +
    +ToolJet Database Date +
    + +
    + +
    + +## Querying JSON Data Type + +In ToolJet Database, a column can be set to JSON Data Type. It can be used to store structured data like arrays or nested objects, making it useful for complex data structures such as configurations or logs. To query the JSON Data Type, follow the following steps: + +### Flat JSON Object + +A flat JSON object is a JSON structure where all key-value pairs exist at a single level, without any nesting. Each key is unique within the object, and all values are direct data entries rather than other objects or arrays. + +1. Add **ToolJet DB** as the Data Source from the query panel. +2. Select **GUI mode** (else you can select SQL mode as well). +3. Select the **Table name**. +4. Select the desired operation from the dropdown. +5. Click on **+ Add Condition** button in front of Filter. +6. Choose column that consist JSON Data, choose the desired operation and enter the value. +7. In the input box below the column name, enter the desired key by adding `->>` before the key, example `->>city`. + +ToolJet Database Date + +
    +**Response Example** + +```json +[ + { + "id":1, + "json":{ + "id":101, + "age":30, + "city":"Los Angeles", + "name":"Alice Johnson", + "email":"alice@example.com", + "country":"USA" + } + } +] +``` + +
    + +### Nested JSON Object + +A nested JSON object is a JSON structure that contains key-value pairs, where some values are themselves JSON objects or arrays. This creates a hierarchical, multi-level structure with nested layers, which can represent complex relationships between data elements. + +1. Add **ToolJet DB** as the Data Source from the query panel. +2. Select **GUI mode** (else you can select SQL mode as well). +3. Select the **Table name**. +4. Select the desired operation from the dropdown. +5. Click on **+ Add Condition** button in front of Filter. +6. Choose column that consist JSON Data, choose the desired operation and enter the value. +7. In the input box below the column name, enter the desired JSON path by adding `->` before each key, example `->user->preferences->settings->notifications->sms->alerts->appointments->cancellations`. + +ToolJet Database Date + +**Note:** You can use `->` to access nested JSON fields and use `->>` to access the text. + +
    +**Response Example** + +```json +[ + { + "id": 102, + "name": "Michael Brown", + "age": 25, + "email": "michael@example.com", + "user": { + "preference": { + "settings": { + "notification": { + "sms": { + "alert": false + } + } + } + } + } + }, + { + "id": 104, + "name": "David Miller", + "age": 35, + "email": "david@example.com", + "user": { + "preference": { + "settings": { + "notification": { + "sms": { + "alert": false + } + } + } + } + } + } +] +``` + +
    + +
    + + +:::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://www.tooljet.com/slack)** +::: + +
    + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/table-operations.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/table-operations.md new file mode 100644 index 0000000000..300c320cab --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/table-operations.md @@ -0,0 +1,80 @@ +--- +id: table-operations +title: Table Operations +--- + +## Search Table + +Open the Search bar by clicking on the **Search** button and search for a table in the ToolJet database by entering the table name. + +ToolJet database + +
    + +## Rename Table + +To rename a table, click on the kebab menu icon on the right of the table name and then select the **Edit table** option. A drawer will open from the right from where you can edit the table name. + +ToolJet database + +
    + +
    + +## Add New Column + +To add a new column to a table, either click on the kebab menu icon on the right of the table name and then select the **Add new column** option or click on the **+** button present at the end of the column header. + +A drawer from the right will open up where you can enter the details for the new column: + +- **Column Name**: Enter a unique name for the new column, serving as its key identifier. +- **Data Type**: Choose the appropriate data type for the column from the [available options](/docs/tooljet-db/data-types#supported-data-types). For more information on data types and their associated constraints, see the [Supported Data Types](/docs/tooljet-db/data-types#supported-data-types) and [Permissible Constraints per Data Type](/docs/tooljet-db/data-types#permissible-constraints-per-data-type) sections. +- **Default Value**: Specify any default value that should be assigned to the column. Optionally, users can leave this field blank. When a table contains rows and NOT NULL is applied to one of its existing or new columns, specifying a default value becomes compulsory. +- **Foreign Key Relation**: Click on the toggle to add a foreign key relationship to the column. This will open a menu where you can select the target table and column to reference. + +ToolJet database + +
    + +
    + +## Export Schema + +The export schema option allows you to download the selected table schema in a JSON file. This does not export the table data or the relationships.
    +While exporting the app, you can choose to export the app with or without a table schema connected to the app.
    +To export the table schema, click on the three vertical dots icon on the right of the table name and then click on the **Export** option. A JSON file will be downloaded with the table schema. + +ToolJet database + +
    + +
    + +## Delete Table + +To delete a table, click on the three vertical dots icon on the right of the table name and then click on the **Delete** option. A confirmation modal will appear, click on the **Delete** button to delete the table. + +ToolJet database + +
    + +
    + +## Edit Column + +To edit a column, click on the kebab menu on the column name and select the option to **Edit column**. When you edit the column, the data type cannot be changed. + +ToolJet database + +
    + +
    + +## Delete Column + +To delete a column, click on the kebab menu on the column name and select the option to **Delete**. You cannot delete a column if it is being used as a primary key. You will have to remove the primary key constraint from the column before deleting it. + +ToolJet database + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/tooljet-database.md b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/tooljet-database.md new file mode 100644 index 0000000000..440e71f082 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljet-db/tooljet-database.md @@ -0,0 +1,100 @@ +--- +id: tooljet-database +title: Overview +--- + +Use the ToolJet-hosted database to build apps faster, and manage your data with ease. ToolJet database require no setup and gives you a powerful user interface for managing your data. + +
    + ToolJet database +
    + +
    + +## Enabling the ToolJet Database for your instance + +
    + +### PostgREST Server + +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 +command `openssl rand -hex 32` to generate the value for `PGRST_JWT_SECRET`. + +If this parameter is not specified, PostgREST will refuse authentication requests. +::: + +```env +PGRST_HOST=localhost:3001 +PGRST_LOG_LEVEL=info +PGRST_DB_PRE_CONFIG=postgrest.pre_config +PGRST_SERVER_PORT=3001 +PGRST_DB_URI= +PGRST_JWT_SECRET= +``` + +The **`PGRST_DB_URI`** variable is **required** for PostgREST, which exposes the database as a REST API. This must be explicitly set for proper functionality. + +#### Format: + +```env +PGRST_DB_URI=postgres://TOOLJET_DB_USER:TOOLJET_DB_PASS@TOOLJET_DB_HOST:5432/TOOLJET_DB +``` + +
    + +|
    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). + +:::tip +When this feature is enabled, the database name provided for `TOOLJET_DB` will be utilized to create a new database during server boot process in all of our production deploy setups. +In case you want to trigger it manually, use the command `npm run db:create` on ToolJet server. +::: + +
    + +
    + +## Features + +ToolJet database allows you to: + +- **Maintain tables of data** in a secure database that's only accessible within your ToolJet organization. +- **Edit, search, filter, sort, and filter** data using a spreadsheet-like interface. +- **Use the SQL editor** to write and execute complex SQL queries directly on your ToolJet database, providing more advanced data manipulation and retrieval capabilities. +- **Quickly build applications and write queries** to interact with the ToolJet Database, just like any other datasource but without any setup. +- **Export schema** from the ToolJet Database to a JSON file. +- Uniquely identify each record in a table using **Primary Keys**, ensuring data integrity and enabling efficient querying and indexing. +- Establish relationships between tables using **Foreign Keys**, allowing you to create associations based on the Primary Key of one table and maintain referential integrity. + +
    + +
    + +## Accessing ToolJet Database + +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**. + +
    + ToolJet database +
    + +
    + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/tooljetcli.md b/docs/versioned_docs/version-3.0.0-LTS/tooljetcli.md new file mode 100644 index 0000000000..295d6cbf60 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tooljetcli.md @@ -0,0 +1,93 @@ +--- +id: tooljet-cli +title: ToolJet CLI +--- + +ToolJet CLI is a powerful tool that empowers developers to effortlessly create and enhance Marketplace plugins for ToolJet workspace. + +:::info +Starting from ToolJet CLI version 0.0.14, the creation of datasource plugins has been deprecated to prioritize marketplace plugins. This change enhances the plugin development experience and aligns with ToolJet's roadmap. +::: + +## Installation + +In order to manage plugins for the ToolJet marketplace, including creating, updating, and deleting, you will need to utilize **[tooljet-cli](https://www.npmjs.com/package/@tooljet/cli)**. This can be installed via npm by entering the following command: + +```bash +npm install -g @tooljet/cli +``` + +
    + +ToolJet CLI installation + +
    + +#### Ensure the installation was successful + +```bash +tooljet --version +``` + +
    + +ToolJet CLI version check + +
    + +## Commands + +### info + +This command returns the information about where tooljet is being run + +```bash +tooljet info +``` + +
    + +ToolJet CLI info + +
    + +### create + +This command creates a new plugin. + +```bash +tooljet plugin create PLUGIN_NAME +``` +:::tip +Read the detailed guide on creating a marketplace plugin [here](/docs/contributing-guide/marketplace/creating-a-plugin). +::: + +
    + +ToolJet CLI : create plugin + +
    + +### delete + +This command deletes a plugin. + +```bash +tooljet plugin delete PLUGIN_NAME +``` + +The CLI will prompt developers to verify if the plugin to be deleted is a marketplace plugin before proceeding with the deletion. + +
    + +ToolJet CLI: delete plugin + +
    + +### install + +Installs a new npm module inside a tooljet plugin + +```bash +tooljet plugin install [NPM_MODULE] --plugin +``` \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tracking.md b/docs/versioned_docs/version-3.0.0-LTS/tracking.md new file mode 100644 index 0000000000..09cc7aa612 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tracking.md @@ -0,0 +1,31 @@ +--- +id: tracking +title: Tracking +slug: /tracking +--- + +# Tracking + +:::tip +ToolJet does not store any data fetched from the data sources. ToolJet acts as a proxy and the data from data sources is sent to the client application without storing. +::: + +
    + +## Server + +:::tip +Self-hosted version of ToolJet pings our server to fetch the latest product updates every 24 hours. You can disable this by setting the value of `CHECK_FOR_UPDATES` environment variable to `0`. This feature is enabled by default. +::: + +
    + +
    + +## Client + +ToolJet tracks anonymous usage data such as page loads and clicks. ToolJet tracks only the events and doesn't capture data from data sources. + +Tracking can be disabled by setting the value environment variable `ENABLE_TRACKING` to `0`. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/tutorial/_category_.json new file mode 100644 index 0000000000..1ed20f00b1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Tutorial", + "position": 4, + "collapsed": false +} diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/actions.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/actions.md new file mode 100644 index 0000000000..92586941e0 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/actions.md @@ -0,0 +1,31 @@ +--- +id: actions +title: Adding actions +--- + +# Adding actions + +ToolJet supports several actions that can be invoked as the handler for any `event` that is triggered in an application. + +## To add actions + +To attach an action for component events, click on the component's handle, and then click on the `Add handler` button on the +inspector panel available on the right side. + +To attach an action for query events, select the query, go to the `advanced` tab and then click on the `Add handler` button. + +## Available actions + +Some of the actions that ToolJet Support are + + Action| Description| + ----| ----------- | + Show alert | Show an alert message as a bootstrap toast | + Run query | Run any of the data queries that you have created | + Open webpage | Go to another webpage in a new tab | + Goto app | Go to another ToolJet application | + Show modal | Open any modal that you've added | + Close modal | Close any modal that you've added if its already open | + Copy to clipboard | Copy any available text that you see on the application to clipboard | + Set localStorage | Set a key and corresponding value to localStorage | + Generate file | Construct file using data available in your application and let the user download it | \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/adding-a-datasource.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/adding-a-datasource.md new file mode 100644 index 0000000000..a8e2d9fb8e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/adding-a-datasource.md @@ -0,0 +1,36 @@ +--- +id: adding-a-datasource +title: Adding a data source +--- + +# Adding a data source + +:::tip +The data sources are created on app level and not on workspace level. +::: + +**Datasource manager** is on the left-sidebar of the app builder. To add a new data source, click on the
    `Add datasource` button. + + +adding datasource + + +You will be prompted to select the data source that you wish to add. Let's select PostgreSQL for this tutorial. You will then need to provide the credentials of your PostgreSQL database. The fields that are marked as `encrypted` will be encrypted before saving to ToolJet's database. + +
    + +![ToolJet - Tutorial - Adding a data source](/img/tutorial/adding-datasource/datasources.png) + +
    + +The name of the data source must be unique (within the app) and can be changed by clicking on the data source name at the top of the prompt. Click on `Test Connection` button to verify the connection, this might take a couple of minutes. Once verified, save the data source. + +:::tip +If you are using ToolJet cloud and if your data source is not publicly accessible, please white-list our IP address ( shown while creating a new data source ). +::: + +
    + +postgre add datasource + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/adding-widget.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/adding-widget.md new file mode 100644 index 0000000000..f1e69e62ee --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/adding-widget.md @@ -0,0 +1,66 @@ +--- +id: adding-widget +title: Adding a widget +--- + +# Adding a widget + +To add a widget, navigate to the `Widget manager` on the right sidebar. It will display the list of built-in widgets that can be added to the app. Use the search functionality to quickly find the widget that you want. + +widget + +## Drag and drop a widget + +Let's add a `table` widget to the app to show the customer data from the query that we created in the previous steps. +To add a widget, drag and drop the widget to the canvas. + +## Resize a widget + +The widgets can be resized and repositioned within the canvas. + +resize + +## Adding widgets to Modal + +To add a widget to Modal, we need to trigger [Show modal action](/docs/tutorial/actions#available-actions) + +:::info +Before triggering `Show modal action` we need to add a modal widget to the canvas. +::: + +- Add a `modal widget` to the app +- Trigger the **Show modal action** +- Click on the canvas area for the `Widget manager` sidebar +- Navigate to the Widget manager on the right sidebar and Drag and drop a widget into the Modal + +adding-widget + +## Resize table columns + +We can resize the column width using the resize handle of the column. + +resize-table-column + +## Change widget properties + +Click on the widget to open the inspect panel on right sidebar. Here you can change the properties of the widgets. Let's configure the table columns to display the customer data. The display order of columns can be changed by dragging icon near the column name. + +inspect panel + +## Connecting data with widget + +Now we will connect the `data` object of the `fetch customers` query with the table. Click on the table widget to open the inspector on the right sidebar. We can see that the data property of the table has an empty array as the value. The data field, like almost every other field on the editor supports single-line javascript code within double brackets. Variable suggestions will be shown as a dropdown while you type the code in the field. + +Let's select the `data` object of the 'postgresql' query. + +` {{queries.postgresql1.data}}` + +Since we have already run the query in the previous step, the data will be immediately displayed in the table. + +table data + +So far in this tutorial, we have connected to a PostgreSQL database and displayed the data on a table. + +:::tip +Read the widget reference of table [here](/docs/widgets/table) for more customizations such as server-side pagination, actions, editing data. +::: diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/building-queries.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/building-queries.md new file mode 100644 index 0000000000..9598c2f9da --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/building-queries.md @@ -0,0 +1,53 @@ +--- +id: building-queries +title: Building Queries +--- + +# Building Queries + +Query Editor lives at the bottom of the page. We will now build a query for the PostgreSQL datasource that we connected in the previous step. + +:::tip +You can click on the 'enlarge' icon to enlarge query editor pane. +::: + +- Click on the `+` icon of the query editor to create a new query. +- Select the PostgreSQL datasource created in previous step. +- Copy the query given below and paste on the query area. +- Select SQL mode + +```sql +SELECT * FROM customers; +``` + + +query + + +Query results can be previewed by clicking the `preview` button. Previewing queries will not alter the state of the app. + + +preview + + + +## Advanced options + + +advanced options + + +#### Run query on page load +If this option is enabled, the query will be run when the app is loaded for the first time. The queries can have more than one trigger, ie the same query can later be triggered again using a button's click event or table's row selected event or any other events. + +#### Request confirmation before running query +Enable this option to show a prompt to confirm the action before a query is run. The confirmation prompt will look like this: + +
    + +confirm + +
    + +#### Show notification on success +Enable this option to show a custom message on query completion. Duration of the notification can also be set. diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/creating-app.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/creating-app.md new file mode 100644 index 0000000000..c839536052 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/creating-app.md @@ -0,0 +1,31 @@ +--- +id: creating-app +title: Creating new app +--- + +# Creating new app + +:::info +Apps in ToolJet binds the widgets, data sources and queries together. +::: + +This tutorial will walk you through building a simple app to fetch customer information from a PostgreSQL database and display the data using the table widget. +To create a new ToolJet app, click on the **'Create new application'** button on the ToolJet dashboard. + + +dashboard create new app + + +You will be redirected to the visual app editor once the app has been created. Create the first version of your app to start building. The name of the app can be changed by clicking on the app name at top-left of the app builder. + +
    + +![ToolJet - Creating an app](/img/tutorial/creating-new-app/visual-app-editor.png) + +
    + +The main components of an app: + +- **[Widgets](/docs/tutorial/adding-widget)** - UI components such as tables, buttons, dropdowns. +- **[Data sources](/docs/tutorial/adding-a-datasource)** - ToolJet can connect to databases, APIs and external services to fetch and modify data. +- **[Queries](/docs/tutorial/building-queries)** - Queries are used to access the connected data sources. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/debugger.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/debugger.md new file mode 100644 index 0000000000..bc61761ba4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/debugger.md @@ -0,0 +1,19 @@ +--- +id: debugger +title: Debugger +--- + +# Debugger + +The debugger captures errors that happens while running the queries. For example, when a database query fails due to the unavailability of a database or when a REST API query fails due to an incorrect URL, the errors will be displayed on the debugger. The debugger also displays relevant data related to the error along with the error message. Debugger is located on the left-sidebar. + + +debugger + + + +## Pin Debugger +You can click on the `pin` icon at the top-right corner of the debugger if you do not want the debugger to close. The debugger will remain open until it is unpinned. + + +pinned debugger diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/keyboard-shortcuts.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/keyboard-shortcuts.md new file mode 100644 index 0000000000..26d32d5b93 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/keyboard-shortcuts.md @@ -0,0 +1,22 @@ +--- +id: keyboard-shortcuts +title: Keyboard Shortcuts +--- + +# Keyboard Shortcuts + +You can perform operations like copying and pasting components, cloning components, deleting components, undo, redo, and more using keyboard shortcuts. + + +| Action | Mac Shortcut | Linux/Windows Shortcut | +|:------------|:-------------------|:-----------------------| +| Copy component | `cmd + c` | `ctrl + c` | +| Cut component | `cmd + x` | `ctrl + x` | +| Paste component | `cmd + v` | `ctrl + v` | +| Undo | `cmd + z` | `ctrl + z` | +| Redo | `cmd + shift + z` | `ctrl + shift + z` | +| Clone component | `cmd + d` | `ctrl + d` | +| Remove component | `delete` | `backspace` | +| Deselect component | `esc` | `esc` | + +To choose several components at once within the app-builder, simply hold down the shift key while clicking on each component you want to select. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/mobile-layout.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/mobile-layout.md new file mode 100644 index 0000000000..6d53baf5fe --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/mobile-layout.md @@ -0,0 +1,26 @@ +--- +id: mobile-layout +title: Mobile layout +--- + +# Mobile layout + +Mobile layout is activated when the width of the window is less than 600px. + +:::tip +Widgets can be shown on desktop, mobile, or both. +::: + + +mobile layout + + +## Adding existing widget to mobile layout +Click on the widget to open inspector. Scroll down to the `layout` section and enable mobile layout. The width of the widget will be adjusted to fit the mobile layout. + +## Adding a new widget to mobile layout +Switch the layout to mobile by clicking the button on the top navigation bar. Drag and drop a widget to the canvas. This widget will not be shown on desktop layout unless enabled from the widget inspector via the "Show on desktop" button manually. + +:::tip +Width of the widgets will be automatically adjusted to fit the screen while viewing the application in app viewer. +::: diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/pages.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/pages.md new file mode 100644 index 0000000000..3ea0e07193 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/pages.md @@ -0,0 +1,119 @@ +--- +id: pages +title: Pages +--- + +Pages allow you to have multiple pages in a single application, making your ToolJet applications easier to navigate and more user-friendly. + +Multi-page app + +
    + +## Pages Panel + +You can open the **Pages Panel** by clicking on the **Pages** icon on the left sidebar of the app-builder. + +Pages Panel + +
    + +
    + +## Panel Options + +### Add Page + +- On the header of the Pages Panel, you'll find a **+** button to add more pages to your application. +- Click the **+** button to add a new page. +- Enter the name for the new page and press enter. + +Pages Panel + +### Settings + +- You can use the settings option to customize the page navigation sidebar for your app. +- Click on the settings button and a new panel will open on the right. + +#### Properties Tab +- **Collapsable**: This option allows you to make the page navigation sidebar collapsible. +- **Style**: Choose whether you want to display Text only, Text + icon, or Icon only on the page navigation sidebar. +- **Hide page menu in viewer mode**: This option lets you hide the page navigation sidebar in viewer mode. + +Pages Panel + +#### Style Tab +- You can use the style tab to customize the page navigation sidebar. + +Pages Panel + +### Pin + +- By default, the panel will close when you click outside the panel. You can pin the **Pages panel** from the **Pin** button and the panel won't close until you **unpin** it. + +Pages Panel + +
    + +
    + +## Page Options + +There are several options available for a Page. To use these options, click on the kebab menu on the right of the page card. + +Pages Panel + +### Page Handle + +Page Handle is the slug that is added at the end of the application URL. By default, the page handle is the name of the page in lowercase and with spaces replaced by hyphens. You can change the page handle by clicking on the **Edit** symbol next to the page handle. + +### Rename + +Rename option will allow you to rename the page. Renaming a page will not change the slug/page handle. + +### Mark Home + +Mark home option can be used to make a page the default landing page of the application. When you open the application, the page marked as home will be the first page that you see. + +### Hide Page on app menu + +Hide Page option can be used to hide a page from the **page navigation sidebar** in viewer mode. You can go to the options again and **unhide** the app from the **page navigation sidebar**. Page marked as **home** cannot be hidden.
    +**Note:** After hiding a page, although the page may not appear in the pages navigation sidebar, it can still be accessed by utilizing either the **switch page Action** or the **page URL**. + +Pages Panel + +### Duplicate + +The duplicate page option allows you to create and add a copy of the page in the pages list. The duplicated page will be an exact replica of the original page. + +### Event Handlers + +Like other ToolJet components, pages can also be attached to event handlers. For pages, the **On page load** event is available. You can use all the available actions for this event, along with the new actions added specifically for Pages. + +- **[Switch Page](/docs/actions/switch-page)** +- **[Set Page Variable](/docs/actions/set-page-variable)** +- **[Unset Page Variable](/docs/actions/unset-page-variable)** + +### Disable Page + +Disable Page Option can be used to disable a page. A disabled page won't be accessible in the viewer mode.
    +**Note:** Page marked as **home** can't be disabled. + +### Delete Page + +You can **delete** a page from an application using this option.
    +**Note:** Page marked as **home** cannot be deleted. + +
    + +
    + +## Exposed variables + +| Variable | Description | +| ----------- | ----------- | +| handle | The handle represents the slug of the page within an app. In the URL `https://app.tooljet.com/applications/crm2/home`, **crm2** refers to the app name, and **home** corresponds to the handle. The handle is automatically set when a page is added, and you can also [rename](#rename) the handle from the Page options. To access the value of the handle variable dynamically, use `{{page.handle}}`| +| name | The name indicates the name of the page set during its creation. To access the value of the name variable dynamically, use `{{page.name}}` | +| id | Each page in the ToolJet app receives a unique identifier upon creation. To access the value of the id dynamically, use `{{page.id}}` | +| variables | Variables is an object that contains all the variables created for a specific page using the [Set Page Variable](/docs/actions/set-page-variable) action. The value of a specific variable can be accessed dynamically using `{{page.variables.}}`, where `` refers to the variable created for that page using the Set Page variable action. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/sharing-and-deploying.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/sharing-and-deploying.md new file mode 100644 index 0000000000..244d3ea3fb --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/sharing-and-deploying.md @@ -0,0 +1,55 @@ +--- +id: sharing-and-deploying +title: Preview and Sharing Apps +--- + +# Preview and Sharing Apps + +## Preview + +Clicking on `Preview` will open up the currently opened version of the app in the new tab. This is useful if you want to immediately check the app in production. + + +preview + +## Sharing an app + +Once you have released a version of your app, you can share the app with others using a customized url. To share an app: + +- Click on the **Share** button on the top-right corner + +
    + + +share + + +
    + +- In the dialog box, turn on the toggle switch to `Make the application public` and shareable + +
    + + +toggle + + +
    + +- Create your own `customised URL` for the app and click on `copy` to copy the URL + +
    + +url + + +
    + +- You can also `Embed` your application using the embeddable link + +
    + +embed + + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/transformations.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/transformations.md new file mode 100644 index 0000000000..deca9fad6f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/transformations.md @@ -0,0 +1,93 @@ +--- +id: transformations +title: Transformations +--- +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +# Transformations + +Transformations can be enabled on queries to transform the query results. ToolJet allows you to transform the query results using two programming languages: + +- **[JavaScript](#transform-using-javascript)** +- **[Python](#transform-using-python)** + +:::caution +- Every transformation is scoped to the query it's written for. +- Actions and CSA(Component Specific Actions) cannot be called within the transformation, they can only be called within **[RunJS](/docs/data-sources/run-js)** query or **[RunPy](/docs/data-sources/run-py)** query. +::: + +## Transform using JavaScript + +Let's assume a query is returning the customers data with a `name` row, so we will write a simple transformation to compute `first_name` and `last_name` for all the customers. + +```javascript +// write your code here +// return value will be set as data and the original data will be available as rawData +return data.map((row) => { + return { + ...row, + first_name: row.name.split(' ')[0], + last_name: row.name.split(' ')[1], + }; +}); +``` + +The query will now look like this: + +
    + +Transformation + +
    + +## Transform using Python + +Let's use Python transformation to compute `first_name` and `last_name` for all the customers that we fetch in the previous step. + +```python +return list(map(lambda row: { + **row, + 'first_name': row['name'].split(' ')[0], + 'last_name': row['name'].split(' ')[1], +}, data)) +``` + +#### Example + +- Let's take a look at the data returned by a RESTAPI (using mock data here): +
    + + raw data + +
    + +- Now we will transform the returned data using Python that will append a new key in the returned data called `user` and that user will have the value from the exposed global variables of ToolJet which is `globals.currentUser.email` + ```python + return list(map(lambda item: {**item, "user": f"{globals['currentUser']['email']}"}, data)) + ``` + +- Now, you can click on the preview button to check the transformed data. +
    + + raw data + +
    + +--- + +Click the `Save` button to create the query. Saved queries can be run using the `Run` button on the top-right of query panel. Queries run using the run button will behave just as if it was triggered by an app event like button click and thus will alter the state of the app. You can view the query results using the state inspector on the left side-bar of the app builder. + +
    + +result + +
    + +We can see that `first_name` and `last_name` are added to all the rows in the `data` object of the query. If you need the original data of the query, it will be available in the `rawData` object of the query. + +
    + +raw data + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/tutorial/versioning-and-release.md b/docs/versioned_docs/version-3.0.0-LTS/tutorial/versioning-and-release.md new file mode 100644 index 0000000000..4bae42f7a6 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/tutorial/versioning-and-release.md @@ -0,0 +1,112 @@ +--- +id: versioning-and-release +title: Versioning and Release +--- + +# Versioning and Release + +Versioning and Release lets you version control your apps and release app changes to the users. + +
    + +## Versioning + +Versioning is really useful if multiple developers are working on an app, it allows them to save their own version of the app. This also prevents developers from overwriting the other developer's work. + +
    + +
    + +### Creating a Version + +You can create new versions from **App Version Manager** on the top-right corner. It displays the version of the app that you're currently working and can be used to switch between the different version of the app. To create a new version: + +- Go to the **App Version Manager** from the toolbar and click on the dropdown. It will display all the versions of the app that have been created. The released version name will be in green color. +
    + + app version + +
    + +- Click on **Create new version** button present at the bottom of the dropdown and a modal will pop-up. Enter a **Version Name** and click on **Create version from** dropdown that will include all the versions of the app, choose a version from the dropdown that you want to use for your new version or ToolJet will automatically select the last created version, and then click on `Create new Version` button to add a new version. +
    + + modal + +
    + +
    + +
    + +### Renaming a Version + +If you want to change the name of an app version, navigate to the **version manager** and select the version you wish to rename. From there, you can click on the rename button located beside the version name. This will open a modal where you can modify the version name to your desired choice. + +
    + +version dropdown + +
    + +
    + +
    + +### Deleting a Version + +If you want to remove an app version, go to the **version manager** and locate the version you wish to delete from the dropdown menu. Next to the version, you will find a delete icon. Click on it to initiate the deletion process. + +
    + +version dropdown + +
    + +
    + +
    + +## Release + +Making a release let's you publish the app and push the changes to production. + +### Releasing a Version + +To release a version: + +- Go to the **App Version Manager** and select the `version` from the dropdown that you want to release. +
    + + version dropdown + +
    + +- Click on the `Release` button on the top-right corner. +
    + + release + +
    + +- A confirmation dialog will popup that prompts you to decide whether to release the current version of the app. Clicking on the **Release** button will release the current version of the app. +
    + + release + +
    + + +:::caution +- When an app is made **Public** without being released, it functions similarly to previewing the application. This means that the version that is loaded when accessing the app through its Public app URL will be the same version of the app currently loaded in the app builder. + +- To prevent the unintended publishing of an unfinished app, ToolJet will prompt you to create a new version for making any edits to the `Released version` of an app. Editing of the `Released version` will be blocked until a new version is created. + +
    + +release + +
    +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/cloud-login.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/cloud-login.md new file mode 100644 index 0000000000..1be8cad8d4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/cloud-login.md @@ -0,0 +1,56 @@ +--- +id: cloud-login +title: Cloud Authentication +--- + +In cloud deployment, you can setup the authentication on your workspaces and is managed by the Admins of the respective groups. Each workspace can have different Authentication method. We will learn about the available Authentication methods in this documentation. + + +### Configuration + +To configure the authentication: + +1. Go to **Workspace Settings** > **Workspace login**. (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + +2. On this page, you can configure the following settings: + +cloud  workspace level login + + +### SSO (Single Sign-On) + + * SSO makes it easier for organizations to manage user access. Users can use one login for different tools, and admins can quickly add or remove access when needed. Thus, it improves an organization's onboarding and offboarding experience. + + * You can configure SSO with Google, GitHub, OpenID Connect, LDAP, and SAML. Please check the [SSO docs](/docs/user-management/sso/overview) for a detailed guide on SSO configuration. + + +### Default SSO (Single Sign-On) + * ToolJet supports preconfigured Google and GitHub as default SSO options, which can be easily enabled from the workspace login page. + + +### Allowed Domains + + * This feature helps restrict login access to specific email domains, ensuring that only authorized users from your organization can sign up or log in. + + * You can add multiple domains for login by specifying allowed domain names, separated by commas. **Example:** `corp.com`, `corp.io`, `corp.ai` + + +### Sign-Up Without Invitations + + * This feature allows organizations to simplify onboarding by letting users sign up without needing an invitation. + + * The **Enable Signup** feature lets users create accounts without being invited. + + * When users sign up with this feature enabled, they are assigned to the end user of that workspace. Workspace admin can later change the [role](/docs/user-management/role-based-access/user-roles) of the user once the user is on-boarded to the workspace. + +### Password Login + + * Password login allows users to log in using their email and password. However, organizations can also use SSO for better security and control. + + * Toggle this setting to **enable** or **disable** password login on the login page. Make sure to disable password login only when your SSO is configured otherwise, you will get locked out. + +### Automatic SSO Login + + * This feature eliminates the need for users to interact with the login page by directly authenticating them via the configured SSO provider. + + * To Enable the Automatic SSO Login, ensure the password login is disabled and only one SSO provider is configured. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/instance-login.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/instance-login.md new file mode 100644 index 0000000000..7512209211 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/instance-login.md @@ -0,0 +1,76 @@ +--- +id: instance-login +title: Instance Login +--- + +In self-hosted deployments, it can be configured at two levels: **Instance Level**, which applies globally across all workspaces and is configurable only by the super admin, and **Workspace Level**, which overrides the instance-level settings for specific workspaces and can be configured by both super admins and workspace admins. This guide focuses on configuring instance-level authentication. + +### Configuration + +To configure the instance-level authentication configuration + +1. Go to **Settings** > **Instance login**. (Example URL - `https://app.corp.com/instance-settings/instance-login`) + +2. On this page, you can configure the following settings: + +only instance level login + +### SSO (Single Sign-On) + +- SSO makes it easier for organizations to manage user access. Users can use one login for different tools, and admins can quickly add or remove access when needed. Thus, it improves an organization's onboarding and offboarding experience. + +- At the instance level you can configure SSO with Google, GitHub, and OpenID Connect. Please check the [SSO docs](/docs/user-management/sso/overview) for a detailed guide on SSO configuration. + +- You can also configure the Google or Github with Environment Variables. To set Google as default SSO use the following environment variable. + + | Variable | Description | + | --------- |:-----:| + | SSO_GOOGLE_OAUTH2_CLIENT_ID | Google OAuth client id | + +- To set GitHub as the default SSO use the following environment variables: + + | Variable | Description | + | --------- |:-----:| + | SSO_GIT_OAUTH2_CLIENT_ID | GitHub OAuth client ID | + | SSO_GIT_OAUTH2_CLIENT_SECRET | GitHub OAuth client secret | + | SSO_GIT_OAUTH2_HOST | GitHub OAuth host name if GitHub is self-hosted | + + +### Allowed Domains + +- This feature helps restrict login access to specific email domains, ensuring that only authorized users from your organization can sign up or log in. + +- You can add multiple domains for login by specifying allowed domain names, separated by commas. **Example:** `corp.com`, `corp.io`, `corp.ai` + + +### Sign-Up Without Invitations + +- This feature allows organizations to simplify onboarding by letting users sign up without needing an invitation. + +- The **Enable Signup** feature lets users create accounts without being invited. + +- This feature is available only when the Personal Workspace option is enabled in the Manage Instance settings. When users sign up with this feature enabled, a new personal workspace is automatically created for them, and they are assigned as the admin of that workspace. Refer to [Sign-Up Documentation](/docs/user-management/onboard-users/self-signup-user#enable-sign-up-at-instance-level) to learn more. + +### Password Login + +- Password login allows users to log in using their email and password. However, organizations can also use SSO for better security and control. + +- Toggle this setting to **enable** or **disable** password login on the login page. Make sure to disable password login only when your SSO is configured otherwise, you will get locked out. + +### Enable Workspace Login Configuration + +- This feature allows workspace admins to customize login settings for their specific workspaces. It is useful when different workspaces in the same instance require distinct login configurations. + +- Once enabled, workspace-specific settings will override the instance-level configuration for those workspaces. + +### Automatic SSO Login + +- This feature eliminates the need for users to interact with the login page by directly authenticating them via the configured SSO provider. + +- To Enable the Automatic SSO Login, ensure the password login is disabled and only one SSO provider is configured. + +### Custom Logout URL + +- A Custom Logout URL allows organizations to redirect users to a specific page after they log out. This can be useful for redirecting users to a company portal or a feedback form. + +- Enter the desired logout URL in the **Custom Logout URL** field to configure this. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/overview.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/overview.md new file mode 100644 index 0000000000..c07c2455da --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/overview.md @@ -0,0 +1,61 @@ +--- +id: overview +title: Overview +--- + +Authentication in ToolJet ensures secure access to your applications and data.In self-hosted deployments, authentication can be configured at two levels: + +- **Instance Level:** Applies globally across all workspaces within the instance. Only the super admin can configure this. + +- **Workspace Level:** Overrides instance-level configuration for workspaces where it is applied. Both super admins and workspace admins can configure it. + + +## Scenarios for Authentication Configuration + +ToolJet supports flexible authentication setups, allowing instance-level, workspace-level, or a mix of both configurations. You can configure [SSO](/docs/user-management/sso/overview) or email-password login at both the levels. Below are common scenarios to guide your setup. + +### 1\. Only Instance-Level Login + +Instance-level login configuration is a global setting that applies across all workspaces within a ToolJet instance. + + +**Example:** Imagine a company, Nexus Corp, that wants to build internal application with ToolJet for three departments: Marketing, Sales, and Engineering. To ensure better collaboration, they need to isolate the applications and data sources for each department. Since all these departments use the same login system as they belong to the same company, an instance-level configuration is suitable setup for this scenario. Here’s how this can be set up: + +- Create three workspaces—one for each department: Marketing, Sales, and Engineering. This ensures the applications and data sources for each department remain isolated. + +- Since all workspaces belong to a single instance of the company, configure authentication at the instance level. For example, if the company uses Google Workspace, they can configure Google SSO at the instance level. + +- This allows users across all workspaces to log in using the same authentication system. + +only instance level login + + +### 2\. Only Workspace-Level Login + +Workspace-level login allows individual workspaces to define their own authentication configurations, overriding the global instance-level settings. This approach is ideal for organizations with diverse authentication needs across departments or teams. + + +**Example** Consider a service-based company, Pixel Technologies Inc., that serves three client companies: GreenTech Ltd., BlueWave Corp., and EcoBuild Enterprises. To provide customized solutions, Tech Solutions Inc. have to isolate applications, users and datasource and access control configuration for each client company. In this scenario, service-based company can do the following setup: + +- Create a workspace for each client company: GreenTech Ltd., BlueWave Corp., and EcoBuild Enterprises. This ensures the applications and data sources for each client remain isolated. + +- Configure individual workspace-level login settings for each workspace. For example, GreenTech Ltd may use Google SSO, BlueWave Corp. may prefer Azure AD, and EcoBuild Enterprises might us both SAML SSO and a custom email-password authentication system. + +only instance level login + +### 3\. Instance-Level and Workspace-Level Login (Mixed Configuration) + +In this setup, some workspaces inherit the instance-level configuration, while others override it with workspace-specific login settings. + + +**Example** Consider a large company, Global Dynamics Ltd., with three departments: Marketing, Engineering, and HR. To ensure better collaboration, they need to isolate the applications and data sources for each department. Global Dynamics Ltd. wants to maintain a separate login for the applications related to the HR department to comply with strict security and compliance requirements. For the other departments, they prefer to use a common authentication at the instance level. + +In such scenarios where company wants to implement a mixed authentication configuration, they can do the following setup. + +- Create three workspaces—one for each department: Marketing, Engineering, and HR. This ensures the applications and data sources for each department remain isolated. + +- The Marketing and Engineering workspaces can inherit the instance-level configuration. For instance, they use Google OAuth configured at instance level. + +- The HR workspace, due to compliance and security policies, requires isolated login settings. Thus configures workspace-level login settings, such as SAML authentication, which will override the instance level configuration. + +only instance level login \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/workspace-login.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/workspace-login.md new file mode 100644 index 0000000000..e4dbb534da --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/authentication/self-hosted/workspace-login.md @@ -0,0 +1,62 @@ +--- +id: workspace-login +title: Workspace Login +--- + + +In self-hosted deployments, it can be configured at two levels: **Instance Level**, which applies globally across all workspaces and is configurable only by the super admin, and **Workspace Level**, which overrides the instance-level settings for specific workspaces and can be configured by both super admins and workspace admins. This guide focuses on configuring workspace-level authentication. + + +### Configuration + +To configure the workspace-level authentication configuration + +1. Go to **Workspace Settings** > **Workspace login**. (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + +2. On this page, you can configure the following settings: + + workspace level login + + +### SSO (Single Sign-On) + +- SSO makes it easier for organizations to manage user access. Users can use one login for different tools, and admins can quickly add or remove access when needed. Thus, it improves an organization's onboarding and offboarding experience. + +- At the workspace level, you can enable the **Instance SSO** toggle to inherit instance-level configured SSO, or you can also configure the workspace-level SSO with Google, GitHub, OpenID Connect, LDAP, and SAML. Please check the [SSO docs](/docs/user-management/sso/overview) for a detailed guide on SSO configuration. + + +### Allowed Domains + +- This feature helps restrict login access to specific email domains, ensuring that only authorized users from your organization can sign up or log in. + +- You can add multiple domains for login by specifying allowed domain names, separated by commas. **Example:** `corp.com`, `corp.io`, `corp.ai` + + +### Sign-Up Without Invitations + +- This feature allows organizations to simplify onboarding by letting users sign up without needing an invitation. + +- The **Enable Signup** feature lets users create accounts without being invited. + +- When users sign up with this feature enabled, they are assigned to the end user of that workspace. Workspace admin can later change the [role](/docs/user-management/role-based-access/user-roles) of the user once the user is on-boarded to the workspace. Refer to [Sign-Up Documentation](/docs/user-management/onboard-users/self-signup-user#enable-sign-up-at-workspace-level) to learn more. + + +### Password Login + +- Password login allows users to log in using their email and password. However, organizations can also use SSO for better security and control. + +- Toggle this setting to **enable** or **disable** password login on the login page. Make sure to disable password login only when your SSO is configured otherwise, you will get locked out. + +- User password authentication will be disabled after a predefined number of failed login attempts to enhance security. By default, users are allowed **5 retries**, but this can be adjusted using the `PASSWORD_RETRY_LIMIT` environment variable. To disable this feature, set `DISABLE_PASSWORD_RETRY_LIMIT` to `true`. + + | Variable | Description | Default Value | + | --------- |-------------|---------------| + | `DISABLE_PASSWORD_RETRY_LIMIT` | Set to `true` to disable the password retry limit feature. | `false` | + | `PASSWORD_RETRY_LIMIT` | Specifies the maximum number of allowed retries before disabling authentication. | `5` | + + +### Automatic SSO Login + +- This feature eliminates the need for users to interact with the login page by directly authenticating them via the configured SSO provider. + +- To Enable the Automatic SSO Login, ensure the password login is disabled and only one SSO provider is configured. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/group-sync/oidc.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/group-sync/oidc.md new file mode 100644 index 0000000000..a9ae276dd0 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/group-sync/oidc.md @@ -0,0 +1,64 @@ +--- +id: oidc +title: OpenID Connect +--- + +
    + Icon + Paid feature +
    + +In ToolJet, you can use the group synchronization feature to automatically update user roles and custom groups from the identity provider. This functionality enables centralized access management, reduces the risk of manual errors, enhances security, and simplifies the user onboarding process. Group Sync is only available at the workspace level. + +Group synchronization occurs at every login. Users must log out and log back in for changes to be reflected. Manual editing of groups in ToolJet is not recommended as changes will be overwritten upon subsequent logins. + +:::caution Deleting a user from Identity provider +Whenever a user is deleted from the Identity Provider, admins needs to manually archive the user in ToolJet. Otherwise, if password login is enabled, the user can still log in using their password. +::: + +If the license expires or downgrades to a plan without group sync, both SSO and group sync features will be disabled. Users will need to log in via alternative SSO methods or email/password. If the license limit is reached, new users will not be allowed to log in. + +## Group Mapping + +Group mapping in ToolJet follows these principles: + +- Default 1:1 mapping based on group names (case-sensitive). +- Custom group mapping can be configured. +- Users without a matching group are assigned to the **end-users** group. + +### Group Mapping Scenarios + +| Groups in IdP |
    Groups in ToolJet
    | Role Mapping Settings | Result | +|---------------|-------------------|------------------------|--------| +| **admin**, **builder**, **end-user** | Exists (User Roles) | None | User is assigned with the corresponding user role. | +| **engineers** | Exists | None | User added to **engineers** custom group and assigned either **end-users** or **builders** user role based on permissions. | +| **engineers** | **engineers** - Doesn't exist
    **developer** - Exists | **engineers → developers** | User added to **developers** custom group and assigned **builder** or **end-user** role based on permissions. | +| **admin**, **developers** | Exists | None | User added to **developers** custom group and assigned **admin** user role. | +| no group | N/A | None | User added to **end-users** default group. | + +## Configure OIDC Group Sync in ToolJet + +To set up OIDC group synchronization in ToolJet follow these steps: + +1. Navigate to the **Workspace Settings** > **Workspace Login** Tab.
    + (Example URL: ) +2. Click on the OpenID Connect under the SSO section. +3. Setup the OpenID Connect SSO by following this [guide](/docs/user-management/sso/oidc/setup). +4. Enable the **Group Sync** toggle and provide the following information: + +- **Claim name**: Enter the name of the claim in the OIDC token that contains group information (e.g., groups). +- **Group mapping**: Configure how IdP groups map to ToolJet groups. Use the format: + ``` + IdP Group -> ToolJet Group, Another IdP Group -> Another ToolJet Group + ``` + For example: + ``` + Marketing Team -> marketing, Sales Team -> sales + ``` + + OIDC Group Sync Config diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/archive-user.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/archive-user.md new file mode 100644 index 0000000000..470c1d2f97 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/archive-user.md @@ -0,0 +1,91 @@ +--- +id: archive-user +title: Archive and Unarchive +--- + +Admins can archive users in a workspace which will remove the access to the workspace for the user but will preserve all the apps and changes done by the user and the user can be re-invited to the workspace by unarchiving the user if needed. + +:::info +1. Archived users will not be counted for billing/licensing. +2. There must be at least one active admin; all the admins in a workspace cannot be archived. +::: + +## Steps to Archive User + +### Instance Level + +When a user is archived at the instance level, they will automatically be archived from all the workspaces and cannot be invited to any new workspace. Follow these steps to archive a user at the instance level: + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user that need to be archived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Select **Archive user**. + +5. The status of the user will be updated to archived. + Workspace Level Permissions + +### Workspace Level + +Archiving a user at the workspace level will only remove their access to that specific workspace. The user will still have access to any other workspaces where they are invited. Follow these steps to archive a user at the workspace level: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user that need to be archived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Select **Archive user**. + +5. The status of the user will be updated to archived. + Workspace Level Permissions + +## Steps to Unarchive User + +### Instance Level + +When a user is unarchived at the instance level, after that the admins will need to unarchive or invite the user again at individual workspace. + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user that need to be unarchived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Select **Unarchive user**. + +5. The status of the user will be updated to invited. + Workspace Level Permissions + +### Workspace Level + +If a user is unarchived at the workspace level, they are automatically unarchived at the instance level as well. + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user that need to be unarchived and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +3. Select **Unarchive user**. + +4. The status of the user will be updated to invited and the user will recive a new invitation mail to join the workspace. + Workspace Level Permissions diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/bulk-invite-user.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/bulk-invite-user.md new file mode 100644 index 0000000000..bc43259cad --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/bulk-invite-user.md @@ -0,0 +1,69 @@ +--- +id: bulk-invite-users +title: Bulk Invite +--- + +Admins can bulk invite users to a workspace using a CSV file containing user email addresses, **[roles](/docs/user-management/role-based-access/user-roles)**, **[groups](/docs/user-management/role-based-access/custom-groups)**, and other details. The invited users receive an email with instructions to join the workspace, ensuring a seamless onboarding process. + +## Steps to Bulk Invite Users + +Role Required: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Click on the **Add users** button. + Add user button + +4. Switch to **Upload CSV file** tab. + +5. Upload a CSV file consisting following fields: + + | Field | Required/Optional | Example | + |:-----|:---------|:-------| + | First Name | Either of first or last name is required. | John | + | Last Name | Either of first or last name is required. | Doe | + | Email address | Required | john@corp.com | + | User Role | Required | Admin | + | Group | Optional | Manager | + | Metadata | Optional | `{"apiKey": "abc123"}` | + + You can also download the template to edit. +6. Click on **Upload users**. + Add user button + +## Email Invitation + +Pre-Requisite: **[Setup SMTP Server](/docs/tj-setup/smtp-setup/configuration)** + +Once a user is invited to the workspace, they will receive an email containing a unique workspace invite link. By clicking the link, the user will be redirected to the workspace login or signup page to complete the onboarding process. + +Workspace Level Permissions + +## Invitation URL + +On Self-Hosted ToolJet, admin users can copy unique invitation URL and share with the user. + +Workspace Level Permissions + +## User Status + +Admin users can track the status of users as follows: + +### Self-Hosted ToolJet + +- **Invited**: The user has been invited to join the workspace. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +### ToolJet Cloud + +- **Requested**: The user has been invited to the current workspace but doesn't have a ToolJet account. +- **Invited**: The user has been invited to the current workspace and has a ToolJet account. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +Workspace Level Permissions + diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/invite-user.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/invite-user.md new file mode 100644 index 0000000000..7389ba7130 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/invite-user.md @@ -0,0 +1,66 @@ +--- +id: invite-user +title: Invite +--- + +Admins can invite users to a workspace using their email addresses and assign them specific **[roles](/docs/user-management/role-based-access/user-roles)** and **[groups](/docs/user-management/role-based-access/custom-groups)** to manage permissions. The invited users receive an email with instructions to join the workspace, ensuring a seamless onboarding process. + +## Steps to Invite a User + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Click on the **Add users** button. + Add user button + +4. Fill out the following details: + | Field | Required/Optional | Example | + |:-----|:---------|:-------| + | Name | Required | John Doe | + | Email address | Required | john@corp.com | + | Select groups | Required | USER ROLE: **Admin** | + | | Optional | CUSTOM GROUPS: **Manager** | + | [User metadata](/docs/user-management/onboard-users/user-metadata) | Optional | `{"apiKey": "abc123"}` | + + Invite User + +5. Click on the **Invite users** button to send the invitation. + + +## Email Invitation + +Pre-Requisite: **[Setup SMTP Server](/docs/tj-setup/smtp-setup/configuration)** + +Once a user is invited to the workspace, they will receive an email containing a unique workspace invite link. By clicking the link, the user will be redirected to the workspace login or signup page to complete the onboarding process. + +Workspace Level Permissions + +## Invitation URL + +On Self-Hosted ToolJet, admins can copy unique invitation URL and share with the user. + +Workspace Level Permissions + +## User Status + +Admin users can track the status of users as follows: + +### Self-Hosted ToolJet + +- **Invited**: The user has been invited to join the workspace. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +### ToolJet Cloud + +- **Requested**: The user has been invited to the current workspace but doesn't have a ToolJet account. +- **Invited**: The user has been invited to the current workspace and has a ToolJet account. +- **Active**: The user is a member of the current workspace. +- **Archived**: The user has been archived by the admin. + +Workspace Level Permissions + diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/overview.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/overview.md new file mode 100644 index 0000000000..a0195eb361 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/overview.md @@ -0,0 +1,27 @@ +--- +id: overview +title: Overview +--- + +ToolJet provides flexible options for onboarding users and a straightforward process for offboarding users when needed. + +## Onboarding Users + +Users can be added to ToolJet either through an invitation or by signing up. + +### Inviting Users + +Admin users can onboard users by sending invitations: +- **Individually**: Send a personalized invitation to a single user by entering their email address. For detailed steps, refer to the **[Invite User](/docs/user-management/onboard-users/invite-user)** guide. +- **In Bulk**: Upload a CSV file containing user details to invite multiple users at once. For detailed steps, refer to the **[Bulk Invite Users](/docs/user-management/onboard-users/bulk-invite-users)** guide. + +Invited users will receive an email to join the ToolJet workspace. + +### User Sign-Up + +Admin users can enable the sign-up feature, allowing users to register themselves. By sharing the login URL, users can create their accounts and join the workspace without needing an invitation. For more details, refer to the **[Sign-Up Users](/docs/user-management/onboard-users/self-signup-user)** Guide. + +## Offboarding Users + +To offboard users, admins can **[archive](/docs/user-management/onboard-users/archive-user#steps-to-archive-user)** the user accounts. When archived, the user’s access to the workspace/instance is disabled while preserving their data.
    +Archived accounts can be **[unarchived](/docs/user-management/onboard-users/archive-user#steps-to-unarchive-user)** at any time, restoring the user’s access and roles. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/self-signup-user.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/self-signup-user.md new file mode 100644 index 0000000000..90f507adc0 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/self-signup-user.md @@ -0,0 +1,71 @@ +--- +id: self-signup-user +title: Sign-Up +--- + +In ToolJet, the sign-up feature lets admins enable direct user registration via a sign-up URL, eliminating the need for invitations. For Self-Hosted version, the enable sign-up can be done at both instance level and workspace level. + +## Enable Sign-Up at Instance Level + +Role Required: **Super Admin**
    + +Super admin can enable sign-up at instance level, and whenever a user joins an instance using the self sign-up, a new personal workspace is created for that user and the workspace admin role will be assigned to the user. + +Follow the steps to enable sign-up at instance level: + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > Manage instance settings**.
    + (Example URL - `https://app.corp.com/instance-settings/manage-instance-settings`) + +3. Ensure that you have allowed personal workspace. + Workspace Level Permissions + +4. Now, go to **Instance login** tab.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + +5. Enter allowed domains that can access the workspace, you can enter multiple domain names separated by comma.
    +If you don't enter allowed domain then anyone with the login URL can sign-up to the workspace. + Workspace Level Permissions + +6. Click on the toggle button for the enable signup, by default enable signup is disabled. + Workspace Level Permissions + +7. Click on the **Save changes** button at the bottom of the page. + + Now, the users can signup on the ToolJet deployment URL.
    + (Example URL: `https://app.corp.com/signup`) + + Workspace Level Permissions + +## Enable Sign-Up at Workspace Level + +Role Required: **Admin**
    + +Admin can enable sign-up at workspace level and whenever a user joins a workspace using the self sign-up the end user role will be assigned to the user. + +Follow the steps to enable sign-up at workspace level: + +1. Go to **Workspace settings > Workspace login**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + +2. Enter allowed domains that can access the workspace, you can enter multiple domain names separated by comma.
    +If you don't enter allowed domain then anyone with the login URL can sign-up to the workspace. + Workspace Level Permissions + +3. Click on the toggle button for the enable signup, by default enable signup is disabled. + Workspace Level Permissions + +4. Click on the **Save changes** button at the bottom of the page. + +5. Copy the Login URL and share it with the users. + + Now users will be able to see a sign-up option on the login page.
    + (Example URL: `https://app.corp.com/login/nexus`) + + Workspace Level Permissions + + Users can navigate to the sign-up page from there and register themselves. + + Workspace Level Permissions + diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/user-metadata.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/user-metadata.md new file mode 100644 index 0000000000..239925e9e7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/onboard-users/user-metadata.md @@ -0,0 +1,43 @@ +--- +id: user-metadata +title: Metadata +--- + +In ToolJet, user metadata allows you to store additional information about users, such as user personal details, API keys, or role-specific data. This custom data is stored at the workspace level and can be used within your ToolJet applications. All metadata values are encrypted in the database for security, and in the user interface, metadata values are masked to protect sensitive information. + +## Adding User Metadata + +User metadata can be added either when inviting the user or after the user has joined the workspace. Follow these steps to add user metadata: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user whose metadata needs to be updated, click on the kebab menu (three dots) at the end of their row, and select **Edit user details**. + Edit User Details + +4. Click on **+ Add more** below User metadata, and enter the key-value pair. + Edit User Details + +5. Click on **Update** button at the bottom. + +## Using User Metadata in App Builder + +User metadata can be accessed within any application in the workspace through the global variable using the following syntax: + +```js +{{globals.currentUser.metadata}} +``` +To access a specific key-value pair from the metadata, use the following syntax: + +```js +{{globals.currentUser.metadata.}} // Replace with the key of the metadata value +``` + +:::info +Remember that while metadata values are masked in the user interface, they are accessible in the App builder. Ensure you handle any sensitive information appropriately in your app logic. +::: + diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/overview.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/overview.md new file mode 100644 index 0000000000..aabef88d13 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/overview.md @@ -0,0 +1,13 @@ +--- +id: overview +title: Overview +--- + +ToolJet provides comprehensive User Management and Access Control capabilities, allowing you to onboard and offboard users efficiently, configure diverse authentication methods, manage role-based permissions, and integrate with SSO providers. With features like group sync and user profile management, ToolJet ensures secure and flexible access control for your organization. + +- **Onboarding and Offboarding Users**: ToolJet provides flexible options to onboard and offboard users. +- **Authentication**: ToolJet ensures secure access with multiple login methods, SSO, and Two-Factor Authentication (2FA). +- **Role Based Access Control**: ToolJet enables granular access permissions by different roles and custom groups. +- **Single Sign-On (SSO)**: ToolJet streamlines authentication by allowing integrations with various identity providers. +- **Group Sync**: ToolJet supports group sync which helps keep group memberships updated automatically based on your organization's identity system. +- **User Management**: In ToolJet you can easily manage user profiles, including editing details and resetting passwords. diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/reset-password.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/reset-password.md new file mode 100644 index 0000000000..7c2e25daae --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/reset-password.md @@ -0,0 +1,43 @@ +--- +id: reset-password +title: Reset Password +--- + +When password login is enabled then there are two ways through which a user can reset their password. The first method is where user can reset their password by themselves. The second method is where a **Super Admin** can reset password for a user. + +## Forgot Password + +1. On the login page, click on the **Forgot Password**. + +2. Enter the registered email address associated with the account and then click on the **Send a reset link** button. + + General Settings: Reset Password + +3. Receive a password reset link via email. + +4. Click on the link to be directed to the password reset page. + + General Settings: Reset Password + +## Super Admin Reset Password + +If a user forgets their password or it needs to be updated, the super admin can easily reset the password for any user in the instance by following these steps: + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user for whose the password needs to be reset. + +4. Click on the kebab icon (three dots) on the right side of the user's name and select **Reset Password**. + + General Settings: Reset Password + +5. A modal will appear with two options to reset the password: + + a. **Automatically Generate Password**: Selecting this option will automatically generate a new password for the user.
    + b. **Create Password**: Selecting this option will allow the Super Admin to create a new password for the user. + + General Settings: Reset Password + diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/user-details.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/user-details.md new file mode 100644 index 0000000000..00c4176ab1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/user-details.md @@ -0,0 +1,25 @@ +--- +id: user-details +title: Edit User Details +--- + +At the instance level, Super Admins can edit a user's name or promote them to the Super Admin role. A Super Admin has access to all workspaces and inherits all the permissions of a Workspace Admin. At the workspace level, admins can update **[user roles](/docs/user-management/role-based-access/user-roles)**, **[groups](/docs/user-management/role-based-access/custom-groups)** or **[user metadata](/docs/user-management/onboard-users/user-metadata)**. + +## Update User's Name + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user whose details needs to be updated and click on the kebab menu (three dots) located at the end of their row. + Edit User Details Menu + +4. Select **Edit user details**. + +5. Update the user's name. + Edit User's Name' + +6. Click on **Update** at the bottom of the drawer. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/user-profile.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/user-profile.md new file mode 100644 index 0000000000..106b96485d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/profile-management/user-profile.md @@ -0,0 +1,25 @@ +--- +id: user-profile +title: Profile Settings +--- + +Using **Profile Settings**, a user can update their name, upload a profile avatar, or change their password. Follow these steps to make changes: + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Profile Settings**.
    + (Example URL - `https://app.corp.com/nexus/settings`) + +3. On the Profile Settings page, there are two sections: + + a. **Profile** + - Update your name, or upload an image for profile avatar. + - Click on **Update** button at the bottom of the section. + + b. **Change password** + - Enter your current password. + - Enter and confirm your new password. + - Click on **Change password** button at the bottom of the section. + +
    + Edit User Details Menu diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/access-control.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/access-control.md new file mode 100644 index 0000000000..62beb41161 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/access-control.md @@ -0,0 +1,88 @@ +--- +id: access-control +title: Access Control +--- + +ToolJet enables you to manage access control by configuring permissions like create and delete. Access control can be applied to all of your resources such as apps and data sources. Additionally, ToolJet supports granular access control, allowing you to configure permissions for individual resources to ensure precise and secure management. + +## 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. | +| **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. | + +To configure view or edit access, please refer to **[Granular Access Control](#granular-access-control)**. + +:::info +If a user has the create permission and creates a resource, the user becomes the owner of that resource and has all the permissions related to it by default.
    +For example, if a user creates a data source A, then by default, the user will have the configure and build access for data source A. +::: + +### Configuring Permissions + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) + +3. Select the group to configure permissions. + +4. Switch to the **Permissions** tab and configure the required permissions. + Create Custom Group + + +## Granular Access Control + +In ToolJet, you can set granular level access control for apps and data sources, by configuring permissions like view access or edit access, to manage who can interact with the resources in your workspace. You can apply permissions either to all resources (e.g., all apps or all data sources) or to specific, selected resources, offering flexibility and precision in managing access.
    +To configure Granular Access Control, you need to create custom groups. Refer to **[custom groups](/docs/user-management/role-based-access/custom-groups)** guide for more information. + +### Apps + +- **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. + +- **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. + +- **All apps**: Provides the selected access (Edit or View) to all the apps in the workspace, including any newly created apps. + +- **Custom**: Provide the selected access (Edit or View) only to the specified apps. + + Create Custom Group + +### Data Sources + +- **Configure**: Users in the group can access and edit the configuration details of the selected data sources. This permission should be given to the admin users who needs to configure the data source. + +- **Build with**: Users in the group can use the selected data sources in apps and workflows to create queries. This permission should be given to the builders or developers who will create the queries for the apps or workflows. + +- **All data sources**: Provides the selected access (Configure or Build with) to all the data sources in the workspace, including any newly created data source. + +- **Custom**: Provide the selected access (Configure or Build with) only to the specified data sources. + + Create Custom Group + +### Configuring Granular Access Permission + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) + +3. Select the group to configure granular access permissions. + +4. Switch to the **Granular access** tab and click on **+ Add permission** button. + +5. Select the resource (Apps/Data source) based on requirement. Give a name for the permission, configure required permission and click on **Add** at the bottom of the modal. + + Create Custom Group diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/custom-groups.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/custom-groups.md new file mode 100644 index 0000000000..1b8b0aaffa --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/custom-groups.md @@ -0,0 +1,53 @@ +--- +id: custom-groups +title: Custom Groups +--- + +ToolJet allows you to create custom groups to manage permissions, access, and users effectively. Each custom group can be configured with a specific set of permissions and can include only the users who require those permissions. This helps maintain precise control over what users can access and modify within your workspace. + +For example, if you have apps built for two teams, HR and Sales, and you want team members to only have access to the apps that are relevant to their team, then you can create two custom groups named HR and Sales, and then select the desired apps by configuring the **[granular access permissions](/docs/user-management/role-based-access/access-control#granular-access-control)**. + +## Creating Custom Groups + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) +3. Click **+ Create new group**. +4. Enter a name for the group and click **Create Group**. + +Refer to the **[Access Control](/docs/user-management/role-based-access/access-control)** guide to configure permissions. + +Create Custom Group + +## Deleting a Custom Group + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) +3. Click on the kebab menu next to the group you want to delete. +4. Select **Delete** from the dropdown and confirm the action in the pop-up dialog. + + Deleting Custom Group + +## Duplicate Group + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. +2. Go to **Workspace Settings** > **Groups**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/groups`) +3. Click on the kebab menu next to the group you want to duplicate. +4. Select **Duplicate** from the dropdown and select the parts of the group you want to duplicate. +5. Click **Duplicate** to create a new group with the selected permissions. + + Duplicate Group + +## Inheritance and Overrides +- Users inherit permissions from their assigned role and any custom groups they belong to. +- Adding users to custom groups with higher permissions than their current role will automatically upgrade their user role to match the higher access level. +- If a user’s role is downgraded to one with lower permissions, they will automatically be removed from any custom groups that provided higher access than their new role allows. +- When a user belongs to multiple groups, they receive the highest level of permission granted by any of their groups. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/super-admin.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/super-admin.md new file mode 100644 index 0000000000..2d16d8111b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/super-admin.md @@ -0,0 +1,62 @@ +--- +id: super-admin +title: Super Admin +--- + +On a self-hosted ToolJet, a Super Admin is the user who has full access to all the Workspaces, Users, and Groups of an instance. An instance can have more than one Super Admin. A Super Admin has full control over other users' workspaces and can create users, groups, and other super admins. The user who creates the instance gets the Super Admin role by default. + +## Admin v/s Super Admin + +### User Management + +| Privilege | Admin | Super Admin | +| --------- |:-----:|:-----------:| +| Manage Users in their workspace ([Invite](/docs/user-management/onboard-users/invite-user)/[Archive](/docs/user-management/onboard-users/archive-user#steps-to-archive-user)/[Unarchive](/docs/user-management/onboard-users/archive-user#steps-to-unarchive-user)) | ✅ | ✅ | +| [Archive](/docs/user-management/onboard-users/archive-user#steps-to-archive-user)/[Unarchive](/docs/beta/user-management/onboard-users/archive-user#steps-to-unarchive-user) any user from all the workspaces in the instance | ❌ | ✅ | +| [Reset password of any user](/docs/user-management/profile-management/reset-password#super-admin-reset-password) | ❌ | ✅ | +| [Edit name of any user](/docs/user-management/profile-management/user-details) | ❌ | ✅ | +| [Make any user Super Admin](#promote-a-user-to-super-admin) | ❌ | ✅ | + +### Workspace Management + +| Privilege | Admin | Super Admin | +| --------- |:-----:|:-----------:| +| Manage Groups in their workspace ([Create Group](/docs/user-management/role-based-access/custom-groups#creating-custom-groups)/ Add or Delete Users from groups/ Modify Group Permissions) | ✅ | ✅ | +| [Manage SSO](/docs/user-management/sso/overview) in their workspace | ✅ | ✅ | +| [Manage Workspace Variables](/docs/security/constants/variables) in their workspace | ✅ | ✅ | +| [Manage Workspace Constants](/docs/security/constants/) in their workspace | ✅ | ✅ | +| [Manage Data Sources](/docs/data-sources/overview) for the user group in their workspace | ✅ | ✅ | +| Access any user's personal workspace (Create/Edit/Delete Apps) | ❌ | ✅ | +| Archive Admin or any user of any workspace | ❌ | ✅ | +| Access any user's ToolJet Database (Create/Edit/Delete Database)) | ❌ | ✅ | +| Manage any workspace's setting (Groups/SSO/Workspace constants) | ❌ | ✅ | +| Manage all users from all the workspaces in the instance | ❌ | ✅ | + +### Instance Management + +| Privilege | Admin | Super Admin | +| --------- |:-----:|:-----------:| +| Manage all workspaces in the instance(Archive/Unarchive) | ❌ | ✅ | +| Restrict creation of personal workspace of users | ❌ | ✅ | +| Configure instance level login | ❌ | ✅ | +| Enable Multiplayer editing | ❌ | ✅ | +| Implement White Labelling | ❌ | ✅ | + +## Promote a User to Super Admin + +Role Required: **Super Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Settings > All Users**.
    + (Example URL - `https://app.corp.com/instance-settings/all-users`) + +3. Spot the user whose details needs to be updated and click on the kebab menu (three dots) located at the end of their row. + Edit User Details Menu + +4. Select **Edit user details**. + +5. Enable the toggle in front of **Super Admin** to promote the user to a Super Admin. + Super Admin Toggle + +6. Click on **Update** at the bottom of the drawer. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/user-roles.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/user-roles.md new file mode 100644 index 0000000000..92e4399901 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/role-based-access/user-roles.md @@ -0,0 +1,52 @@ +--- +id: user-roles +title: User Roles +--- + +ToolJet enables you to use Role-Based Access Control (RBAC) system to manage security and access to your resources such as apps, data sources and workspace variables, etc. ToolJet provides a set of pre-defined user roles and the ability to create **[custom groups](/docs/user-management/role-based-access/custom-groups)** for more granular access control. User roles are taken into account for licensing and billing purposes, refer **[ToolJet Pricing](https://www.tooljet.com/pricing)** for more information. + +## Default User Roles + +ToolJet has three default user roles at the workspace level, each with different levels of access: + +1. **Admin**: An admin is a user with access to manage settings, control user permissions, and oversee the overall functionality. The admin user has full access to all resources. +2. **Builder**: A builder is a user responsible for creating, customizing, and configuring the application. +3. **End-user**: An end user is a consumer who interacts with the final application to perform tasks or achieve specific goals. + +## Permissions for User Roles + +Admin user has access to all the permission at workspace level, while an end user can only view and use the released apps they are given access to and permissions can be configured for a builder. + +| Resource | Permission | Admin | Builder | End User | +|:----------|:-----------|:-----------:|:---:|:---:| +| **Apps** | Create/Update/Delete | ✅ | Configurable | ❌ | +| | View | ✅ | Configurable | Configurable | +| **Data sources** | Create/Update/Delete | ✅ | Configurable | ❌ | +| **Folder** | Create/Update/Delete | ✅ | Configurable | ❌ | +| **Workspace constants/variables** | Create/Update/Delete | ✅ | Configurable | ❌ | + +## Manage User Roles + +In ToolJet, user roles can be updated easily, follow these steps to update user role: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Users**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/users`) + +3. Spot the user whose roles need to be updated and click on the kebab menu located at the end of their row. + Workspace Level Permissions + +4. Click on **Edit user details**, a right panel will appear. + +5. Update the role from the User groups dropdown. + Workspace Level Permissions + +6. Click on **Update** button present at the bottom of the panel. + +7. Read and accept the pop-up warning by clicking on **Continue** button. + Workspace Level Permissions + +8. The user role will be updated for that user. diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/github.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/github.md new file mode 100644 index 0000000000..2669e52b79 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/github.md @@ -0,0 +1,48 @@ +--- +id: github +title: GitHub +--- + +GitHub SSO in ToolJet enables seamless authentication, allowing users to log in with their GitHub credentials. This integration simplifies team access management, enhances security, and streamlines workflows for developers and collaborators. + +## Configure GitHub SSO + +To enable GitHub Single Sign-on (SSO) for your ToolJet, follow these steps: + +Role Required:
    +     For Instance Level: **Super Admin**
    +     For Workspace Level: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. For Instance Level:
    +Go to **Settings > Instance login**.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + + For Workspace Level:
    + Go to **Workspace Settings > Workspace 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 GitHub. + Add user button + +4. After turning it on, a modal will appear with input fields for parameters such as Host name, Client ID, and Client secret. 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 that you will need to utilize in the GitHub Developer settings. + Add user button + +5. Go to **[GitHub Developer Settings](https://github.com/settings/developers)** and navigate to **OAuth Apps** and create a new OAuth App. + Add user button + +6. Enter the **App Name**, **Homepage URL**, and **Authorization callback URL**. The Authorization callback URL should be the generated **Redirect URL** in the ToolJet GitHub manage SSO page. Click on the Register application button to create the OAuth App. + Add user button + +7. The **Client ID** will be generated automatically. Generate the **Client Secret** by clicking the **Generate a new client secret** button. + Add user button + +8. Open the ToolJet's GitHub SSO settings and enter the obtained **Client ID** and **Client Secret**. + Add user button + +9. If you are using GitHub Enterprise self-hosted, enter the Host Name. The host name should be a URL and should not end with `/`, for example, `https://github.tooljet.com`. If it is not self-hosted, you can skip this field. + +10. Finally, click on the **Save changes** button and the GitHub sign-in button will now be available in your ToolJet login screen. + +11. Obtain the Login URL from the Instance/Workspace login page. diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/google.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/google.md new file mode 100644 index 0000000000..0163166e06 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/google.md @@ -0,0 +1,54 @@ +--- +id: google +title: Google +--- + +You can configure Google SSO in ToolJet at both instance and workspace level for seamless authentication and enanched security. + +## Configure Google SSO + +To enable GitHub Single Sign-on (SSO) for your ToolJet, follow these steps: + +Role Required:
    +     For Instance Level: **Super Admin**
    +     For Workspace Level: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. For Instance Level:
    +Go to **Settings > Instance login**.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + + For Workspace Level:
    + Go to **Workspace Settings > Workspace 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 Google. + Add user button + +4. After turning it on, a modal will appear with input fields for parameters such as Host name, Client ID, and Client secret. 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 that you will need to utilize in the Google Cloud Console. + Add user button + +5. Go to **[Google Cloud console](https://console.cloud.google.com/)** and create a project. + Create New Project + +6. Go to the **[Google Cloud console credentials page](https://console.cloud.google.com/apis/credentials)**, and create an OAuth client ID. + General Settings: SSO + +7. You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. + General Settings: SSO + +8. You'll be led to an app registration page, fill out the required details and click on **SAVE AND CONTINUE** button at the bottom. + +9. On the second page you can set OAuth scopes. Select **ADD OR REMOVE SCOPES** and add the scopes **userinfo.email** and **userinfo.profile** as shown in the image. This will allow ToolJet to store the email and name of the user who is signing in. Click on **SAVE AND CONTINUE**. + General Settings: SSO + +10. Go to **Credentials** tab, click on **+ CREATE CREDENTIAL** and select **OAuth client ID**. Select Application type and give a name, under **Authorised JavaScript origins**, set the domain on which ToolJet is hosted and under **Authorized redirect URIs**, enter the Redirect URL which was generated in ToolJet's Google SSO settings. + General Settings: SSO + +11. Click on **Create** and copy the **Client ID**. + General Settings: SSO + +12. Configure the **Client ID** in ToolJet's Google SSO settings. + General Settings: SSO diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/ldap.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/ldap.md new file mode 100644 index 0000000000..03075d9d7e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/ldap.md @@ -0,0 +1,43 @@ +--- +id: ldap +title: LDAP +--- + +Lightweight Directory Access Protocol (LDAP) is a protocol used to access and manage directory information, enabling centralized authentication and user management. By configuring LDAP with directory services you can streamline secure user authentication and access control in ToolJet. + +## Configure LDAP SSO + +To set up LDAP as Single Sign-On (SSO) for ToolJet, follow these steps: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Workspace login**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + + SSO :LDAP + +3. To **enable** LDAP, toggle the switch. Then, add the configuration: + + - **Name**: Enter the name of the SSO. + - **Hostname**: Provide the hostname or IP address of your LDAP server. + - **Port**: Enter the Port number of LDAP server. + - **Base DN**: Enter the base distinguished name. + - **SSL**: Toggle this option to enable the SSL. After enabling you can select the type of SSL: **None** or **Certificates**. If you choose Certificates, you'll need to provide the **Client Key**, **Client Certificate**, and **Server Certificate**. +
    + SSO :LDAP + +4. After making the necessary configurations, click the **Save Changes** button located at the bottom. + +5. Next, proceed to the **Workspace login** and copy the **Login URL** provided. + +6. The **Login URL** obtained can be utilized for accessing the workspace. Please note that ToolJet supports LDAP login at the workspace level and not at the instance level. Thus, users will be logged in specifically to the chosen workspace. + SSO :LDAP + +7. Click on the **Sign in with ``** button, and provide your username and password to log in to the workspace. For signing in, ToolJet uses the **common name (cn)** associated with each LDAP server user as the **Username**. Upon the initial login, users will be redirected to the **Workspace Invite** page, while subsequent logins will lead them directly to the ToolJet dashboard. + +:::info +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. +::: + diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/azuread.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/azuread.md new file mode 100644 index 0000000000..43797eb263 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/azuread.md @@ -0,0 +1,34 @@ +--- +id: azuread +title: AzureAD +--- + +# AzureAD Single Sign-on + +:::info +To construct a Well Known URL refer this link :: https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-protocols-oidc +::: + +- Open your organization page and select `App registration`, and then select `New registration`. + Azure AD: SSO + +- Enter name, select supported account type and enter the redirect URL which can be copied from `Manage SSO -> Open Id -> Redirect URL, click on register`. + Azure AD: SSO + +- Application will be registered and will be able to view the details + +- Configure Application (Client) ID as `client id` in Open Id configuration page. + Azure AD: SSO + +- Click on `Add certificate or secret` next to the **Client credentials**. + +- Click on `+ New Client Secret` + Azure AD: SSO + +- Give a description, set the expiry, and then click on the `Add` button. + Azure AD: SSO + +- Secret will be created, copy value and add it to the `client secret` section of Open Id SSO config. + +- You can brand the redirect page using the branding and properties option. + Azure AD: SSO diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/google.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/google.md new file mode 100644 index 0000000000..ec3a3136d9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/google.md @@ -0,0 +1,31 @@ +--- +id: google +title: Google (OIDC) +--- + +Google can be configured as the Identity Provider for OIDC, which is an authentication protocol that securely verifies user identities through a trusted provider. This document explains how to obtain the required credentials from the Google console. Refer to the **[OIDC Setup](/docs/user-management/sso/oidc/setup)** Guide to configure OIDC in your application. + +## Generating Client ID and Client Secret on GCS + +1. Go to **[Google Cloud console](https://console.cloud.google.com/)** and create a project. + Create New Project + +2. Go to the **[Google Cloud console credentials page](https://console.cloud.google.com/apis/credentials)**, and create an OAuth client ID. + General Settings: SSO + +3. You'll be asked to select user type in consent screen. To allow only users within your workspace, select 'Internal', otherwise, +select 'External'. + General Settings: SSO + +4. You'll be led to an app registration page, fill out the required details and click on **SAVE AND CONTINUE** button at the bottom. + +5. On the second page you can set OAuth scopes. Select **ADD OR REMOVE SCOPES** and add the scopes **userinfo.email** and **userinfo.profile** as shown in the image. This will allow ToolJet to store the email and name of the user who is signing in. Click on **SAVE AND CONTINUE**. + General Settings: SSO + +6. Go to **Credentials** tab, click on **+ CREATE CREDENTIAL** and select **OAuth client ID**. Select Application type and give a name, under **Authorised JavaScript origins**, set the domain on which ToolJet is hosted and under **Authorized redirect URIs**, enter the Redirect URL which was generated in ToolJet's Google SSO settings. + General Settings: SSO + +7. Click on **Create** and copy the **Client ID** and **Client secret**. + General Settings: SSO + +8. Use `https://accounts.google.com/.well-known/openid-configuration` as the **Well Known URL**. diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/okta.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/okta.md new file mode 100644 index 0000000000..3c04a56277 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/okta.md @@ -0,0 +1,26 @@ +--- +id: okta +title: Okta +--- + +Okta can be configured as the Identity Provider for OIDC, which is an authentication protocol that securely verifies user identities through a trusted provider. This document explains how to obtain the required credentials from the Okta Developer Console. Refer to the **[OIDC Setup](/docs/user-management/sso/oidc/setup)** guide to configure OIDC in your application. + +## Generating Client ID and Client Secret on Okta Developer Console + +1. Sign in to the [Okta Developer Console](https://developer.okta.com/). + +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. + Okta: SSO + +4. Enter an **App integration name** and set the **Sign-in redirect URIs** to Redirect URL from ToolJet. + Okta: SSO + +5. Create the application. + +6. Copy the Client Credential and configure them in ToolJet. + Okta: SSO + +7. Follow [Okta Auth Servers Documentation](https://developer.okta.com/docs/concepts/auth-servers/#org-authorization-server) to find the well known URL. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/setup.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/setup.md new file mode 100644 index 0000000000..d55fecb638 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/oidc/setup.md @@ -0,0 +1,44 @@ +--- +id: setup +title: OpenID Connect Setup +--- + +
    + Icon + Paid feature +
    + +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. + +## Configuring OIDC + +Follow these steps to enable OIDC in your system: + +Role Required:
    +     For Instance Level: **Super Admin**
    +     For Workspace Level: **Admin** + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. For Instance Level:
    +Go to **Settings > Instance login**.
    + (Example URL - `https://app.corp.com/instance-settings/instance-login`) + + For Workspace Level:
    + Go to **Workspace Settings > Workspace 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 + +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 + +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. + +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.0.0-LTS/user-management/sso/overview.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/overview.md new file mode 100644 index 0000000000..824e9a096e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/overview.md @@ -0,0 +1,15 @@ +--- +id: overview +title: Overview +--- + +Single Sign-On (SSO) is an authentication process that allows users to access multiple applications or services with a single set of login credentials. By eliminating the need to log in separately to each application, SSO enhances user experience and security. + +Companies use SSO to simplify authentication, enhance security, and improve user experience by allowing access to multiple applications with one set of credentials. It reduces password fatigue, streamlines IT management, and boosts productivity while maintaining robust security compliance. + +ToolJet supports various SSOs such as: +- **[GitHub](/docs/user-management/sso/github)** +- **[Google](/docs/user-management/sso/google)** +- **[OpenID Connect](/docs/user-management/sso/oidc/setup)** +- **[LDAP](/docs/user-management/sso/ldap)** +- **[SAML](/docs/user-management/sso/saml/setup)** \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/saml/okta.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/saml/okta.md new file mode 100644 index 0000000000..360d6d02cf --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/saml/okta.md @@ -0,0 +1,65 @@ +--- +id: okta +title: Okta +--- + +Okta can be configured as the Identity Provider for SAML, which is an authentication protocol that securely verifies user identities through a trusted provider. This document explains how to obtain the required credentials from the Okta Developer Console. Refer to the **[SAML Setup](/docs/user-management/sso/saml/setup)** guide to configure SAML in your application. + +## Generating Metadata + +1. Sign in to the [Okta Developer Console](https://developer.okta.com/). + +2. Navigate to the **Applications** section and click **Create App Integration**. + Okta: SSO + +3. Select **SAML 2.0** as the **Sign-in method**. Click on the **Next** button. + Okta: SSO + +4. Configure the **General Settings**: + - **App Name**: Enter the application name to be displayed on the login page. + - **App Logo (optional)**: Upload a logo to be shown on the login page.

    + Okta General Settings + + +5. In the **Configure SAML** tab, configure the following fields:

    + **General**: + - **Single sign-on URL**: Redirect URL copied from the SAML configuration page in ToolJet. + - **Audience URI** (SP Entity ID): entityID present in XML file. + - **Default RelayState**: Leave this field blank. + - **Name ID format**: EmailAddress. + - **Application username**: Email. + - **Update application username on**: Create and update.

    + Okta Configure SAML General + + **Attribute Statements**: + + | Name | Name format | Value | + | --- | --- | ---- | + | email | Unspecified | user.email | + | name | Unspecified | user.firstName | + + Okta Configure SAML ATTRIBUTE STATEMENTS + + **Group Attribute Statements**: + + | Name | Name format | Filter | Value | + | --- | --- | --- | --- | + | groups | Unspecified | Matches regex | "*" | + + Okta Configure SAML ATTRIBUTE STATEMENTS + +6. Review and click on the **Next** button. + +7. Click on the **Finish** button to complete the Okta application configuration. + +8. Navigate to the **Sign On** tab and make sure **Application username format** is set to **Email**, otherwise click on the **Edit** button and update. + +9. Copy the **Metadata URL**. This URL will retrieve the XML metadata file for the Okta application. + Okta Sign On + +10. Paste the metadata URL into the **Identity provider metadata** field in the ToolJet SAML configuration. + +11. Ensure that Audience URI (SP Entity ID) from the XML file is added to the Configure SAML tab in the Okta application configuration. + +12. Test the SAML configuration by logging in to ToolJet using the Login URL. + SSO :SAMP diff --git a/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/saml/setup.md b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/saml/setup.md new file mode 100644 index 0000000000..71f0bdcf95 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/user-management/sso/saml/setup.md @@ -0,0 +1,51 @@ +--- +id: setup +title: SAML Setup +--- + +Security Assertion Markup Language (SAML) is a protocol that facilitates secure SSO authentication by exchanging user identity data between an identity provider and a service provider. Integrating SAML with providers like Okta, Active Directory Federation Services, Auth0 or Azure AD allows you to implement seamless and secure authentication for your users in ToolJet. + +## Configuring SAML + +To enable SAML authentication, you need to configure the following workspace settings: + +Role Required: **Admin**
    + +1. Click on the settings icon (⚙️) on the bottom left of your dashboard. + +2. Go to **Workspace settings > Workspace login**.
    + (Example URL - `https://app.corp.com/nexus/workspace-settings/workspace-login`) + SSO :SAMP + +2. By default, SAML is disabled. Toggle it on to enable SAML authentication. + SSO :SAMP + +3. Enter the following configuration details: + - **SAML Provider Name**: Enter the name of your SAML provider. This name will be displayed on the login page. + - **Identity provider metadata**: Upload the data from the metadata file provided by your SAML provider. This file contains the SAML configuration details. + - **Group Attribute**: Enter the name of the attribute that contains the group information of the user. This attribute is used to map the user to the appropriate group. + - **Redirect URL**: Copy the redirect URL provided and paste it in the SAML provider's configuration page. + +
    + + :::tip Downloading the metadata from your identity provider + Generally, the metadata is available in the form of an XML file which can be downloaded from your identity provider's dashboard. + + Copy the metadata from the XML file and paste it into the ToolJet's SAML SSO configuration settings. Please ensure that the metadata is pasted in the correct format, as it contains essential configuration details from the identity provider necessary for authentication. + + Additionally, you can often find this data by navigating to `https://your-identity-provider/federationmetadata/2007-06/federationmetadata.xml` + ::: + +4. Once configured, click **Save Changes**. + +## Logging in with SAML + +1. Go to the **Workspace login** tab and copy the **Login URL** provided. Through SSO authentication, we check if the user already exists; if so, they can sign in seamlessly. Otherwise, an error will be displayed. + +2. The **Login URL** obtained can be used to access the workspace. Please note that ToolJet supports SAML login at the workspace level, ensuring users are logged in specifically to the selected workspace.
    + As a result, users can now log in to your workspace using the provided Login URL. The login page will prominently feature the name of the SAML provider configured in your workspace settings. + SSO :SAMP + +3. Click on **Sign in with `SAML Name`** button and you will be redirected to the SAML provider's login page. + +4. Enter your credentials and click **Login**. If the user is signing in for the first time, they will be redirected to the ToolJet's onboarding page. diff --git a/docs/versioned_docs/version-3.0.0-LTS/versions.md b/docs/versioned_docs/version-3.0.0-LTS/versions.md new file mode 100644 index 0000000000..4824fa0672 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/versions.md @@ -0,0 +1,49 @@ +--- +id: versions +title: ToolJet Documentation Versions +--- + +## Current LTS Versions (Stable) + +| Version | Documentation | +|------------|-------------------------------------------------| +| 3.0.0-LTS | [Documentation](https://docs.tooljet.ai/docs/) | +| 2.50.0-LTS | [Documentation](https://docs.tooljet.ai/docs/2.50.0-LTS/) | + +## Beta Version (Pre-Release) + +| Version | Documentation | +|-------------|-------------------------------------------| +| 3.1.0-Beta 🚧 | [Documentation](https://docs.tooljet.ai/docs/beta/) | + +## 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) | diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/_category_.json b/docs/versioned_docs/version-3.0.0-LTS/widgets/_category_.json new file mode 100644 index 0000000000..28ad4a4735 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/_category_.json @@ -0,0 +1,5 @@ +{ + "label": "Widget Reference", + "position": 6, + "collapsed": true +} \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/bounded-box.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/bounded-box.md new file mode 100644 index 0000000000..0650d92c31 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/bounded-box.md @@ -0,0 +1,157 @@ +--- +id: bounded-box +title: Bounded Box +--- + +# Bounded Box + +A **Bounded Box** is an infinitely customizable image annotation component that can be used to select and tag areas within an image. It supports selection using specific points (landmarking) or drawing rectangular areas (bounding boxes). It can be used to create datasets for machine learning models or to annotate images for other purposes. + +
    + +Bounded Box + +
    + +
    + +## Properties + +
    + +Bounded Box + +
    + +
    + +|
    **Property**
    |
    **Description**
    |
    **Expected Value**
    | +| :----------- | :----------- | :----------------- | +| Image URL | The URL or image data to show it on the component. | Get the image URL dynamically from database: `{{queries.queryname.data[0].url}}` or use [image's base64 data](/docs/how-to/loading-image-pdf-from-db/).| +| Default value | The data that will load the default bounded boxes over the image when the app is loaded. | Array of objects. Check the [Default value](#default-value) data properties. | +| Selector | The bounded box support selection using rectangle or point. | Click **fx** to set the value `RECTANGLE` or `POINT`. | +| List of labels | The list of label that will be displayed in the dropdown while selection in the bounded-box. | Labels in array format: `{{['Tree', 'Car', 'Stree light']}}`. | + +#### Default value + +Provide the data that will load the default bounding boxes over the image when the app is loaded. The data is expected to be an array of objects format. + +|
    **Property**
    |
    **Description**
    |
    **Expected Value**
    | +| :-------- | :------ | :-------- | +| type | Sets the type of the Bounded Box. | `RECTANGLE` or `POINT`. | +| width | Sets the width of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0`. | +| height | Sets the height of the Bounded Box in pixels. | Numeric value. If the `type` value is `POINT`, set it to `0`. | +| x | Sets the x-coordinate(horizontal) position of the Bounded Box in the image. | Numerical value ex: `41`. | +| y | Sets the y-coordinate(vertical) position of the Bounded Box in the image. | Numerical value ex: `22`. | +| text | Sets the text value of the Bounded Box. | It should be one of the labels provided in the **[List of labels](#properties)** property. | + +**Example of default values:** + +```js +[ + { + type: 'RECTANGLE', + width: 40, + height: 24, + x: 41, + y: 12, + text: 'Tree' + }, + { + type: 'POINT', + width: 0, + height: 0, + x: 10.28, + y: 81.14, + text: 'Car' + } +] +``` + +
    + +
    + +## Events + +Events are actions that can be triggered programmatically when the user interacts with the component. Click on the component handle to open its properties on the right. Go to the **Events** accordion and click on **+ Add handler**. + +
    + +|
    **Event**
    |
    **Description**
    | +| :----------- | :----------- | +| On change | Triggered when the label from the dropdown in the selector is changed in the Bounded Box. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the bounding box component. + +
    + +
    + +## Exposed Variables + +| Variable | Description | +| :----------- | :----------- | +| annotations | This variable is an array of objects, where each object represents an annotation added to an image. The object contains the following keys: type, x, y, width, height, text, and id. | +| annotations.`type` | There are two types of annotations: `RECTANGLE` and `POINT`. | +| annotations.`x` | coordinates on the x axis. | +| annotations.`y` | coordinates on the y axis. | +| annotations.`width` | width of the annotation. | +| annotations.`height` | height of the annotation. | +| annotations.`text` | label selected for the annotation. | +| annotations.`id` | unique ID of the annotation (system generated). | + +The values can be accessed dynamically using `{{components.boundedbox1.annotations[0].text}}` or `{{components.boundedbox1.annotations[1].width}}`. + +
    + +
    + +## General + +#### Tooltip + +A Tooltip is often used to specify the extra information when the user hovers the mouse pointer over the component. Once a value is set for Tooltip, hovering over the element will display the specified string as the tooltip text. + +
    + +Bounded box Tooltip + +
    + +
    + +
    + +## 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. | + +
    + +--- + +
    + +## Styles + +|
    Style
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :----------- | +| Visibility | Toggle on or off to control the visibility of the component when the app is loaded. | `{{true}}` or `{{false}}`, By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the component. | `{{true}}` or `{{false}}`, By default, it's set to `{{false}}`. | +| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets (through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent x, y, blur, spread and color. Ex: `9px 11px 5px 5px #00000040`. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/button-group.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/button-group.md new file mode 100644 index 0000000000..e8e4eface3 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/button-group.md @@ -0,0 +1,104 @@ +--- +id: button-group +title: Button Group +--- +# Button Group + +The **Button Group** component is used to group a series of buttons together in a single line. It is used to group related buttons. + +
    + +Button group + +
    + +
    + +## Properties + +|
    Properties
    |
    Description
    |
    Expected Value
    | +|:----------- |:----------- |:-------------- | +| label | Sets the title of the button-group. | Any **String** value: `Select the options` or `{{queries.queryname.data.text}}`. | +| values | Sets the values of the Button Group items. | **Array** of strings and numbers: `{{[1,2,3]}}`. | +| Labels | Sets the labels of the Button Group items. | **Array** of strings and numbers: `{{['A','B','C']}}`. | +| Default selected | Sets the initial selected values. | **Array** of strings and numbers: `{{[1]}}` will select the first button by default. | +| Enable multiple selection | Toggle on or off to enable multiple selection. | **Boolean** value: `{{true}}` or `{{false}}`. | + +
    + +
    + +## Events + +|
    Events
    |
    Description
    | +|:----------- |:----------- | +| On click | Triggers whenever the user clicks on the button in the Button Group. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the button-group component. + +
    + +
    + +## Exposed Variables + +|
    Variable
    |
    Description
    |
    How To Access
    | +| :---------- | :---------- | :----------| +| selected | Holds the currently selected button value as an array of objects. | Accessible dynamically with JS (for e.g., `{{components.buttongroup1.selected[0]}} or {{components.buttongroup1.selected}}`). | + +
    + +
    + +## General +#### Tooltip + +A Tooltip is often used to display additional information when the user hovers the mouse pointer over the component. Once a value is set for Tooltip, hovering over the element will display the specified string as the tooltip text. + +
    + +Button group layout + +
    + +
    + +
    + +## 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. | + +
    + +--- + +
    + +## Styles + +|
    Style
    |
    Description
    |
    Expected Value
    | +| :---------- | :---------- | :-------------- | +| Background color | Set a background color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Text color | Set a text color for the buttons in buttons group. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Visibility | Make the component visible or hidden. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{true}}`. | +| Disable | Disable the component. | **`{{true}}`** or **`{{false}}`**, By default, its value is set to `{{false}}`. | +| Border radius. | Add a border radius to the buttons in the component using this property. | Any numerical value from `0` to `100`. | +| Selected text color | Use this property to modify the text color of selected button. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Selected background color | Use this property to modify the background color of selected button. | Choose a color from the picker or enter the Hex color code. ex: `#000000`. | +| Box shadow | Sets the add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | Values that represent X, Y, blur, spread, and color. Example: `9px 11px 5px 5px #00000040`. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/button.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/button.md new file mode 100644 index 0000000000..3d6b69122f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/button.md @@ -0,0 +1,104 @@ +--- +id: button +title: Button +--- + +**Button** component can be used to trigger an action. It can be used to submit a form, navigate to another page, or trigger a query. + +
    + +## Properties + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display on the button. | String (e.g., `Submit`). | + +## Events + +|
    Event
    |
    Description
    | +| :----------- | :----------- | +| On click | Triggers whenever the user clicks the button. | +| On hover | Triggers whenever the user moves the mouse cursor over the button. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +|
    Property
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :----------- | +| Button text | Used to set the label of the button. | Any **String** value: `Send Message`, `Delete`, or `{{queries.xyz.data.action}}`. | +| Loading state | The loading state is used to show a spinner as the button content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. | Toggle the switch **On** or click on **fx** to programmatically set the value to `{{true}}` or `{{false}}`. | + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Button component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :----------- | :----------- | :--------| +| click() | Regulate the click of the button. | Employ a RunJS query to execute component-specific actions such as `await components.button1.click()` or trigger it using an event.| +| setText() | Sets the label of the component. | Employ a RunJS query (for e.g.,
    `await components.button1.setText('Update')`) or trigger it using an event. | +| setVisibility() | Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.textinput1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.button1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.button1.setDisable(true)`) or trigger it using an event. | + +
    + +
    + +## Exposed Variables + +|
    Variable
    |
    Description
    |
    How To Access
    | +| :----------- | :----------- | :---------- | +| buttonText | This variable stores the text displayed on the button. | Access the value dynamically through JavaScript using the following syntax: `{{components.button1.buttonText}}`. | +|
    isValid
    | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.button1.isValid}}`).| +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.button1.isLoading}}`).| +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.button1.isVisible}}`).| + +
    + +## 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 (e.g., `Button to Submit Form` ). | + +
    + +## 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. | + +
    + +--- + +# Styles + +## Button + +|
    Button Property
    |
    Description
    |
    Configuration Options
    | +|:------------------|:------------|:------------------------------| +| Type | Sets the fill value of the Button component. | Select `Solid` for a button with a solid background and `Outline` for a transparent button with an outline. | +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text color | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border color | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Loader color | Sets the loader color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can programmatically set it using **fx**. | +| 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 set it programmatically using **fx**. | + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/calendar.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/calendar.md new file mode 100644 index 0000000000..e235a95012 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/calendar.md @@ -0,0 +1,228 @@ +--- +id: calendar +title: Calendar +--- +# Calendar + +The **Calendar** component allows you to visually organize and schedule events. You can set the default view (day, week, or month), enable/disable various display options, and bind data to events and resources. + +
    +ToolJet - Widget Reference - Calendar + +
    + +:::info Restricted components +Certain components are restricted from being placed within the **Popout** of the **Calendar** component: +- Calendar, Kanban. +::: + +
    + +## Properties + +|
    Property
    |
    Description
    | +| :----------- | :----------- | +| **Date Format** | Determines the format in which any date passed to the calendar via any of the properties will be parsed. It also determines the format in which any date made available by the calendar via exposed variables will be displayed. It uses the date format conventions of [moment.js](https://momentjs.com/). | +| **Default Date** | Determines the date on which the calendar's view will be centered on. By default, the default date is set to the current date using moment.js i.e. `{{moment().format("MM-DD-YYYY HH:mm:ss A Z")}}`. If the calendar is on `month` view, it will show the month on which this date exists. If the calendar is on `week` view, it will show the week on which this date exists. This property needs to be formatted using the `Date format` property which is configurable on the inspector. | + +
    + +
    + +### Events +`Events` property should contain an array of objects, each of which describes the events that the calendar needs to display. + +Assuming that you set the date format to `MM-DD-YYYY HH:mm:ss A Z`, setting the `Events` property to the following code snippet will display an event titled `Sample Event` at the first hour of this day, as displayed in the image of calendar at the beginning of this page. + +```javascript +{{[ + { + title: 'Sample event', + start: `${moment().startOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`, + end: `${moment().endOf('day').format('MM-DD-YYYY HH:mm:ss A Z')}`, + allDay: false, + tooltip: 'Sample event', + color: 'lightgreen', + } +]}} +``` +
    + +
    + +### Event Object Properties + +|
    Name
    |
    Description
    | +|:------|:-------------| +| **title** | Title of the event | +| **start** | The date(and time) on which this event begins. Needs to be formatted in the `Date format` you've supplied | +| **end** | The date(and time) on which this event ends. Needs to be formatted in the `Date format` you've supplied | +| **allDay** | Optional. Qualifies the event as an 'All day event', which will pin it to date headers on `day` and `week` level views | +| **tooltip** | Tooltip which will be display when the user hovers over the event | +| **color** | Background color of the event, any css supported color name or hex code can be used | +| **textColor** | Color of the event title, any css supported color name or hex code can be used | +| **textOrientation** | Optional. If it is set to `vertical`, the title of the event will be oriented vertically. | +| **resourceId** | Applicable only if you're using resource scheduling. This is the id of the resource to which this event correspond to. | + +You may supply any other additional property to the event(s). These additional properties will available to you when the calendar widget +exposes any of the events via its exposed variables. + +
    + +
    + +### Resources + +Specifying resources will make the calendar categorize `week` view and `day` view for each of the resources specified. + + For example, to categorize week/day view into for three rooms, we specify `resources` this way: + +```javascript +{{[ + {resourceId: 1, title: 'Room A'}, + {resourceId: 2, title: 'Room B'}, + {resourceId: 3, title: 'Room C'}, + ]}} +``` + +If we specify the `resourceId` of any of the events as `1`, then that event will be assigned to `Room A`, generating the following calendar, assuming that we've set the view to `day` and are viewing the day on which this event exists. + +
    + +ToolJet - Widget Reference - Calendar + +
    + +
    + +
    + +### Default View + +Determines whether the calendar would display a `day`, a `week` or a `month`. Setting this property to anything other than these values will make the calendar default to `month` view. + +The view that is currently selected will be exposed as the variable `currentView`. + +
    + +
    + +### Start Time on Week and Day View + +This determines the time at which week view and day view cells begins. Keep in mind that this field accepts a date, but still only the time and timezone(if provided) are taken from this date. The date should be provided in the date format chosen by you in the first property field. + +
    + +
    + +### End Time on Week and Day View + +This determines the time at which week view and day view cells ends. Keep in mind that this field accepts a date, but still only the time and timezone(if provided) are taken from this date. The date should be provided in the date format chosen by you in the first property field. + +
    + +
    + +### Show Toolbar + +Determines whether the calendar toolbar should be displayed or not. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +
    + +
    + +### Show View Switcher + +Determines whether the calendar's buttons that allow user to switch between `month`, `week` and `day` level views will be displayed. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +
    + +
    + +### Highlight Today + +Determines whether the today's card on the calendar should be highlighted or not. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +
    + +
    + +### Show Popover When the Event is Clicked + +Determines whether to display a popover whenever an event is clicked. Click on `Fx` button to programmatically determine the field value to `{{true}}` or `{{false}}`. + +
    + +
    + +## Events + +| Event | Description | +|:-----:|:-----------:| +| **On Event Selected** | This event is fired when the user clicks on a calendar event. Last selected event is exposed as `selectedEvent`. | +| **on Slot Selected** | This event is fired when the user either clicks on an calendar slot(empty cell or empty space of a cell with event) or when they click and drag to select multiple slots. Last selected slot(s) are exposed as `selectedSlots`. | +| **On Date Navigate** | This event is fired when the user clicks on `Today`, `Next` or `Back` buttons on the calendar. The corresponding date to which the user navigated, will be exposed as `currentDate`. | +| **On View Change** | This event is fired when a different view is selected by the user. The current view is exposed as `currentView`. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the Calendar component. + +
    + +
    + +## Exposed Variables + +| Variables | Description | +| ----------- | ----------- | +| selectedEvent | This variable stores information about the event that has been chosen on the calendar component. This object comprises keys like **title**, **start**, **end**, **allDay**, and **color**, and they can be accessed dynamically through JS using the following syntax: `{{components.calendar1.selectedEvent.title}}` or `{{components.calendar1.selectedEvent.start}}` | +| selectedSlots | The variable selectedSlots contains the values of the slots chosen on the calendar component. This object comprises keys like **slots**, **start**, **end**, **resourceId**, and **action**, and they can be accessed dynamically through JS using the following syntax: `{{components.calendar1.selectedSlots.slots[0]}}` or `{{components.calendar1.selectedSlots.end}}`. | +| currentView | The currentView variable holds the type of view currently set on the calendar. The value updates when the user changes the view from the calendar header. Types of views supported: `month`, `week`, and `day`. The value can be accessed using `{{components.calendar1.currentView}}` | +| currentDate | The currentDate variable holds the current date data. The date returned by the variable is in the `MM-DD-YYYY HH:mm:ss A Z` format. The value can be accessed using `{{components.calendar1.currentDate}}`| + +
    + +
    + +## General +#### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the widget. Under the General accordion, you can set the value in the string format. Now hovering over the widget will display the string as the tooltip. + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| **Show on Desktop** | Toggle on or off to display the widget in desktop view. | The value can be programmatically determined by clicking on `Fx` to set the value `{{true}}` or `{{false}}`.| +| **Show on Mobile** | Toggle on or off to display the widget in desktop view. | The value can be programmatically determined by clicking on `Fx` to set the value `{{true}}` or `{{false}}`. | + +
    + +
    + +## Styles + +| Style | Description | +|:-----:|:-----------:| +| **Visibility** | Toggle on or off to control the visibility of the widget. You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the widget will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| **Cell Size in Views Classified by Resource** | When `resources` are specified, the calendar could take up quite a lot of horizontal space, making the horizontal scroll bar of calendar having to be relied upon all the time. | +| **Header Date Format on Week View** | This format determines how the column header for each day in week view will be displayed. As with every other date format field in ToolJet, this follows the momentjs standard of date formatting. By default, its set to `DD MMM`. | + +:::info +Any property having `Fx` button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/chart.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/chart.md new file mode 100644 index 0000000000..6a115f8585 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/chart.md @@ -0,0 +1,87 @@ +--- +id: chart-properties +title: Properties +--- +# Chart + +The Chart component allows you to visualize your data. In this document, we'll go through all the configuration options for the **Chart** component. + +## Title + +Under the `Title` property, you can enter a title that displays at the top of the chart component. + +## Plotly JSON Chart Schema + +To activate the Plotly JSON Schema, switch on the `Use Plotly JSON Schema` toggle. Additionally, for dynamic configuration, click on `fx` to input a logical expression that enables or disables it as needed. + +## Component specific actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + + +## Exposed variables + +|
    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`. | + +## Properties + +#### Chart type +You can select the type from the dropdown options or dynamically configure the value by clicking on `fx` and entering a logical expression that returns `line`, `pie` or `bar`. + +## Chart data +The data needs to be in JSON format and should have `x` and `y` keys. The component supports string and object JSON data types. + +**Example:** +```json +[ + { "x": "Jan", "y": 100}, + { "x": "Feb", "y": 80}, + { "x": "Mar", "y": 40}, + { "x": "Apr", "y": 100}, + { "x": "May", "y": 80}, + { "x": "Jun", "y": 40} +] +``` + +## Marker Color +Available for line and bar charts, `Marker Color` defines the color of the line or bars on the chart. + +## Options +|
    Option
    |
    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. | +| Show axis | Hides or displays the axes on the chart. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | +| Show grid lines | Hides or displays the grid lines on the chart. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +## Events + +| Event | Description | +|:--------------------|----------------------------------------------------------------| +| On data point click | Triggers whenever the user clicks on data points. | +| On double click | Triggers whenever the user double clicks on the chart area. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +## 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. | + +# Styles + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background color | Sets the background color of the component. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Paddings | Sets the padding of the component. | Enter a numeric value. (for e.g., `22`) | +| 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. | +| Visibility | Sets the visibility of the component. | Enable/disable using the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression.| +| Disables | Allows you to enable/disable a component. The component is not interactive when it is disabled. | Enable/disable using the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression.| diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/charts-examples.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/charts-examples.md new file mode 100644 index 0000000000..3527b02e0a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/charts-examples.md @@ -0,0 +1,281 @@ +--- +id: chart-examples +title: Examples +--- + +## Plotly Configuration + +You can refer to the **[Ploty's documentation](https://plotly.com/chart-studio-help/json-chart-schema/)** for information on Ploty's JSON Chart Schema. + +### Bar Mode + +The **Bar Mode** option allows you to customize the layout and display style specifically for bar charts. This option becomes available when the **Plotly JSON chart schema** toggle is enabled and a JSON schema specific to bar charts is provided. This option provide different modes for organizing and presenting bars within the chart. + +Please note that the **Bar Mode** option only affects the layout of bar charts, and it requires a JSON schema specifically designed for bar charts. It cannot be used to modify the layout of other chart types such as line charts or pie charts. + +It offers four different modes: + +**1. Stack Mode:** Bars are stacked on top of each other, displaying the total value of each category as well as the individual values within the stack. + +**2. Group Mode:** Bars of different categories are grouped together side by side, facilitating direct comparison between the groups and their subcategories. + +**3. Overlay Mode:** Bars from different categories overlap with slight offsets, allowing for detailed visual comparison of individual values across categories. + +**4. Relative Mode:** Bars represent proportions or percentages relative to a reference value, emphasizing the relative significance of each category. + +
    + +ToolJet - Widget Reference - Chart + +
    + +## Examples of Plotly JSON chart schema + +In the **JSON description**, the value needs to be the `data` array with x and y axis values and at the end we need to specify the `type`. let's take a look at the examples for different chart types. + +### Line +Displays trends and patterns in data over time. + +```js +{ + "data": [ + { + "x": ["Jan", "Feb", "Mar"], + "y": [100, 80, 40], + "type": "line" + }, + { + "x": ["Jan", "Feb", "Mar"], + "y": [300, 30, 20], + "type": "line" + } + ] +} +``` + +
    + +ToolJet - Widget Reference - Line Chart + +
    + +### Line Chart With Annotations +Displays trends and patterns in data over time with annotations. + +```js +{ + "data": [ + { + "x": ["Jan", "Feb", "Mar"], + "y": [100, 80, 40], + "type": "scatter", + "mode": "lines+markers" + } + ], + "layout": { + "title": "Monthly Performance", + "annotations": [ + { + "x": "Jan", + "y": 100, + "xref": "x", + "yref": "y", + "text": "January: 100", + "showarrow": true, + "arrowhead": 2, + "ax": 0, + "ay": -30 + }, + { + "x": "Feb", + "y": 80, + "xref": "x", + "yref": "y", + "text": "February: 80", + "showarrow": true, + "arrowhead": 2, + "ax": 0, + "ay": -30 + }, + { + "x": "Mar", + "y": 40, + "xref": "x", + "yref": "y", + "text": "March: 40", + "showarrow": true, + "arrowhead": 2, + "ax": 0, + "ay": -30 + } + ] + } +} +``` + +
    + +ToolJet - Widget Reference - Line Chart With Annotations + +
    + +### Bar +Compares categories of data or visualizes changes in a variable across different groups. + +```js +{ + "data": [ + { + "name": "SF Zoo", + "type": "bar", + "x": [20, 14, 23], + "y": ["giraffes", "orangutans", "monkeys"], + "marker": { + "line": { + "color": "rgba(55, 128, 191, 1.0)", + "width": 1 + }, + "color": "rgba(55, 128, 191, 0.6)" + }, + "orientation": "h" + }, + { + "name": "LA Zoo", + "type": "bar", + "x": [12, 18, 29], + "y": ["giraffes", "orangutans", "monkeys"], + "marker": { + "line": { + "color": "rgba(255, 153, 51, 1.0)", + "width": 1 + }, + "color": "rgba(255, 153, 51, 0.6)" + }, + "orientation": "h" + } + ], + "layout": { + "barmode": "stack" + } +} +``` +
    + +ToolJet - Widget Reference - Bar + +
    + +### Candlestick +Analyzes the price movement of financial instruments (stocks, currencies, etc.) over a specific time frame. + +```js +{ + "data": [ + { + "x": ["2024-04-02", "2024-04-03", "2024-04-04"], + "close": [120, 125, 130], + "high": [125, 130, 135], + "low": [115, 120, 125], + "open": [115, 120, 125], + "type": "candlestick" + } + ] +} +``` + +
    + ToolJet - Widget Reference - Candlestick +
    + +### Contour +Typically used to represent three-dimensional data in two dimensions using contour lines. + + +```js +{ + "data": [ + { + "x": [1, 2, 3, 4], + "y": [1, 2, 3, 4], + "z": [[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6], [4, 5, 6, 7]], + "type": "contour" + } + ] +} +``` + +
    + ToolJet - Widget Reference - Contour +
    + +### Heatmap + +Reveals the density or magnitude of data points across two dimensions, using color to represent intensity. + +```bash +{ + "data": [ + { + "z": [[1, 20, 30], [20, 1, 60], [30, 60, 1]], + "x": ["Experiment 1", "Experiment 2", "Experiment 3"], + "y": ["Trial 1", "Trial 2", "Trial 3"], + "type": "heatmap" + } + ] +} +``` + +
    + ToolJet - Widget Reference - Heatmap +
    + +### Icicle + +Displays hierarchical data in a nested structure, ideal for understanding the relative sizes of parts within a whole. + +```js +{ + "data": [ + { + "labels": ["A", "B", "C", "D", "E", "F"], + "parents": ["", "A", "A", "B", "B", "B"], + "type": "icicle" + } + ] +} +``` + +
    + ToolJet - Widget Reference - Icicle +
    + +### 3D Mesh + +Represents three-dimensional surfaces, often used in scientific or engineering data visualization. + +```js +{ + "data": [ + { + "x": [0, 1, 2, 0], + "y": [0, 0, 1, 2], + "z": [0, 2, 0, 1], + "alphahull": 5, + "type": "mesh3d" + } + ] +} + +``` + +
    + ToolJet - Widget Reference - 3D Mesh +
    + + +:::tip +Check the **[Plotly documentation](https://plotly.com/chart-studio-help/json-chart-schema/#more-examples)** to explore the all type of charts available. +::: + + +--- diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/transforming-data-for-charts.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/transforming-data-for-charts.md new file mode 100644 index 0000000000..16b5f64ad6 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/chart/transforming-data-for-charts.md @@ -0,0 +1,324 @@ +--- +id: transforming-data-for-charts +title: Transforming Data for Charts +--- + +This guide explains how to transform data using RunJS and RunPy in ToolJet and visualize it using the chart component. The chart component in ToolJet enables the creation of various types of charts, with the option to integrate with Plotly for enhanced customization and advanced visualizations. While ToolJet provides the ability to connect to multiple databases, APIs, and data sources for integration, this guide will focus on using ToolJet DB to fetch the required data. + +
    + +## Plotting a Simple Pie Chart + +To create a simple pie chart, the data has been stored in the table with the following structure in ToolJet DB: + +|
    id
    |
    course
    | +|:-- | :---- | +| 1 | Maths | +| 2 | Full Stack Web Development | +| 3 | Digital Marketing Strategy | +| 4 | Business Ethics | +| 5 | Maths | +| 6 | Full Stack Web Development | +| 7 | Digital Marketing Strategy | +| 8 | Financial Accounting | +| 9 | Maths | +| 10 | Chemistry | +| 11 | Financial Accounting | +| 12 | Physics | +| 13 | Full Stack Web Development | +| 14 | Maths | + +### Query to Fetch Data + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the ToolJet Database as the data source. +3. Select your table from the dropdown. +4. Select the **List rows** operation. +5. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +Fetch Data Query + +This query will fetch the data from the ToolJet DB. + +### Transform the Data + +To restructure the data into a format compatible with the chart component, we will be using RunJS transformation. + +Create a new **RunJS** Query and add the following code: + +```js +await queries.getRevenueDetails.run(); + +let data = queries.getRevenueDetails.getData(); + +const courseCounts = data.reduce((counts, obj) => { + if (obj.course) { + counts[obj.course] = (counts[obj.course] || 0) + 1; + } + return counts; +}, {}); + +const courseData = Object.keys(courseCounts).map(course => ({ + x: course, + y: courseCounts[course] +})); + +return {courseData}; +``` + +Transform JS Query + +This query will calculate the number of each course and return an array of objects that can be utilized to plot the pie chart. + +### Plotting Pie Chart + +1. Add a chart component from the component library available on right to the canvas. +2. Under Properties section select **Pie** as the chart type from the dropdown. +3. Under chart data section input `{{queries..data.courseData}}` to input the data from the query. + +Pie Chart + +
    + +
    + +## Plotting a Line Chart with RunJS Transformation + +To create the line chart, the data has been stored in the table with the following structure in ToolJet DB: + +|
    id
    |
    x
    |
    y
    |
    region
    |
    rdate
    | +|:---|:--|:--|:-------|:-----| +| 1 | Social Media Engagement | 15 | North America | 15-01-2024 | +| 2 | Email Marketing | 10 | Europe | 10-02-2024 | +| 3 | SEO Optimization | 20 | Asia | 05-03-2024 | +| 4 | Content Creation | 25 | North America | 20-04-2024 | +| 5 | Paid Advertising | 30 | Europe | 12-05-2024 | +| 6 | Analytics and Reporting | 18 | Asia | 18-06-2024 | +| 7 | Influencer Marketing | 12 | North America | 30-07-2024 | +| 8 | Market Research | 22 | Europe | 25-08-2024 | +| 9 | Web Development | 17 | Asia | 15-09-2024 | +| 10 | Customer Relationship Management | 28 | North America | 02-10-2024 | + +### Query to Fetch Data + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the ToolJet Database as the data source. +3. Select your table from the dropdown. +4. Select the **List rows** operation. +5. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +Fetch Data Query + +This query will fetch the data from the ToolJet DB. + +### Transform the Data + +Create a new **RunJS** Query and add the following code: + +```js +const data = queries.getLinechartData.data; + +const calculateAverage = (arr) => arr.reduce((sum, item) => sum + item.y, 0) / arr.length; + +const regionData = data.filter(item => item.region !== "Asia"); + +const transformedData = regionData.map(item => { + if (item.rdate && typeof item.rdate === 'string') { + const dateParts = item.rdate.split('-'); + + if (dateParts.length === 3) { + const year = dateParts[2]; + const month = dateParts[1]; + return { + x: `${year}-${month}`, + y: item.y && !isNaN(item.y) ? item.y : 0 + }; + } + } + + return { x: 'Invalid Date', y: 0 }; +}); + +const validData = transformedData.filter(item => item.x !== 'Invalid Date'); +const averageY = calculateAverage(validData); + +const finalData = transformedData.map(item => ({ + x: item.x, + y: item.y - averageY +})); + +return finalData; +``` + +Transform JS Query + +### Plotting Line Chart + +1. Add a chart component from the component library available on right to the canvas. +2. Under Properties section select **Line** as the chart type from the dropdown. +3. Under chart data section input `{{queries..data}}` to input the data from the query. + +Line Chart + +
    + +
    + +## Plotting Candle Stick Chart Using Plotly + +To create a candlestick chart, the data has been stored in the table with the following structure in ToolJet DB: + +|
    id
    |
    sdate
    |
    open
    |
    high
    |
    low
    |
    sclose
    | +|:---|:------|:-----|:-----|:----|:-------| +| 1 | 2024-04-02 | 115 | 125 | 115 | 120 | +| 2 | 2024-04-03 | 120 | 130 | 120 | 125 | +| 3 | 2024-04-04 | 125 | 135 | 125 | 130 | + +### Query to Fetch Data + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the ToolJet Database as the data source. +3. Select your table from the dropdown. +4. Select the **List rows** operation. +5. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +Fetch Data Query + +This query will fetch the data from the ToolJet DB. + +### Transform the Data + +To restructure the data into a format compatible with the chart component, we will be using RunJS transformation. + +Create a new **RunJS** Query and add the following code: + +```js +const dbData = queries.getCandlestickData.data; + +if (!Array.isArray(dbData) || dbData.length === 0) { + return { plotData: [] }; +} + +let dates = []; +let openPrices = []; +let highPrices = []; +let lowPrices = []; +let closePrices = []; + +dbData.forEach(row => { + dates.push(String(row.sdate)); + openPrices.push(row.open); + highPrices.push(row.high); + lowPrices.push(row.low); + closePrices.push(row.sclose); +}); + +const transformedData = [ + { + x: dates, + open: openPrices, + high: highPrices, + low: lowPrices, + close: closePrices, + type: 'candlestick' + } +]; + +let result = { + data: transformedData +}; + +return JSON.stringify(result) +``` + +Transform JS Query + +### Plotting Candlestick Chart + +1. Add a chart component from the component library available on right to the canvas. +2. Enable use plotly JSON schema under Plotly JSON Chart Schema section. +3. Under JSON Description section input `{{queries..data}}` to input the data from the query. + +Candlestick Chart + +
    + +
    + +## Plotting heatmap Chart Using Plotly + +To create a heatmap chart, the data has been stored in the table with the following structure in ToolJet DB: + +|
    id
    |
    x
    |
    y
    |
    value
    | +|:---|:------|:-----|:-----| +| 1 | 0 | 0 | 0.32 | +| 2 | 0 | 1 | 0.95 | +| 3 | 0 | 2 | 0.57 | +| 4 | 0 | 3 | 0.08 | +| 5 | 0 | 4 | 0.82 | +| 6 | 0 | 5 | 0.33 | +| 7 | 0 | 6 | 0.9 | +| 8 | 0 | 7 | 0.11 | +| 9 | 0 | 8 | 0.73 | +| 10 | 0 | 9 | 0.39 | + +### Query to Fetch Data + +1. Click on **+ Add** button of the query manager at the bottom panel of the editor. +2. Select the ToolJet Database as the data source. +3. Select your table from the dropdown. +4. Select the **List rows** operation. +5. Click on the **Preview** button to preview the output or Click on the **Run** button to trigger the query. + +Fetch Data Query + +This query will fetch the data from the ToolJet DB. + +### Transform the Data + +To restructure the data into a format compatible with the chart component, we will be using RunPy transformation. + +Create a new **RunPy** Query and add the following code: + +```py +import pandas as pd +import json + +data_raw = queries.fetchHeatmapData.getData() + +data = data_raw.to_py() if hasattr(data_raw, 'to_py') else list(data_raw) + +df = pd.DataFrame(data) +heatmap_data = df.pivot(index='y', columns='x', values='value') + +x_labels = [f"Column {i}" for i in heatmap_data.columns.tolist()] +y_labels = [f"Row {i}" for i in heatmap_data.index.tolist()] + +output = { + "data": [ + { + "z": heatmap_data.values.tolist(), + "x": x_labels, + "y": y_labels, + "type": "heatmap" + } + ] +} + +output_str = json.dumps(output) + +output_str +``` + +Transform JS Query + +### Plotting Heatmap Chart + +1. Add a chart component from the component library available on right to the canvas. +2. Enable use plotly JSON schema under Plotly JSON Chart Schema section. +3. Under JSON Description section input `{{queries..data}}` to input the data from the query. + +Heatmap Chart + + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/csa.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/csa.md new file mode 100644 index 0000000000..09a890d4dd --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/csa.md @@ -0,0 +1,31 @@ +--- +id: csa +title: Component Specific Actions & Exposed Variables +--- + +This guide covers component-specific actions for the **Chat Component** and its exposed variables. To learn how to build a chatbot, refer to the [Chat Component Overview](/docs/widgets/chat/) guide. For more information on Chat Component Properties, check out the [Properties](/docs/widgets/chat/properties) guide. + +## Component Specific Actions (CSA) + +|
    Action
    |
    Description
    | How to Access | +|--------|-------------|---------------| +| sendMessage( ) | Sends a message in the chat. | Employ a RunJS query (for e.g. `components.chat1.sendMessage({message: "Hey! How can I help you?", type: "response"})`) or trigger it using an event. | +| clearHistory( ) | Clear chat history. | Employ a RunJS query (for e.g. `components.chat1.clearHistory()`) or trigger it using an event. | +| deleteMessage( ) | Delete a message using the MessageID | Employ a RunJS query (for e.g. `components.chat1.deleteMessage(MessageID)`) or trigger it using an event. | +| downloadChat( ) | Download the chat in JSON format. | Employ a RunJS query (for e.g. `components.chat1.downloadChat()`) or trigger it using an event. | +| setHistory( ) | Sets the chat history. | Employ a RunJS query (for e.g. `components.chat1.setHistory(History Object)`) or trigger it using an event. | +| appendHistory( ) | Appends chat history. | Employ a RunJS query (for e.g. `components.chat1.appendHistory(Message Object)`) or trigger it using an event. | +| setResponderAvatar( ) | Sets Responder's Avatar. | Employ a RunJS query (for e.g. `components.chat1.setResponderAvatar(Image URL)`) or trigger it using an event. | +| setUserAvatar( ) | Sets User's Avatar. | Employ a RunJS query (for e.g. `components.chat1.setUserAvatar(Image URL)`) or trigger it using an event. | + +## Exposed Variables + +| Variable |
    Description
    | How to Access | +|----------|-------------|---------------| +| history | Access the chat history. | Accessible dynamically with JS (for e.g., `{{components.chat1.history}}`). | +| isHistoryLoading | Indicates if the history is loading. | Accessible dynamically with JS (for e.g., `{{components.chat1.isHistoryLoading}}`). | +| isResponseLoading | Indicates if the response is loading. | Accessible dynamically with JS (for e.g., `{{components.chat1.isResponseLoading}}`). | +| isInputDisabled | Indicates if the input is disabled. | Accessible dynamically with JS (for e.g., `{{components.chat1.isInputDisabled}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.chat1.isVisible}}`). | +| lastMessage | Holds the last message object of type message in the array. | Accessible dynamically with JS (for e.g., `{{components.chat1.lastMessage}}`). | +| lastResponse | Holds the last message object of type response in the array. | Accessible dynamically with JS (for e.g., `{{components.chat1.lastResponse}}`). | diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/markdown.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/markdown.md new file mode 100644 index 0000000000..543b01bc10 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/markdown.md @@ -0,0 +1,475 @@ +--- +id: markdown +title: Supported Markdown Syntax +--- + +In ToolJet, the Chat Component supports Markdown formatting for both responses and messages. This can be used enhance text formatting using Markdown syntax, making conversations more readable and structured. + +## Supported Markdown Syntax + +#### Headings + +|
    Heading
    |
    Format
    | +|:-------:|:------:| +| H1 | `# Heading`| +| H2 | `## Heading` | +| H3 | `### Heading` | +| H4 | `#### Heading` | +| H5 | `##### Heading` | +| H6 | `###### Heading` | + +#### Text Formatting + +##### Bold + +
    + +
    + +Format: +``` +**Text** +``` + +
    + +
    + +
    + +Result: + +**Text** + +
    + +
    + +##### Italic + +
    + +
    + +Format: +``` +*Text* +``` + +
    + +
    + +
    + +Result: + +*Text* + +
    + +
    + +##### Bold and Italic + +
    + +
    + +Format: +``` +***Text*** +``` + +
    + +
    + +
    + +Result: + +***Text*** + +
    + +
    + +##### Strikethrough + +
    + +
    + +Format: +``` +~~Text~~ +``` + +
    + +
    + +
    + +Result: + +~~Text~~ + +
    + +
    + +#### Lists + +##### Unordered Lists + +
    + +
    + +Format: +``` +- Item 1 +- Item 2 + - Nested Item 2.1 + - Nested Item 2.2 +``` + +
    + +
    + +
    + +Result: +- Item 1 +- Item 2 + - Nested Item 2.1 + - Nested Item 2.2 + +
    + +
    + + +##### Ordered Lists + +
    + +
    + +Format: +``` +1. First Item +2. Second Item + 1. Nested Item 2.1 + 2. Nested Item 2.2 +``` + +
    + +
    + +
    + +Result: +1. First Item +2. Second Item + 1. Nested Item 2.1 + 2. Nested Item 2.2 + +
    + +
    + + +##### Task Lists + +
    + +
    + +Format: +``` +- [x] Completed task +- [ ] Pending task +``` + +
    + +
    + +
    + +Result: +- [x] Completed task +- [ ] Pending task + +
    + +
    + +#### Code + +##### Inlince Code + +
    + +
    + +Format: +``` +This is `inline code`. +``` + +
    + +
    + +
    + +Result: + +This is `inline code`. +
    + +
    + +##### Code Block + +
    + +
    + +Format: +``` +\```javascript +const hello = "world"; +console.log(hello); +\``` +``` +Note: Please remove `\` from the syntax. + +
    + +
    + +
    + +Result: +```javascript +const hello = "world"; +console.log(hello); +``` +
    + +
    + +#### Block Quotes + +
    + +
    + +Format: +``` +> Single level quote +>> Nested quote +>>> Deep nested quote +``` + +
    + +
    + +
    + +Result: +> Single level quote +>> Nested quote +>>> Deep nested quote +
    + +
    + +#### Links and Images + +##### Links + +
    + +
    + +Format: +``` +[Link Text](https://example.com) +``` + +
    + +
    + +
    + +Result: + +[Link Text](https://example.com) + +
    + +
    + +##### Image + +
    + +
    + +Format: +``` +![Image Alt Text](https://images.unsplash.com/photo-1509966756634-9c23dd6e6815?q=80&w=3176&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D) +``` + +
    + +
    + +
    + +Result: + +![Image Alt Text](https://images.unsplash.com/photo-1509966756634-9c23dd6e6815?q=80&w=3176&auto=format&fit=crop&ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D) + +
    + +
    + +#### Tables + +
    + +
    + +Format: +``` +| Header 1 | Header 2 | +|-----------|-----------| +| Cell 1 | Cell 2 | +| Cell 3 | Cell 4 | +``` + +
    + +
    + +
    + +Result: + + Header 1 | Header 2 | +|-----------|-----------| +| Cell 1 | Cell 2 | +| Cell 3 | Cell 4 | + +
    + +
    + +#### Horizontal Rules + +
    + +
    + +Format: +``` +--- +OR +___ +OR +*** +``` + +
    + +
    + +
    + +Result: + +--- + +
    + +
    + +#### HTML Content + +
    + +
    + +Format: +``` +
    + Colored text +
    +
    + + + +
    HTML Table
    +``` + +
    + +
    + +
    + +Result: + +
    + Colored text +
    + + + + +
    HTML Table
    + +
    + + + +#### Footnotes + +
    + +
    + +Format: +``` +Here's a sentence with a footnote[^1]. + +[^1]: This is the footnote. +``` + +
    + +
    + +
    + +Result: + +Here's a sentence with a footnote[^1]. + +[^1]: This is the footnote. + +
    + +
    + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/overview.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/overview.md new file mode 100644 index 0000000000..a68e7fc4e2 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/overview.md @@ -0,0 +1,58 @@ +--- +id: overview +title: Overview +slug: /widgets/chat/ +--- + +The **Chat Component** is used to implement a chat-based interface in an application. It can be integrated with AI plugins to build an AI-enabled chatbot or used for traditional chat functionalities, making it suitable for both AI-powered and human-to-human conversations. + +This guide explains how to build an AI-enabled support chatbot using the Chat Component. For more details, refer to the following guides: +- **[Chat Component Properties](/docs/widgets/chat/properties)** +- **[Component Specific Actions (CSA)](/docs/widgets/chat/csa)** +- **[Supported Markdown Syntax](/docs/widgets/chat/markdown)** + +## Building AI Enabled Chatbot + +1. Drag a **Chat Component** on the canvas. + +Drag a New Chat Component + +2. Customize the **Chat Component**. + + a. Enter a Chat Title.
    + b. Set Initial Chat.
    + c. Configure User Name and Avatar.
    + d. Configure Respondent Name and Avatar.
    + +Customize your Chat Component + +3. Setup an AI query to generate responses. Check out **[marketplace](/docs/marketplace/marketplace-overview)** for all the available plugins. Alternatively, you can configure it with any data source or use it as a chat between multiple users. To do this, specify the type 'response' in the message object. + +Setup the AI Query + +4. Add a new event handler for the query with the following configurations: + - Event: **Query Success** + - Action: **Control Component** + - Component: **chat1** *(Select your chat component name from the dropdown.)* + - Action: **Append History** + - Message: + `{{{message: queries.openai1.data, type:"response"}}}` + +Query Event Handler + +5. Now add a new event handler for the **Chat Component**, with the following configuration: + - Event: **On Message Sent** + - Action: **Run Query** + - Query: **openai1** *(Select your AI query name from the dropdown.)* + +Component Event Handler + +6. To add Response loading state, click on **fx** in front of Response loading state option and configure it with `{{queries.openai1.isLoading}}`. + +Add Response Loading State + +By following the above steps, your AI Enabled Chatbot will be ready. + +Final Chatbot + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/properties.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/properties.md new file mode 100644 index 0000000000..6ebf47251e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/chat/properties.md @@ -0,0 +1,56 @@ +--- +id: properties +title: Properties +--- + +The **Chat Component** can be customized by configuring various properties or adding events to perform specific actions. To learn how to build a chatbot, refer to the [Chat Component Overview](/docs/widgets/chat/) guide. For more information on CSAs and Exposed Variables, check out the [Component Specific Actions](/docs/widgets/chat/csa) guide. + +## Properties + +| Property | Description | Expected Value | +|----------|-------------|--------------- | +| Chat Title | Title of the chat component. | String (e.g. `ToolJet Support Chatbot`) | +| Initial Chat | Initial messages to be loaded when the chat starts. | Array of Objects ( e.g. `{{[ { message: 'Hey! Welcome to ToolJet. How may I help you?' } ]}}` ) | +| User Name | Defines the user's name. | String (e.g. `John Doe`) | +| User Avatar | Defines the user's avatar. | Image URL | +| Respondent Name | Defines the respondent's name. | String (e.g. `ToolJet Bot`) | +| Respondent Avatar | Defines the respondent's avatar. | Image URL | + +## Message Object Properties + +| Property | Description | Required | Expected Value | +|----------|-------------|----------|----------------| +| Message | The content of the message. | Required | String (e.g. `"Hey! How can I help you?"`) | +| Message ID | ID of the message. | Auto-generated | String (e.g. `"e3dd6f60-d5e8-46c5-b73b-006f2f4a34f2"`) | +| Timestamp | Date and Time of the message. | Auto-generated | DateTime in ISO 8601 format (e.g. `"2025-02-05T09:33:32.468Z"`) | +| Name | Message sender's name. | Optional | String (e.g. `"John Doe"`) | +| Avatar | Message sender's avatar. | Optional | Image URL | +| Type | Type of the message. | Required | Accepted Values: `"response"`, `"message"` or `"error"`. | + +## Events + +| Event | Description | +|-------|-------------| +| On history cleared | Triggers whenever the history is cleared. | +| On message sent | Triggers whenever a message is sent. | + +## Additional Actions + +All the following actions can be enabled or disabled either by using the toggle switch or by dynamically configuring the value by clicking on **fx** and entering a logical expression. + +| Action | Description | +|--------|-------------| +| Visibility | Controls the component's visibility. | +| Disable input state | Enables or disables the input state. | +| Histroy loading state | Enables the history loading state, often used with `isLoading` to indicate progress. | +| Response loading state | Enables the response loading state, often used with `isLoading` to indicate progress. | +| Enable clear history button | Enables or disables the clear history button. | +| Enable download history button | Enables or disables the delete history button. | + +## 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. | + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/checkbox.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/checkbox.md new file mode 100644 index 0000000000..9cb0c38bad --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/checkbox.md @@ -0,0 +1,130 @@ +--- +id: checkbox +title: Checkbox +--- +# Checkbox + +The **Checkbox** component allows users to make a binary choice, such as selecting or deselecting an option. + +
    + +## Properties + +### Data + +| Property | Description | Expected Value | +|:---------------|:---------------|:-----------------------| +| Label | The text to be used as the label for the checkbox. | String (e.g., `Select payment preference`). | +| Default status | Sets the default status when the app is loaded. | Toggle the on/off switch or click on **fx** and dynamically set the value. | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On change | Triggers whenever the checkbox input is changed. | +| On check (deprecated) | Triggers whenever the checkbox input is checked. | +| On uncheck (deprecated)| Triggers whenever the checkbox input is unchecked. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Checkbox component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------| +| setChecked | Changes the status of the checkbox component using component-specific action from within any event handler. | Employ a RunJS query (e.g., `await components.checkbox1.setChecked(true)`) or trigger it using an event. | +| setValue | Sets the value of the checkbox. | Employ a RunJS query (e.g., `await components.checkbox1.setValue(true)`) or trigger it using an event. | +| setLoading | Toggles the loading state of the checkbox. | Employ a RunJS query (e.g., `await components.checkbox1.setLoading(true)`) or trigger it using an event. | +| setVisibility | Changes the visibility of the checkbox. | Employ a RunJS query (e.g., `await components.checkbox1.setVisibility(true)`) or trigger it using an event. | +| setDisable | Disables or enables the checkbox. | Employ a RunJS query (e.g., `await components.checkbox1.setDisable(true)`) or trigger it using an event. | +| toggle | Toggles the current state of the checkbox. | Employ a RunJS query (e.g., `await components.checkbox1.toggle()`) or trigger it using an event. | + + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:-------------|:------------------------------------|:-------------------------------------------------| +| value | Holds the boolean value `true` if the checkbox is checked and `false` if unchecked. | Accessible dynamically with JS (e.g., `{{components.checkbox1.value}}`). | +| label | The text label of the checkbox. | Accessible dynamically with JS (e.g., `{{components.checkbox1.label}}`). | +| isValid | Indicates if the checkbox state is valid. | Accessible dynamically with JS (e.g., `{{components.checkbox1.isValid}}`). | +| isMandatory | Indicates if the checkbox is mandatory. | Accessible dynamically with JS (e.g., `{{components.checkbox1.isMandatory}}`). | +| isLoading | Indicates if the checkbox is in a loading state. | Accessible dynamically with JS (e.g., `{{components.checkbox1.isLoading}}`). | +| isVisible | Indicates if the checkbox is visible. | Accessible dynamically with JS (e.g., `{{components.checkbox1.isVisible}}`). | +| isDisabled | Indicates if the checkbox is disabled. | Accessible dynamically with JS (e.g., `{{components.checkbox1.isDisabled}}`). | + +
    + +
    + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.checkbox1.value === false &&"Value needs to be checked"}}`). | + +To add regex inside `Custom Validation`, you can use the below format: + +**Format**: `{{(.test()) ? '' : 'Error message';}}` + +**Example**: `{{(/^\d{1,10}$/.test(components.textinput1.value)) ? '' : 'Error message';}}` + +## 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 (e.g., `Are you a registered user?` ). | + +
    + +## 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. | + +
    + +--- + +# Styles + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Text color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `left` or `right`. | + +## Switch + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Border color | Sets the color of the checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Checked color | Sets the color of the checkbox when it is checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Unchecked color | Sets the color of the checkbox when it is not checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Handle color | Sets the color of the checked symbol inside the checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. | + +
    + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/circular-progressbar.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/circular-progressbar.md new file mode 100644 index 0000000000..bf4a480929 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/circular-progressbar.md @@ -0,0 +1,82 @@ +--- +id: circular-progress-bar +title: Circular Progressbar +--- +# Circular Progressbar + +The Circular Progressbar component can be used to show progress in a progress circle. + +
    + +## Properties + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +|
    Properties
    |
    Description
    |
    Expected Value
    | +| ----------- | ----------- | --------------- | +| Text | Sets a text inside the progress circle.| It expects a `String`, you can also use js to dynamically update the text as the progress changes. | +| Progress | Sets the progress of the component. | Progress should be an integer between 0 and 100.| + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Property
    |
    Description
    |
    Expected Value
    | +| ----------- | ----------- | ------------------- | +| Color | Defines stroke color.| `HEX color code` or choose color from color-picker. | +| Text color | Defines color of the text inside circular progress bar.| `HEX color code` or choose color from color-picker | +| Text size | Defines the size of the text | Value must between 0-100 | +| Stroke width | Defines the width of stroke | Value must between 0-100| +| Counter clockwise | Whether to rotate progress bar in counterclockwise direction. | Accepts `{{true}}` and `{{false}}`, Default value is `false`| +| Circle ratio | Defines ratio of the full circle diameter the progressbar should use. | Accepts numerical value and the default is `1` | +| Visibility | Toggle on or off to control the visibility of the component. | Programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}` | + +:::info +Circular progress bar component uses [react-circular-progress](https://github.com/kevinsqi/react-circular-progressbar) package. Check the repo for further more details about properties and styles. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/code-editor.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/code-editor.md new file mode 100644 index 0000000000..4f94b5456f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/code-editor.md @@ -0,0 +1,221 @@ +--- +id: code-editor +title: Code Editor +--- + +**Code Editor** component is a versatile text editor for editing code and supports several languages. + + +
    + +## Properties + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:----------- |:----------- |:----------------- | +| Placeholder | Specifies a hint that describes the expected value.| This field requires a `String` value. | +| Mode | Specifies the language to be used for the code-editor.| See `info` below for the list of all supported languages. | +| Show line number | Show or hides line numbers to the left of the editor.| This fields expects a boolean value `{{true}}` or `{{false}}`. | + +:::info +
    +Supporting all commonly used languages. +
      +
    • APL
    • +
    • ASN.1
    • +
    • Asterisk dialplan
    • +
    • Brainfuck
    • +
    • C, C++, C#
    • +
    • Ceylon
    • +
    • Clojure
    • +
    • Closure Stylesheets (GSS)
    • +
    • CMake
    • +
    • COBOL
    • +
    • CoffeeScript
    • +
    • Common Lisp
    • +
    • Crystal
    • +
    • CSS
    • +
    • Cypher
    • +
    • Cython
    • +
    • D
    • +
    • Dart
    • +
    • Django (templating language)
    • +
    • Dockerfile
    • +
    • diff
    • +
    • DTD
    • +
    • Dylan
    • +
    • EBNF
    • +
    • ECL
    • +
    • Eiffel
    • +
    • Elixir
    • +
    • Elm
    • +
    • Erlang
    • +
    • Factor
    • +
    • FCL
    • +
    • Forth
    • +
    • Fortran
    • +
    • F#
    • +
    • Gas (AT&T-style assembly)
    • +
    • Gherkin
    • +
    • Go
    • +
    • Groovy
    • +
    • HAML
    • +
    • Handlebars
    • +
    • Haskell
    • +
    • Haxe
    • +
    • HTML embedded (JSP, ASP.NET)
    • +
    • HTML mixed-mode
    • +
    • HTTP
    • +
    • IDL
    • +
    • Java
    • +
    • JavaScript (JSX)
    • +
    • Jinja2
    • +
    • Julia
    • +
    • Kotlin
    • +
    • LESS
    • +
    • LiveScript
    • +
    • Lua
    • +
    • Markdown (GitHub-flavour)
    • +
    • Mathematica
    • +
    • mbox
    • +
    • mIRC
    • +
    • Modelica
    • +
    • MscGen
    • +
    • MUMPS
    • +
    • Nginx
    • +
    • NSIS
    • +
    • N-Triples/N-Quads
    • +
    • Objective C
    • +
    • OCaml
    • +
    • Octave (MATLAB)
    • +
    • Oz
    • +
    • Pascal
    • +
    • PEG.js
    • +
    • Perl
    • +
    • PGP (ASCII armor)
    • +
    • PHP
    • +
    • Pig Latin
    • +
    • PowerShell
    • +
    • Properties files
    • +
    • ProtoBuf
    • +
    • Pug
    • +
    • Puppet
    • +
    • Python
    • +
    • Q
    • +
    • R
    • +
    • RPM
    • +
    • reStructuredText
    • +
    • Ruby
    • +
    • Rust
    • +
    • SAS
    • +
    • Sass
    • +
    • Spreadsheet
    • +
    • Scala
    • +
    • Scheme
    • +
    • SCSS
    • +
    • Shell
    • +
    • Sieve
    • +
    • Slim
    • +
    • Smalltalk
    • +
    • Smarty
    • +
    • Solr
    • +
    • Soy
    • +
    • Stylus
    • +
    • SQL (several dialects)
    • +
    • SPARQL
    • +
    • Squirrel
    • +
    • Swift
    • +
    • sTeX, LaTeX
    • +
    • Tcl
    • +
    • Textile
    • +
    • Tiddlywiki
    • +
    • Tiki wiki
    • +
    • TOML
    • +
    • Tornado (templating language)
    • +
    • troff (for manpages)
    • +
    • TTCN
    • +
    • TTCN Configuration
    • +
    • Turtle
    • +
    • Twig
    • +
    • VB.NET
    • +
    • VBScript
    • +
    • Velocity
    • +
    • Verilog/SystemVerilog
    • +
    • VHDL
    • +
    • Vue.js app
    • +
    • Web IDL
    • +
    • WebAssembly Text Format
    • +
    • XML/HTML
    • +
    • XQuery
    • +
    • Yacas
    • +
    • YAML
    • +
    • YAML frontmatter
    • +
    • Z80
    • +
    +
    +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Code Editor component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------| +| setValue | Sets the value of the code editor. | Employ a RunJS query (e.g., `components.codeeditor1.setValue('const getRandomNumber = () => Math.floor(Math.random() * 100) + 1')`) or trigger it using an event. | + +**Note:** If the setValue component specific action is executed using a JavaScript query, you will have to pass the code inside backticks. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------- | +| value | Holds the current input value entered by the user in the code editor. | Accessible dynamically with JS (for e.g., `{{components.codeeditor1.value}}`). | + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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.| + +
    + +
    + +--- + +## Styles + +|
    Styles
    |
    Description
    |
    Default Value
    | +|:----------- |:----------- |:----------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}` | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}` | +| Border radius | Modifies the border radius of the editor. The field expects only numerical value from `1` to `100`. | Default is `0`. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/color-picker.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/color-picker.md new file mode 100644 index 0000000000..307ff988c7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/color-picker.md @@ -0,0 +1,108 @@ +--- +id: color-picker +title: Color Picker +--- + +**Color Picker** component is used to select the desired color from the color picker. + +
    + +## Properties + +### Default color + +The data needs to be a valid hex color. + +- One can change default color either from color picker or using **fx** (need to provide only respective hex value). + +**Example:** + +```json +Valid color : #000000 or #000 +Invalid Color : #0000, "black" , rgb(0,0,0) , +``` + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On change | Triggers whenever the color is changed on the color-picker.| + +
    + +
    + +## Component Specific Actions (CSA) + +The following actions of the component can be controlled using component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:----------- | +| setColor() | Sets a color on the color component. | Employ a RunJS query (for e.g., `await components.colorpicker1.setColor('#64A07A')`) or trigger it using an event. | + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------- | +| selectedColorHex | Gets updated with HEX color code whenever a user selects a color from the color picker.| Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorHex}}`).| +| selectedColorRGB | Gets updated with RGB color code whenever a user selects a color from the color picker. | Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorRGB}}`).| +| selectedColorRGBA | Gets updated with RGBA color code whenever a user selects a color from the color picker.| Accessible dynamically with JS (for e.g., `{{components.colorpicker1.selectedColorRGBA}}`).| + +
    + +
    + +## 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. | + +
    + +---- + +
    + +## Styles + +|
    Style
    |
    Description
    |
    Expected Value
    | +|:---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:---------- | +| Visibility | Toggle on or off to control the visibility of the component.| Programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +
    + +
    + +## Actions + +|
    Action
    |
    Description
    |
    Properties
    | +|:----------- |:----------- |:------------------ | +| setColor | Set the color. | `color` eg - `#ffffff` | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +**Example: Selecting/changing color from the color picker and getting respective hex, rgb and rgba value of selected color** +- Let's start by creating a new app and then dragging the Color Picker component onto the canvas. +- Click on the Color Picker component, a picker pop-up will appear, one can select desired color from the picker. +- In order to close the appeared picker pop-up, one need's to move away mouse from the picker pop-up and picker pop-up will fade away. +- In the Inspector, inside component, look for colorpicker, where one can get respective hex, rgb and rgba color. + +
    + +ToolJet - Component Reference - Color Picker + +
    + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/container.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/container.md new file mode 100644 index 0000000000..9ff64cc65e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/container.md @@ -0,0 +1,68 @@ +--- +id: container +title: Container +--- + +Containers are used to group components together. You can move a group of related components inside a container for better organization of your UI elements. + +:::caution Restricted components +Certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the Container component. +::: + +## Show header + +The show header toggle can be used to display or hide a header for the component. If you keep the toggle on, the container will display a header on which you can place other components. The styling of the header can be controlled separately under the Styles tab. + +## Component Specific Actions (CSA) + +Following actions of component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.container1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.container1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.container1.setDisable(true)`) or trigger it using an event. | + +## Exposed Variables + +| Variable | Description | How To Access | +|:--------|:-----------|:------------| +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.container1.isLoading}}`).| +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.container1.isVisible}}`).| +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.container1.isDisabled}}`).| + +## Tooltip + +You can add a Tooltip to the component in string format. Once you pass a value in the tooltip input, hovering over the component will display the value on the right. + +## Additional Actions + +|
    Action
    |
    Description
    |
    Configuration Options
    | +|:------------------|:------------|:------------------------------| +| Loading state | Enables a loading spinner, often used with the isLoading property to indicate progress. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Visibility | Controls component visibility. | 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. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | + +## 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. | + +--- + +## Styles + +|
    Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the container. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Header | Sets the background color of the header. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Header height | Sets the height of the header within the component. | Enter a number or click on **fx** and input a number programmatically using code. | +| Border radius | Sets the radius of the component. | Enter a number or click on **fx** and input a number programmatically using code. | +| Border color | Sets the color of the border. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. | + + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/custom-component.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/custom-component.md new file mode 100644 index 0000000000..fe7f29a49a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/custom-component.md @@ -0,0 +1,131 @@ +--- +id: custom-component +title: Custom Component +--- + +**Custom Component** can be used to create your own React component when the needed functionality isn't available in other components. + +
    + +ToolJet - Widget Reference - Custom Component + +
    + +
    + +## Properties + +### Data + +The data needs to be an object that needs to be passed as **data** props to the **Custom Component**. + +**Example:** + +```json +{{{ + title: "Hi! There", + buttonText: "Updated Text", + queryName: "runjs1" +}}} +``` + +### Code + +This field is used to add a React code for your custom component. The packages for the custom component can be imported from [Skypack](https://www.skypack.dev/) or [esm](https://esm.sh/). For example, to import **React** package into the custom component it can be imported as `import React from 'https://cdn.skypack.dev/react'`. + +ToolJet provides 3 props to interact with the app: +- **data** is a shared object between a custom component and the ToolJet app. +- **updateData** is a function that accepts a single object used to update the data passed to the custom component. +- **runQuery** is a function that accepts a query name as a string used to run the query from the custom component. + +**Example:** + +```js +import React from "https://cdn.skypack.dev/react"; +import ReactDOM from "https://cdn.skypack.dev/react-dom"; +import { Button, Container, Link } from "https://cdn.skypack.dev/@material-ui/core"; + +const MyCustomComponent = ({data, updateData, runQuery}) => ( + +

    {data.title}

    + + +
    +); + +const ConnectedComponent = Tooljet.connectComponent(MyCustomComponent); + +ReactDOM.render(, document.body); +``` + +:::info +`Tooljet.connectComponent` acts as a HOC and it is required to get access to the data passed into the custom component and run the query. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------- | +| data | This variable will hold the variables assigned inside the `code` for custom component.| Access the value dynamically using JS: `{{components.customcomponent1.data.title}}`.| + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | + +
    + +
    +---- + +## Styles + +|
    Style
    |
    Description
    |
    Default value
    | +|:---------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |:--------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. | By default, it's set to `{{true}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/date-range-picker.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/date-range-picker.md new file mode 100644 index 0000000000..6a1ce0bc14 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/date-range-picker.md @@ -0,0 +1,91 @@ +--- +id: date-range-picker +title: Date-range Picker +--- + +The **Date-Range Picker** component allows users to select a range of dates. + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:----------- |:----------- | +| Default start date | Set the start date to be selected by default in the component. | +| Default end date | Set the start date to be selected by default in the component. | +| Format | The format of the date selected by the date picker. Default date format is **DD/MM/YYYY**. Date format should be followed as ISO 8601 as mentioned in the [moment documentation](https://momentjs.com/docs/). | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On select | Triggers whenever a start date and end date are selected in the date range picker component. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| endDate | Holds the date selected as the end date in the component. | Accessible dynamically with JS (e.g., `{{components.daterangepicker1.endDate}}`). | +| startDate | Holds the date selected as the start date in the component. | Accessible dynamically with JS (e.g., `{{components.daterangepicker1.startDate}}`). | + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Devices + +|
    Layout
    |
    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 + +|
    Style
    |
    Description
    |
    Default Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Border radius | This is to modify the border radius of the date range picker. The field expects only numerical value from `1` to `100`. | By default, it's set to `0`. | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/datepicker.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/datepicker.md new file mode 100644 index 0000000000..5d1ca78de8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/datepicker.md @@ -0,0 +1,117 @@ +--- +id: datepicker +title: Date Picker +--- +# Date Picker + +The **Date Picker** component allows users to select a single value for date and time from a pre-determined set. + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:----------- |:----------- | +| Default value | This value acts as placeholder for the date picker component, if any value is not provided then the default value will be used from the picker. The default value needs to be a `String` with respect to the `format` field. Ex: If format is set to `MM/YYYY` then provide default value as `04/2022`. | +| Format | This value acts as placeholder for the date picker component, if any value is not provided then the default value will be used from the picker. The default value needs to be a `String` with respect to the `format` field. Ex: If format is set to `MM/YYYY` then provide default value as `04/2022`. | +| Enable time selection? | Toggle on or off to enable the time selection. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Enable date selection? | Toggle on or off to enable the date selection. You can programmatically determine the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Disabled dates | We can give disabled dates property which will make specific dates disabled and cannot be selected. The default value needs to be an array of `Strings`. | + +Example for disabling the 9th of January: +```js +{{['09-01']}} +``` + +Now user won't be able to select the mentioned date since it will be disabled. + +
    + +
    + +## Events + +To add an event to a date-picker component, click on the component handle to open the component properties on the right sidebar. Go to the **Events** section and click on **+ Add handler**. + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On select | Triggers whenever the user selects a date. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- | :---------- | +| value | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g.,`{{components.datepicker1.value}}`).| + +
    + +
    + +## Validation + +### Custom Validation + +Add a validation for the date input in the component using the ternary operator. + +Example of validation for selecting dates that are after the current date: +```js +{{moment(components.datepicker1.value, 'DD/MM/YYYY').isAfter(moment()) ? true : 'Date should be after today'}} +``` + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Default Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional | By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the date-picker. The field expects only numerical value from `1` to `100` | By default, its value is set to `0`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/divider.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/divider.md new file mode 100644 index 0000000000..ade7cd22a9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/divider.md @@ -0,0 +1,59 @@ +--- +id: divider +title: Divider +--- + +The **Divider** component is used to add a separator between components. + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Layout + +| Layout | 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 + +| Property | Description | Configuration Options | +|:---------- |:------------ |:-----------------------| +| Divider Color | Sets the color of the divider. | Select the color or click on **fx** and input code that programmatically returns a HEX color code. | +| 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. | +| Box Shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust related properties or set it programmatically using **fx**. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/dropdown.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/dropdown.md new file mode 100644 index 0000000000..4bcfc7bbea --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/dropdown.md @@ -0,0 +1,168 @@ +--- +id: dropdown +title: Dropdown +--- +# Dropdown + +The Dropdown component can be used to collect user input from a list of options. This document goes through all the properties related to the **Dropdown** component. + +:::info +To get the configuration of legacy Dropdown component, please refer to **[this](/docs/2.50.0-LTS/widgets/dropdown)** document. +::: + +## Data +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the field. | String (e.g., `Country`). | +| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `Choose an option`). | + +## Options +Allows you to add options to the dropdown field. You can click on `Add new option` and add options manually or enable `Dynamic options` and enter the options using code. + +### Example Code for Dynamic Columns + +1. Passing an array of objects and specifying each value: + +```js +{{ + [{label: 'option1', value: 1, disable: false, visible: true, default: true}, + {label: 'option2', value: 2, disable: false, visible: true}, + {label: 'option3', value: 3, disable: false, visible: true}] +}} +``` + +2. Passing an array of objects with a default value from a **Table** component's selected row: + +```js +{{ + queries.getEmployees.data.map(option => ({ + label: option.firstname, + value: option.firstname, + disable: false, + visible: true, + default: option.firstname === components.table1.selectedRow.firstname + })) +}} +``` + +### Options loading state +Allows you to add a loading state to the dynamically generated options. You can enable or disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. + +## Events + +**On select**
    +Triggers when an option is selected. + +**On search text changed**
    +Triggers when search text changes. + +**On focus**
    +Triggers whenever the user clicks inside the component. + +**On blur**
    +Triggers whenever the user clicks outside the component. + +## Component specific actions (CSA) + +Following actions of the component can be controlled using the component specific actions(CSA): + + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| clear() | Clears the selected option. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.setDisable(true)`) or trigger it using an event. | +| selectOption() | Selects an option. | Employ a RunJS query (for e.g.,
    `await components.dropdown1.selectOption(2)`) or trigger it using an event. | + +**Note:** The data type passed to CSAs like `selectOption()` depends on how you configure the component. When adding options manually using the **Add new option** button, values must be strings (for example, `components.dropdown1.selectOption(['2'])`). When using dynamic options, supply values with the correct data types as they appear in your code logic. + +For example, if the code is: +```javascript +{{ + [ + { label: 'option1', value: 1, disable: false, visible: true, default: true }, + { label: 'option2', value: 2, disable: false, visible: true }, + { label: 'option3', value: 3, disable: false, visible: true } + ] +}} +``` + +You should pass numeric values in the `selectOptions` component-specific action since the value type is **Number**: + +```javascript +components.dropdown1.selectOption([2]) +``` + +## Exposed Variables + +|
    Variable
    |
    Description
    |
    How To Access
    | +|:----------|:----------|:------------| +| searchText | This variable is initially empty and holds the value whenever the user searches on the dropdown. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.searchText}}`). | +| label | Holds the label name of the dropdown. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.label}}`). | +| value | Holds the value selected by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.value}}`). | +| selectedOption | Holds the label and value of the selected option in array form. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.selectedOption.label}}` or
    `{{components.dropdown1.selectedOption.value}}`). | +| isValid | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isValid}}`). | +| options | Holds all the option values of the dropdown in array form. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.options}}` or
    `{{components.dropdown1.options[0].label}}` for a specific option). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isVisible}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isLoading}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isDisabled}}`). | +| isMandatory | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.dropdown1.isMandatory}}`). | + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no option is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.dropdown.value<5&&"Value needs to be more than 5"}}`). | + + +## 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 (e.g., `Enter your name here.` ). | + +
    + +## 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. | + +
    + +--- + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | + +## Field + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Accent | Sets the color of the border when the dropdown is opened. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Error text | Sets the text color of validation message that displays. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color | +| 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. | + + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/file-picker.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/file-picker.md new file mode 100644 index 0000000000..099a2b03b8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/file-picker.md @@ -0,0 +1,134 @@ +--- +id: file-picker +title: File Picker +--- +# File Picker + +**File Picker** component allows the user to drag and drop files or upload files by browsing the filesystem and selecting one or more files in a directory. + +:::info + File types must be a valid [MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) type according to input element specification or a valid file extension. + + To accept any/all file type(s), set `Accept file types` to an empty value. +::: + +:::tip +[MIME](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types) type determination is not reliable across platforms. CSV files, for example, are reported as text/plain under macOS but as application/vnd.ms-excel under Windows. +::: + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:----------- |:----------- | +| Instruction text | Instruction text can be set to give information on the file picker. | +| Use drop zone | Creates a drag & drop zone. Files can be dragged and dropped to the "drag & drop" zone. | +| Use file picker | On clicking it invokes the default OS file prompt. | +| Pick multiple files | Allows drag and drop (or selection from the file dialog) of multiple files. `Pick multiple files` is disabled by default. | +| Max file count | The maximum accepted number of files The default value is `2`. | +| Accept file types | By providing types, you can make the dropzone accept specific file types and reject the others. Example: `{{"image/*,application/pdf,application/msword"}}`. | +| Max size limit | Maximum file size (in bytes). | +| Min size limit | Minimum file size (in bytes). | + +:::tip +Files can be accepted or rejected based on the file types, maximum file count, maximum file size (in bytes) and minimum file size (in bytes). +If `Pick multiple files` is set to false and additional files are dropped, all files besides the first will be rejected. +Any file that does not have a size in the range of `Max size limit` and `Min size limit` will be rejected. +::: + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On file selected | Triggers whenever one or more files are selected by the selector dialogue box. | +| On file loaded | Triggers whenever a file is loaded in the browser. | +| On file deselected | Triggers whenever one or more files are removed from the picker. | + +:::info +Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how to refer or display images/PDFs using base64 string. +::: + +
    + +
    + +## Component Specific Actions (CSA) + + + +| Actions | Description | How To Access | +|:--------|:-----------|:------------| +|
    clearFiles()
    | Clears the selected files from the file picker component. | Employ a RunJS query (for e.g., `await components.filepicker1.clearFiles()`) or trigger it using an event. | + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:-------- | +| file | Holds an array of file objects loaded in the file picker, each with properties: **name**, **type**, **content**, **dataURL**, **base64Data**, **parsedData**, **filePath**. | Accessible dynamically with JS (for e.g., `{{components.filepicker1.file[0].base64Data}}`). | + +
    + +
    + +## Options + +|
    Option
    |
    Description
    | +|:----------- |:----------- | +| Parse content | Parse the selected files, supports **CSV**, **xls**, and **xlsx** files. | +| File type | If **Parse content** is enabled, options to auto-detect files and parse content or parse selected file types. | + +:::info +- If **Parse content** option is toggled off, **File Type** option will not be available. +- If the **Parse content** option is toggled on, it only parses the next file that is selected, not the already selected one. +::: + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Default Value
    | +|:----------- |:----------- |:----------- | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the File Picker component. The field expects only numerical value from `1` to `100`. | By default, its value is set to `0`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/form.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/form.md new file mode 100644 index 0000000000..5bf87e1bde --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/form.md @@ -0,0 +1,795 @@ +--- +id: form +title: Form +--- + +The **Form** component is designed to capture user input. It can act as a parent component to various components such as **Text**, **Text Input**, **Dropdown** and **Buttons** to initiate specific events. In this document, we'll go through all the configuration options for the **Form** component. + +:::caution Restricted components +Components like **Kanban**, **Calendar**, **Modal**, **Container**, **ListView**, **Tabs**, and **Form** can't be dropped inside the Form component. +::: + +
    + +## Properties + +|
    Properties
    |
    Description
    |
    Expected Value
    | +| :---------- | :--------------------------- | :------------- | +| Button To submit form | This dropdown can be used to select a **Button** that will be used to submit the form. | Any button that is a child component inside the **Form** component +| Loading state | Loading state can be used to show a spinner while the content is loaded. Loading state is commonly used with the **isLoading** property of queries. | Use the toggle button or dynamically configure the value by clicking on `Fx` and entering a logical expression that results in either `{{true}}` or `{{false}}`| +| Use custom schema | Enabling this property allows you to provide a schema for the Form component in the JSON format. | Switch the toggle or click on `Fx` to programmatically enable the **JSON schema**| + +:::info +If you need a step-by-step guide on using a **Form** component, you can checkout **[this](/docs/how-to/use-form-component)** guide. +::: + +
    + +
    + +## Events + +To add an event to the **Form** component, go to the **Events** section and click on **Add handler**. + +|
    Event
    |
    Description
    | +|:------------|:-----------------| +| On submit | **On submit** event is triggered when the submit button on the form component is clicked. | +| On invalid | **On invalid** event is triggered when the input on the form is invalid. | + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of form component can be controlled using the Component Specific Actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :----------- | :----------- |:----------- | +| submitForm | Submits the form data via a **[component-specific action](/docs/actions/control-component/)** within any event handler. |Employ a RunJS query to execute component-specific actions such as `await components.form1.submitForm()` | +| resetForm | Resets the form data via a **[component-specific action](/docs/actions/control-component/)** within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.form1.resetForm()` | + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-------- | +| data | This variable holds the data of all the components that are nested inside the form component. | You can access the value dynamically using JS. For example, `{{components.form1.data.numberinput1.value}}`| + +
    + +
    + +## Using Custom Schema + +To provide the form schema in JSON format, we'll pass a JavaScript object with **title**, **properties** and **submitButton**. + +|
    Key
    |
    Description
    | +| :----------- | :----------- | +| title | The **title** key specifies the title of the form. | +| properties | The **properties** key holds an object that defines the properties of the components that will be inside the form. | +| submitButton | The **submitButton** key holds an object that defines the properties of the Submit Button of the form. | + +This **[list](/docs/widgets/form#custom-schema-examples)** provides examples of Custom Schema for all components that can be used in a Form component. + +```json +{{{ + "title": "", // Provide title for Form + "properties": { + + }, // Provide schema of the components that will be inside the form + "submitButton": { + + } // Provide schema of the submit button +}}} +``` + +Here's an example using the custom schema of **Text Input**, **Number Input** and **Dropdown** components: + +```json +{{{ + "title": "Event Registration", + "properties": { + "textinput1": { + "type": "textinput", + "value": "John", + "placeholder": "Enter First Name Here", + "label": "First Name", + "validation": { + "maxLength": 6 + }, + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "borderColor": "black", + "errorTextColor": "#025aa3", + "disabled": false, + "visibility": true, + "textColor": "#025aa3" + } + }, + "numberInput1": { + "type": "number", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "textColor": "#025aa3", + "borderColor": "black", + "disabled": false, + "visibility": "true" + }, + "value": 22, + "maxValue": 100, + "minValue": 14, + "placeholder": "Enter Your Age", + "label": "Age" + }, + "dropdown1": { + "type": "dropdown", + "displayValues": ["Male", "Female", "Prefer not to Answer"], + "values": [1, 2, 3], + "loading": false, + "value": "1", + "label": "Gender", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5, + "justifyContent": "start" + } + } + }, + "submitButton": { + "value": "Submit", + "styles": { + "backgroundColor": "#3A433B", + "borderColor": "#595959" + } + } +}}} +``` + + + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify the extra information when the user hovers the mouse pointer over the component. Once a value is set for Tooltip, hovering over the element will display the specified string as the tooltip text. + +
    + Tooltip Example +
    + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +
    + +
    + +## Styles + +|
    Style
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| Background color | Changes the background color of the form. | Hex color code/choose a color using the color picker| +| Border radius | Adjusts the roundness of the component's corners. | Numeric value| +| Border color | Changes the border color of the component.| Hex color code/choose a color using the color picker| +| Visibility | Controls the visibility of the component. If set to `{{false}}`, the component will not be visible.| Use the toggle button OR click on `Fx` to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`| +| Disable | Makes the component non-functional when set to true. | Use the toggle button OR click on `Fx` to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`| + +
    + +
    + +## General + +|
    Property
    |
    Description
    | +|:-------- |:-------- | +| Box Shadow | The **Box Shadow** property is used to add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. | + +
    + +
    + +## Custom Schema Examples +- **[Datepicker](#datepicker)** +- **[Number Input](#number-input)** +- **[Password](#password)** +- **[Checkbox](#checkbox)** +- **[Toggle](#toggle)** +- **[Text Area](#text-area)** +- **[Date Range Picker](#date-range-picker)** +- **[Multiselect](#multiselect)** +- **[Star Rating](#star-rating)** +- **[File Picker](#file-picker)** +- **[Text Input](#text-input)** +- **[Dropdown](#dropdown)** +- **[Button](#button)** +- **[Text](#text)** +- **[Radio](#radio)** + +
    + +
    + +### Datepicker + +Properties that can be used in Datepicker schema are: + +```json + "datepicker1": { + "type": "datepicker", + "styles": { + "borderRadius": 5, + "disabled": false, + "visibility": "true" + }, + "value": "09/09/2023", + "disabledDates": ["08/09/2023"], + "enableTime": true, + "format": "DD/MM/YYYY", + "label": "Select a Date" + } +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'datepicker' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `borderRadius`, `disabled`, `visibility` etc. | +| borderRadius | Specifies the border radius of the component. | Numeric value like 5, 10, 20 etc. | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| value | Specifies the default date of the datepicker. | Any date in the format specified in the `format` key | +| disabledDates | Specifies the dates that you want to disable. | Provide the dates in an array that you want to disable | +| enableTime | Specifies whether to enable time or not. | set `true` to enable time or `false` to disable it | +| format | Specifies the format of the date. | 'DD/MM/YYYY' | +| label | Specifies the label of the component. | Any string value | + +
    + +
    + +### Number Input + +**Properties** + +```json +"numberInput1": { + "type": "number", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 3, + "textColor": "#025aa3", + "borderColor": "blue", + "disabled": false, + "visibility": "true" + }, + "value": 10, + "maxValue": 12, + "minValue": 6, + "placeholder": "Enter a Number", + "label": "Number Input" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'number' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `backgroundColor`, `borderRadius`, `textColor`, `borderColor`, `disabled`, `visibility` etc. | +| backgroundColor | Specifies the background color of the component. | Color name or Hex color code '#f6f5ff' | +| borderRadius | Specifies the border radius of the component. | Numeric value like 5, 10, 20 etc. | +| textColor | Specifies the text color of the component. | Color name or Hex color code '#f6f5ff'| +| borderColor | Specifies the border color of the component. | Color name or Hex color code '#f6f5ff'| +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| value | Specifies the default value of the number input. | Numeric value | +| maxValue | Specifies the maximum value of the number input. | Numeric value | +| minValue | Specifies the minimum value of the number input. | Numeric value | +| placeholder | Specifies the placeholder text of the number input. | Any string value | +| label | Specifies the label of the component. | Any string value | + +
    + +
    + +### Password + +**Properties** + +```json +"passwordInput1": { + "type": "password", + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "disabled": false, + "visibility": "true" + }, + "validation": { + "maxLength": 9, + "minLength": 5, + "regex": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$" + }, + "placeholder": "Enter Password", + "label": "Password" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'password' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `backgroundColor`, `borderRadius`, `disabled`, `visibility` etc. | +| backgroundColor | Specifies the background color of the component. | Color name or Hex color code '#f6f5ff' | +| borderRadius | Specifies the border radius of the component. | Numeric value like 10 | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| validation | Specifies validation rules for the password. | Object containing `maxLength`, `minLength`, and `regex` properties | +| maxLength | Specifies the maximum length of the password. | Numeric value like 9 | +| minLength | Specifies the minimum length of the password. | Numeric value like 5 | +| regex | Specifies the regular expression for password validation. | Regular expression pattern like `'^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{8,}$'` | +| placeholder | Specifies the placeholder text of the password input. | Any string value like 'Enter a password' | +| label | Specifies the label of the component. | Any string value (in this case, it's an empty string), to hide the label you can use whitespace within quotes `' '` | + +
    + +
    + +### Checkbox + +**Properties** + +```json +"checkbox1": { + "type": "checkbox", + "styles": { + "checkboxColor": "#025aa3", + "disabled": false, + "textColor": "#025aa3", + "visibility": "true" + }, + "value": false, + "label": "Checkbox" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'checkbox' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `checkboxColor`, `disabled`, `textColor`, `visibility` etc. | +| checkboxColor | Specifies the color of the checkbox. | Color name or Hex color code '#f6f5ff' | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| textColor | Specifies the text color of the component. | Color name or Hex color code '#f6f5ff' | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| value | Specifies the default value of the checkbox. | Boolean value (true or false) | +| label | Specifies the label of the component. | Any string value like 'Checkbox' | + +
    + +
    + +### Toggle + +**Properties** + +```json +"toggleswitch1": { + "type": "toggle", + "styles": { + "textColor": "#025aa3", + "disabled": false, + "visibility": "true", + "toggleSwitchColor": "#025aa3" + }, + "value": true, + "label": "Toggle switch" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'toggle' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `textColor`, `disabled`, `visibility`, `toggleSwitchColor` etc. | +| textColor | Specifies the text color of the component. | Color name or Hex color code '#f6f5ff' | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| toggleSwitchColor | Specifies the color of the toggle switch. | Color name or Hex color code '#f6f5ff' | +| value | Specifies the default value of the toggle switch. | Boolean value (true or false) | +| label | Specifies the label of the component. | Any string value like 'Toggle switch' | + +
    + +
    + +### Text Area + +**Properties** + +```json +"textArea1": { + "type": "textarea", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5 + }, + "value": "This is a text area", + "placeholder": "Enter Text Here", + "label": "Text Area" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'textarea' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `disabled`, `visibility`, `borderRadius` etc. | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| borderRadius | Specifies the border radius of the component. | Numeric value like 20 | +| value | Specifies the default value of the text area. | Any string value like 'This is a text area' | +| placeholder | Specifies the placeholder text of the text area. | Any string value like 'Enter text here' | +| label | Specifies the label of the component. | Any string value like 'Text Area' | + +
    + +
    + +### Date Range Picker + +**Properties** + +```json +"daterangepicker1": { + "type": "daterangepicker", + "styles": { + "disabled": true, + "visibility": "true", + "borderRadius": 5 + }, + "defaultEndDate": "12/04/2022", + "defaultStartDate": "1/04/2022", + "format": "DD/MM/YYYY", + "label": "Select a Date Range" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'daterangepicker' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `disabled`, `visibility`, `borderRadius` etc. | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| borderRadius | Specifies the border radius of the component. | Numeric value like 5 | +| defaultEndDate | Specifies the default end date of the date range picker. | Date in the format specified in the `format` key, e.g., '12/04/2022' | +| defaultStartDate | Specifies the default start date of the date range picker. | Date in the format specified in the `format` key, e.g., '1/04/2022' | +| format | Specifies the format of the date. | 'DD/MM/YYYY' | +| label | Specifies the label of the component. | Any string value like 'Select a date range' | + +
    + +
    + +### Multiselect + +**Properties** + +```json +"multiselect1": { + "type": "multiselect", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5 + }, + "displayValues": ["one", "two", "three"], + "label": "Select Options of Your Choice", + "value": [2, 3], + "values": [1, 2, 3], + "showAllOption": true +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'multiselect' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `disabled`, `visibility`, `borderRadius` etc. | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| borderRadius | Specifies the border radius of the component. | Numeric value like 5 | +| displayValues | Specifies the value for option labels in an array format. | Array of strings like `["one", "two", "three"]` | +| label | Specifies the label of the component. | Any string value like 'Select options of your choice' | +| value | Specifies the default value(s) in an array. | Array of values like `[2, 3]` | +| values | Specifies the values in an array. | Array of values like `[1, 2, 3]` | +| showAllOption | Specifies whether to show the 'All' option in the multiselect or not. | set `true` to show the 'All' option or `false` to hide it | + +
    + +
    + +### Star Rating + +**Properties** + +```json +"starRating1": { + "type": "starrating", + "styles": { + "disabled": false, + "visibility": "true", + "textColor": "gold", + "labelColor": "#025aa3" + }, + "allowHalfStar": true, + "defaultSelected": 3.5, + "maxRating": 5, + "tooltips": ["one", "two", "three", "four"], + "label": "Select a Rating" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'starrating' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `disabled`, `visibility`, `textColor`, `labelColor` etc. | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| textColor | Specifies the color of the stars. | Color name or Hex color code '#f6f5ff' | +| labelColor | Specifies the color of the label. | Color name or Hex color code '#f6f5ff' | +| allowHalfStar | Specifies whether to allow selection of half star rating or not. | set `true` to allow half-star ratings or `false` to disable it | +| defaultSelected | Specifies the default value of the star rating. | Numeric value like 4.5 | +| maxRating | Specifies the maximum rating. | Numeric value like 10 | +| tooltips | Specifies the tooltips for each star in an array. | Array of strings like `['one', 'two', 'three', 'four']` | +| label | Specifies the label of the component. | Any string value like 'Select a rating' | + +
    + +
    + +### File Picker + +**Properties** + +```json +"filepicker1": { + "type": "filepicker", + "styles": { + "visibility": "true", + "borderRadius": 10 + }, + "enableMultiple": true, + "fileType": "*/*", + "instructionText": "Click here to select files", + "maxFileCount": 5, + "maxSize": 6000000, + "minSize": 25, + "parseContent": true, + "parseFileType": "csv", + "label": "Select a File" +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'filepicker' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `visibility`, `borderRadius` etc. | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| borderRadius | Specifies the border radius of the component. | Numeric value like 10 | +| enableMultiple | Specifies whether to enable multiple file selection or not. | set `true` to enable multiple file selection or `false` to disable it | +| fileType | Specifies the mime file type. | Mime types like '*/*' (accepts all file types) | +| instructionText | Specifies the instruction text of the file picker. | Any string value like 'Click here to select files' | +| maxFileCount | Specifies the maximum number of files that can be selected. | Numeric value like 5 | +| maxSize | Specifies the maximum size of the file in bytes. | Numeric value like 6000000 (6MB) | +| minSize | Specifies the minimum size of the file in bytes. | Numeric value like 25 | +| parseContent | Specifies whether to parse the content of the file or not. | set `true` to parse the content or `false` to disable it | +| parseFileType | Specifies the file type to parse (e.g., csv, text, xlsx). | File type like 'csv' | +| label | Specifies the label of the component. | Any string value like 'Select a file' | + +
    + +
    + +### Text Input + +**Properties** + +```json +"textinput1": { + "type": "textinput", + "value": "John", + "placeholder": "Enter the Name Here", + "label": "First Name", + "validation": { + "maxLength": 6 + }, + "styles": { + "backgroundColor": "#f6f5ff", + "borderRadius": 5, + "errorTextColor": "#025aa3", + "disabled": false, + "visibility": false, + "textColor": "#025aa3" + } +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'textinput' | +| value | Specifies the default value of the text input. | Any string value like 'Random text' | +| placeholder | Specifies the placeholder text of the text input. | Any string value like 'enter first name here' | +| label | Specifies the label of the component. | Any string value like 'First name' | +| validation | Specifies validation rules for the text input. | Object containing `maxLength` property | +| maxLength | Specifies the maximum length validation of the text input. | Numeric value like 6 | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `backgroundColor`, `borderRadius`, `errorTextColor`, `disabled`, `visibility`, `textColor` etc. | +| backgroundColor | Specifies the background color of the component. | Color name or Hex color code '#f6f5ff' | +| borderRadius | Specifies the border radius of the component. | Numeric value like 20 | +| errorTextColor | Specifies the color of the error text. | Color name or Hex color code '#f6f5ff' | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `false` to hide the component or `true` to show it | +| textColor | Specifies the text color of the component. | Color name or Hex color code '#f6f5ff' | + +
    + +
    + +### Dropdown + +**Properties** + +```json +"dropdown1": { + "type": "dropdown", + "displayValues": ["One", "Two", "Three"], + "values": [1, 2, 3], + "loading": false, + "value": 2, + "label": "Select a Number", + "styles": { + "disabled": false, + "visibility": "true", + "borderRadius": 5, + "justifyContent": "start" + } +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'dropdown' | +| displayValues | Specifies the value for option labels in an array format. | Array of values like `[1, 2, 3]` | +| values | Specifies the option labels in an array. | Array of strings like `['one', 'two', 'three']` | +| loading | Specifies whether to show the loading state or not. | set `true` to show the loading state or `false` to hide it | +| value | Specifies the default selected value of the dropdown. | Any value from the `values` array, like 'two' | +| label | Specifies the label of the component. | Any string value like 'Select a number' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `disabled`, `visibility`, `borderRadius`, `justifyContent` etc. | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| borderRadius | Specifies the border radius of the component. | Numeric value like 5 | +| justifyContent | Specifies the alignment of the dropdown options. | 'start', 'center', or 'end' | + +
    + +
    + +### Button + +**Properties** + +```json +"button1": { + "type": "button", + "value": "Submit", + "label": "", + "styles": { + "backgroundColor": "#3A433B", + "textColor": "white", + "borderRadius": 5, + "borderColor": "#595959", + "loaderColor": "gray", + "visibility": "true", + "disabled": true + } +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'button' | +| value | Specifies the button text. | Any string value like 'Submit' | +| label | Specifies the label of the component. | Set to `''` (empty string) to hide the label | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `backgroundColor`, `textColor`, `borderRadius`, `borderColor`, `loaderColor`, `visibility`, `disabled` etc. | +| backgroundColor | Specifies the background color of the button. | Color name or Hex color code '#f6f5ff' | +| textColor | Specifies the text color of the button. | Color name or Hex color code '#f6f5ff' | +| borderRadius | Specifies the border radius of the button. | Numeric value like 5 | +| borderColor | Specifies the border color of the button. | Color name or Hex color code '#f6f5ff' | +| loaderColor | Specifies the color of the loader on the button. | Color name or Hex color code '#f6f5ff' | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | + +
    + +
    + +### Text + +**Properties** + +```json +"text1": { + "type": "text", + "value": "This is a text component", + "label": "", + "styles": { + "backgroundColor": "#f6f5ff", + "textColor": "#025aa3", + "fontSize": 12, + "fontWeight": 500 + } +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'text' | +| value | Specifies the value of the text component. | Any string value like 'This is a text component' | +| label | Specifies the label of the component. | Set to `''` (empty string) to hide the label | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `backgroundColor`, `textColor`, `fontSize`, `fontWeight` etc. | +| backgroundColor | Specifies the background color of the text. | Color name or Hex color code '#f6f5ff' | +| textColor | Specifies the text color of the text. | Color name or Hex color code '#f6f5ff' | +| fontSize | Specifies the font size of the text. | Numeric value like 24 | +| fontWeight | Specifies the font weight of the text. | Numeric value like 30 | + +
    + +
    + +### Radio + +**Properties** + +```json +"radioButton1": { + "type": "radio", + "styles": { + "textColor": "black", + "disabled": false, + "visibility": "true" + }, + "displayValues": ["Yes", "No"], + "label": "Radio Buttons", + "value": 1, + "values": [1, 2] +} +``` + +|
    Key
    |
    Description
    |
    Expected Value
    | +| :----------- | :----------- | :-----------| +| type | Specifies the type of component. | 'radio' | +| styles | Specifies the styles of the component. | Object that will contain the styles of the component like `textColor`, `disabled`, `visibility` etc. | +| textColor | Specifies the text color of the radio options. | Color name or Hex color code '#f6f5ff' | +| disabled | Specifies whether to disable the component or not. | set `true` to disable the component or `false` to enable it | +| visibility | Specifies whether to show the component or not. | set `'true'` to show the component or `'false'` to hide it | +| displayValues | Specifies the value for labels in an array format. | Array of strings like `['option 1', 'option 2', 'option 3']` | +| label | Specifies the label of the component. | Any string value like 'Radio Buttons' | +| value | Specifies the default selected value of the radio button. | Any value from the `values` array, like 2 | +| values | Specifies the values in an array. | Array of values like `[1, 2, 3]` | + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/html.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/html.md new file mode 100644 index 0000000000..b43f571a90 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/html.md @@ -0,0 +1,87 @@ +--- +id: html +title: HTML Viewer +--- + +**HTML** component can be used to create your own HTML-CSS layout. + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:------------|:-----------------| +| Raw HTML | The Raw HTML needs to be an HTML. In order to provide styles, one can add inline CSS to the respective HTML tags. | + +**Example:** + +```json + + + +
    +
    + You can build your custom HTML-CSS template here +
    +
    + + + +``` + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:--------------- |:--------------| :-------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    | +|:---------- | :------------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/icon.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/icon.md new file mode 100644 index 0000000000..f15183c2fc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/icon.md @@ -0,0 +1,91 @@ +--- +id: icon +title: Icon +--- + +An **Icon** component can be used to add icons(sourced from icon library). It supports events like on hover and on click. + +
    + +## Properties + +|
    Properties
    |
    Description
    |
    Expected Value
    | +| :----------------------------------------------- | :---------------------------------------------------------- | :---------------------------------------------------------- | +| Icon | Use this to choose an icon form the list of available icons. | You can also use the search bar in it to look for the icons. | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +| :------------------------------------------ | :----------------------------------------------------- | +| On hover | Triggers whenever the cursor is hovered over the icon. | +| On click | Triggers whenever the icon is clicked. | + +Just like any other event on ToolJet, you can set multiple handlers for any of the above-mentioned events. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of the component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :-------------------------------------------- | :------------------------------------------------ | :--------------------------------------------------- | +| setVisibility() | Sets visibility of the component. | Employ a RunJS query (for e.g., `await components.icon1.setVisibility(false)`) or trigger it using an event. | +| click() | Regulate the click on the icon. | Employ a RunJS query (for e.g., `await components.icon1.click()`) or trigger it using an event. | + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General + +Tooltip: Set a tooltip text to specify the information when the user moves the mouse pointer over the component. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Expected Value
    | +|:----------- |:----------- |:------------- | +| Icon color | You can change the color of the Icon component by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the component. | If `{{false}}` the component will not visible after the app is deployed. | It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Box shadow | This property adds a shadow to the component. | You can use different values for box shadow property like offsets, blur, spread, and the color code. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/iframe.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/iframe.md new file mode 100644 index 0000000000..522218bbd4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/iframe.md @@ -0,0 +1,74 @@ +--- +id: iframe +title: Iframe +--- + +# Iframe + +The **Iframe** component is used to embed another HTML page into the current one and display iframes in your app. + +
    + +## Properties + +|
    Property
    |
    Description
    | +| :--------------------------------------------- | :------------------------------------------------ | +| URL | Set the **URL** of the page to embed. | + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +| :------------------------------------------- | :------------------------------------------------ | :-------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Default Value
    | +| :------------------------------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/image.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/image.md new file mode 100644 index 0000000000..8bbbf25960 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/image.md @@ -0,0 +1,94 @@ +--- +id: image +title: Image +--- +# Image + +The **Image** component is used to display images in your app. + +
    + +## Properties + +|
    Properties
    |
    Description
    | +|:----------- |:----------- | +| URL | Enter the URL of the image to display it on the component. | +| Loading state | Loading state can be used to show a spinner as the image content. Loading state is commonly used with `isLoading` property of the queries to show a loading status while a query is being run. Switch the toggle **On** or click on **fx** to programmatically set the value `{{true}}` or `{{false}}`. | +| Alternative text | Used for alt text of images. | +| Zoom button | Toggle this to enable zoom options inside image. | +| Rotate button | Toggle this on to enable rotate button in the image. | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On click | Triggers whenever the user clicks on an image. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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** to set the value 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** to set the value and entering a logical expression. | + +
    + +--- + +
    + +## Styles + +|
    Style
    |
    Description
    | +|:--------- |:-------- | +| Border type | Choose a border type for the image from available options: **None**, **Rounded**, **Circle**, **Thumbnail**. | +| Image fit | Choose a image fit - similar to object fit for the image from available options: **fill**, **cover**, **contain**, **scale-down** | +| Background color | Add a background color to component by providing the `HEX color code` or choosing the color of your choice from the color-picker. | +| Padding | Adds padding between the image and component border. It accepts any numerical value from `0` to `100`. | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/kanban-board.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/kanban-board.md new file mode 100644 index 0000000000..5342f3933f --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/kanban-board.md @@ -0,0 +1,142 @@ +--- +id: kanban +title: Kanban +--- + +The **Kanban** component allows you to visually organize and prioritize your tasks with a transparent workflow. You can set the number of columns to display, enable/disable the add cards button, and bind data to the cards. + +:::info Restricted components +Certain components are restricted from being placed within the **Card** and **Popout** of the **Kanban** component. + +- **Card**: Calendar, Kanban, Form, Tabs, Modal, ListView, Container +- **Popout**: Calendar, Kanban + ::: + +
    + +## Setting Card Data + +To dynamically populate Kanban cards, you can use the `cardData` key. + +For instance, you can set the `Data` property of a Text component on a card using the below code: + +```js +{{cardData.title}} +// Replace title with the key in your data +``` + +
    + +
    + +## Properties + +:::info + +- It is mandatory to provide an `id` for each column in the `column data` field. The `id` can be of type `string` or `number`. +- It is mandatory to provide an `id` and a `columnId` for each card in the `Card data` field. Both `id` and `columnId` can be of type `string` or `number`. + ::: + +|
    Properties
    |
    Description
    |
    Expected Value
    | +| :---------------- | :------------------------ | :---------------------------- | +| Column data | Enter the columns data - `id` and `title` in the form of array of objects or from a query that returns an array of objects. | `{{[{ "id": "c1", "title": "to do" },{ "id": "c2", "title": "in progress" },{ "id": "c3", "title": "Completed" }]}}` or `{{queries.xyz.data}}`. | +| Card data | Enter the cards data - `id`, `title` and `columnId` in the form of array of objects or from a query that returns an array of objects. | `{{[{ id: "r1", title: "Title 1", description: "Description 1", columnId: "c1" },{ id: "r2", title: "Title 2", description: "Description 2", columnId: "c2" },{ id: "r3", title: "Title 3", description: "Description 3",columnId: "c3" }]}}` or `{{queries.abc.data}}`. | +| Card width | Set the width of the card. | This property expects a numerical value. By default, the value is set to `{{302}}`. | +| Card height | Set the width of the card. | This property expects a numerical value. By default, the value is set to `{{100}}`. | +| Enable add card | This property allows you to show or hide the **+Add Cards** button on the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the **fx** next to it. | +| Show delete button | This property allows you to show or hide the **Drop here to delete cards** section at the bottom of the Kanban. | By default its enabled, you can programmatically set value to `{{true}}` or `{{false}}` to enable/disable button by clicking on the **fx** next to it. | + +
    + +
    + +## Events + +To add an event, click on the component handle to open the component properties on the right sidebar. Go to the **Events** section and click on **Add handler**. + +|
    Event
    |
    Description
    | +| :-------------------| :----------------| +| On Update | On update event is triggered whenever the card data (id, title, description, or columnID) is updated using the component specific actions. | +| On add card click | This event is triggered whenever the **Add card** button on the Kanban is clicked. | +| Card removed | This event is triggered whenever the card is **deleted** from the Kanban by dragging it into the bottom delete box or using component specific action. | +| Card added | This event is triggered whenever a card is **added** on the Kanban using the component specific action. | +| Card moved | This event is triggered whenever the card's position is changed on the Kanban or using the component specific action. | +| Card selected | This event is triggered whenever a card is clicked to open the modal. | + +Just like any other event on ToolJet, you can set multiple handlers for any of the above mentioned events. + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. + +Check the **[Component Specific Action](#component-specific-actions-csa)** available for Kanban. +::: + +
    + +
    + +## Exposed Variables + +|
    Variable
    |
    Description
    |
    How To Access
    | +| :------------- | :----------------- | :---------------- | +| updatedCardData | The `updatedCardData` variable will hold the latest values of all the cards in the Kanban. This variable won't have any values. | It will have values only when any action on any of the card is performed like when the card is moved, added, deleted, or updated. | +| lastAddedCard | The variable `lastAddedCard` holds the values of the last added card. It holds the following data - `id`, `title`, `description` and `columnId` of the last added card. | Get the values using `{{components.kanban1.lastAddedCard.title}}`. | +| lastRemovedCard | The variable `lastRemovedCard` holds the properties of the card that has been recently deleted from the Kanban. It holds the following data - `id`, `title`, `description` and `columnId` of the recently deleted card. | Get the values using `{{components.kanbanboard1.lastRemovedCard.title}}`. | +| lastCardMovement | The variable `lastCardMovement` holds the properties of the card that has been recently moved from its original position. It holds the following data - `originColumnId`, `destinationColumnId`, `originCardIndex`, `destinationCardIndex` and an object `cardDetails` which includes `id`, `title`, `description` and `columnId` of the moved card. | Get the values using `{{components.kanbanboard1.lastCardMovement.cardDetails.title}}` or `{{components.kanbanboard1.lastCardMovement.destinationCardIndex}}`. | +| lastSelectedCard | The variable `lastSelectedCard` holds the `id`, `title`, `columnId`, and `description` of the last selected(clicked to view) card on the Kanban. | Get the values using `{{components.kanban1.lastSelectedCard.columnId}}`. | +| lastUpdatedCard | The variable `lastUpdatedCard` holds the `id`, `title`, `description`, and `columnId` of the last updated card(using component specific action). | Get the values using `{{components.kanban1.lastUpdatedCard.columnId}}`. | +| lastCardUpdate | The variable `lastCardUpdate` holds the old an new values of the property that has been changed in the card(using component specific action). | Get the values using `{{components.kanban1.lastCardUpdate[0].title.oldValue}}`. | + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Kanban component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :-------------- | :----------------- | :--------------- | +| updateCardData | Update the card data of Kanban component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `components.kanban1.updateCardData('c1', {title: 'New Title'})`. | +| moveCard | Move a card from one column to other column on the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.moveCard('card id,'column id')` ex: `await components.kanban1.moveCard('c1','r2')`. | +| addCard | Add a card onto the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.addCard('c1', {title: 'New Title'})`. | +| deleteCard | Delete a card from the kanban via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.kanban1.deleteCard('card id')` ex: `await components.kanban1.deleteCard('c2')`. | + +
    + +
    + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +---- + +
    + +## Styles + +|
    Style
    |
    Description
    | +| :------------- | :------------------ | +| Disable | If disabled or set to `{{false}}` the component will be locked and becomes non-functional. By default, its disabled i.e. its value is set to `{{true}}`. | +| Visibility | This is to control the visibility of the component. If `{{false}}`/disabled the component will not visible after the app is deployed. By default, it's enabled (set to `{{true}}`). | +| Accent color | You can change the accent color of the column title by entering the Hex color code or choosing a color of your choice from the color picker. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/link.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/link.md new file mode 100644 index 0000000000..ab2718e981 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/link.md @@ -0,0 +1,94 @@ +--- +id: link +title: Link +--- + +The **Link** component allows you to add a hyperlink and navigate to the external URL. + +
    + +## Properties + +|
    Properties
    |
    Description
    |
    Expected Value
    | +|:----------- |:----------- |:-------------- | +| Link target | This property sets the URL where the user needs to be taken on clicking the link. | example: `https://dev.to/tooljet` or `{{queries.xyz.data.url}}`. | +| Link text | This property sets the text for the Link component. | example: **Click here** or **Open webpage**. | +| Target type | This property specifies the link to be opened in the same tab or new tab on clicking the link. | Options: **New Tab** & **Same Tab**. | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On click | Triggered when the link is clicked. | +| On hover | Triggered when the cursor hovers over the link. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +The following actions of the link component can be controlled using the component-specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:------------ | +| click | Triggers click action of the link component. | Employ a RunJS query to execute component-specific actions such as `await components.link1.click()` or trigger it using an event. | + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the **General** accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +---- + +
    + +## Styles + +|
    Style
    |
    Description
    | +|:----------- |:----------- | +| Text color | You can change the background color of the text by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text size | By default, the text size is set to 14. You can enter any value from 1-100 to set a custom text size. | +| Underline | You can change the underline of the text in the following ways: **on-hover (default), never, always**. | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/listview.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/listview.md new file mode 100644 index 0000000000..74505d4fcb --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/listview.md @@ -0,0 +1,225 @@ +--- +id: listview +title: List View +--- +# List View + +The **List View** component allows to create a list of repeatable rows of data. Just like the Container component, you can nest other components inside of it and control how many times they repeat. + + +:::caution Restricted components +Certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the List View component using drag-and-drop functionality. +::: + +
    + +## Setting List Data + +To dynamically populate List View components, you can use specific data properties. + +Consider this data being passed inside a List View component's `List data` property: + +```js +{{[ + { imageURL: 'https://www.svgrepo.com/show/34217/image.svg', text: 'Sample text 1', buttonText: 'Button 1' }, + { imageURL: 'https://www.svgrepo.com/show/34217/image.svg', text: 'Sample text 1', buttonText: 'Button 2' }, + { imageURL: 'https://www.svgrepo.com/show/34217/image.svg', text: 'Sample text 1', buttonText: 'Button 3' }, +]}} +``` + +Based on the above data, you can set the `Data` property of a Text component inside List View using the below code: + +```js +{{listItem.text}} +``` + +Similarly, for an Image component inside List View, you can use the below code to pass the `imageURL` value: + +```js +{{listItem.imageURL}} +``` + +
    + +
    + +## Properties + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---|:---|:---| +| List data | The data that you want to display in the List View component. This can be an array of objects or data from a query that returns an array of objects. | An array of objects or a query that returns an array of objects. | +| Mode | The layout of the List View component. You can choose between `List` and `Grid` mode. | `list` or `grid` | +| Show bottom border | Whether to show or hide the bottom border on a row. This option is only available when the **Mode** is set to `List`. | `true` or `false` | +| Columns | The number of columns in the List View component. This option is only available when the **Mode** is set to `Grid`. | Any numerical value | +| Row height | The height of each row in the List View component. | Any number between 1 and 100 | +| Enable pagination | Whether to enable pagination. If enabled, you can set the number of rows per page. | `true` or `false` | +| Rows per page | The number of rows per page. This option is only available when **Enable pagination** is enabled. | Any numerical value | + +
    + +
    + +## Events + +To attach an event handler to the List View component, follow these steps: +1. Click on the component handle to open its properties on the right sidebar. +2. Navigate to the **Events** section. +3. Click on the **+Add handler** button. + +There are two events that you can use with the List View component: +- **[Row clicked (Deprecated)](#row-clicked)** +- **[Record clicked](#record-clicked)** + +### Row clicked + +The **Row clicked** event is triggered when any row inside the List View is clicked. Similar to other events in ToolJet, you can define multiple actions for this event. + +When a row is clicked in the List View component, certain related data is made available through the **selectedRowId** and **selectedRow** variables. For the List View component's available exposed variables, refer to the **[here](#exposed-variables)** section. + +:::warning +The Row clicked event is being deprecated, so it is recommended to use the **Record Clicked** event instead. +::: + +### Record clicked + +The **Record clicked** event is similar to the row click event, as it is triggered whenever an interaction is made with a record in the component. + +When a record is clicked in the List View component, relevant data is exposed through the **selectedRecordId** and **selectedRecord** variables. For the List View component's available exposed variables, refer to the **[here](#exposed-variables)** section. + +:::info +To get detailed information about all the **Actions**, please consult the [Action Reference](/docs/category/actions-reference) documentation. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:-------- | +| data | This variable stores the data loaded into the List View component. | Retrieve the data of each record in the list view using `{{components.listview1.data["0"].text1.text}}` | +| selectedRowId (deprecated) | This variable holds the ID of the clicked row in the list view. The row ID starts from `0`. | Access the selectedRowId using `{{components.listview1.selectedRowId}}` | +| selectedRow (deprecated) | This variable contains the data of the components within the selected row. | Access the data using `{{components.listview1.selectedRow.text1}}` | +| selectedRecordId | This variable holds the ID of the clicked record in the list view. The record ID starts from `0`. | Access the selectedRecordId using `{{components.listview1.selectedRecordId}}` | +| selectedRecord | This variable stores the data of the components within the selected record. | Access the data using `{{components.listview1.selectedRecord.text1}}` | +| children | This variable stores the data of the components within all the records in listview component. | The purpose of exposing children is to enable the child components to be [controlled using component specific actions](#controlling-child-components). | + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    | +|:----------- |:----------- | +| Background color | You can change the background color of the component by entering the Hex color code or choosing a color of your choice from the color picker. | +| Border color | You can change the border color of the listview by entering the `Hex color code` or choosing a color of your choice from the color picker. | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not be visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Border radius | Use this property to modify the border radius of the list view. The field expects only numerical value from `1` to `100`, default is `0`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    + +
    + +## Example: Displaying Data in the List View + +- Let's start by creating a new app and then dragging the List View component onto the canvas. + +
    + + ToolJet - List view component + +
    + +- Now lets create a query and select the REST API from the datasource dropdown. Choose the `GET` method and enter the API endpoint - `https://reqres.in/api/users?page=1`. Save this query and fire it. Inspect the query results from the left sidebar, you'll see that it resulted in the `data` object having an array of objects. + +
    + + ToolJet - List view component + +
    + + +- Now lets edit the `List data` property of the List View component for displaying the query data. We will use JS to get the data from the query - `{{queries.restapi1.data.data}}`. Here the last `data` is a data object that includes an array of objects, the first `data` is the data resulted from the `restapi1` query. This will automatically create the rows in the component using the data. + +
    + + ToolJet - List view component + +
    + + +- Finally, we will need to nest components into the first row of List View component and the component will automatically create the subsequent instances. The subsequent rows will appear the same way you'll display the data in the first row. + +
    + + ToolJet - List view component + +
    + + +:::tip + +Use `{{listItem.key}}` to display data on the nested components. Example: For displaying the images we used `{{listItem.avatar}}` where **avatar** is one of the key in the objects from the query result. + +::: + +
    + +
    + +## Controlling Child Components + +All the child components of the List View component are exposed through the `children` variable. This variable is an array of objects, where each object represents a record in the listview and contains the data of the child components. + +The components inside the list view can be controlled using the javascript queries. For example, if you want to disable the `button1` component in the first record, you can use the following expression: + +```js +components.listview1.children[0].button1.disable(true) // disables the button1 component in the first record +``` + +
    + +:::caution +Currently, only those child components can be controlled using the javascript queries that have component specific actions implemented. To check if a component has component specific actions implemented, refer to the document of that **[specific component](/docs/widgets/overview)**. +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/map.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/map.md new file mode 100644 index 0000000000..877c32ab55 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/map.md @@ -0,0 +1,113 @@ +--- +id: map +title: Map +--- + +The **Map** component enables users to display a map on the app. It can be used to display or choose a single location or multiple locations on the map. The Map component can be used to display the location of a business, a store, or a restaurant. It can also be used to display the location of a user on the map. It allows users to interact with the map interface and pick specific points of interest. + +:::tip Using Self-hosted +If you are utilizing the self-hosted version of ToolJet, it is necessary to configure the Google Maps API key as an environment variable. Please refer to the [environment variable setup documentation](/docs/setup/env-vars/#google-maps-configuration--optional-). +::: + +
    + +ToolJet - Component Reference - Map + +
    + +
    + +## Properties + +|
    Properties
    |
    Description
    |
    Expected Value
    | +|:----------- |:----------- |:------------------ | +| Initial location | default location when the app is loaded initially. | An object containing the **latitude** and **longitude** as key value pairs. ex: `{{ {"lat": 40.7128, "lng": -73.935242} }}`. | +| Default markers | Number of markers that should be shown on the map. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}`. | +| Polygon points | Create a polygon on the map using the given coordinates. | An array of objects containing the coordinates. ex: `{{ [{"lat": 40.7128, "lng": -73.935242}, {"lat": 40.7128, "lng": -73.935242}] }}`. | +| Add new markers | On clicking the map, a new marker will be added to the map. | By default, it's set to `On`. Toggle `off` to disable adding new markers on the map. Click **fx** to set `{{true}}` or `{{false}}` programmatically. | +| Search for places | Enable to show the search box on the map. | By default, it's set to `On`. Toggle `off` to disable the search box on the map. Click **fx** to set `{{true}}` or `{{false}}` programmatically. | + +
    + +
    + +## Events + +|
    Event Name
    |
    Description
    | +|:----------------- | :--------------------------------------------- | +| On bounds change | Triggers when the bounding area is modified. This event occurs after the `bounds` variable changes. | +| On create marker | Triggers when a new marker is added to the map. | +| On marker click | Triggers when the user clicks on any of the markers on the map. | +| On polygon click | Triggers when the user clicks on the polygon on the map. | + +:::info +For detailed information about all the available **Actions**, please refer to the [Action Reference](/docs/category/actions-reference) documentation. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Map component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +|:---------- |:---------- |:------- | +| setLocation | Set the marker's location on map using latitude and longitude values as parameters via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as: `component.map1.setLocation(40.7128, -73.935242)`. | + +
    + +
    + +## Exposed Variables + +Exposed variables can be used to get data from the component. + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| center | This variable will hold the latitude, longitude and the google map url value. | +| center.`lat` | This variable holds the latitude value of the marker on the Map component. | Access the value dynamically using JS: `{{components.map1.center.lat}}`. | +| center.`lng` | This variable gets updated with RGB color code whenever a user selects a color from the color picker. | Access the value dynamically using JS: `{{components.map1.center.lng}}`. | +| center.`googleMapUrl` | This variable holds the URL of the location where the center marker is placed on the Map component. | Access the value dynamically using JS: `{{components.map1.center.googleMapUrl}}`. | +| markers | The markers variable will hold the value only if `add new markers` is enabled from the map properties. Each marker is an object and will have `lat` and `lng` keys. | Access the values dynamically using `{{components.map1.markers[1].lat}}`. | +| selectedMarker | Object with the marker selected by the user. | +| bounds | It constructs a rectangle from the points at its south-west and north-east corners. | +| bounds.northEast | It holds the latitude and longitude of the north-east corner of the rectangle.| Access the value dynamically using JS: `{{components.map1.bounds.northEast.lat}}` or `{{components.map1.bounds.northEast.lng}}`. | +| bounds.southWest | It holds the latitude and longitude of the south-west corner of the rectangle. | Access the value dynamically using JS: `{{components.map1.bounds.southWest.lat}}` or `{{components.map1.bounds.southWest.lng}}`. | + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify the extra information when the user hovers the mouse pointer over the component. Once a value is set for Tooltip, hovering over the element will display the specified string as the tooltip text. + +
    + +
    + +## 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. | + +
    + +
    + +---- + +## Styles + +|
    Properties
    |
    Description
    |
    Expected Value
    | +|:----------- |:----------- |:------------------ | +| Visibility | Toggle on or off to control the visibility of the component. | You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is release. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. | You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Box shadow | Add a shadow effect to the component by providing values to X, Y, Blur, Spread and Color. | You can also programmatically set the value by clicking on the **fx** button next to it. Ex: `{{"x": 0, "y": 0, "blur": 0, "spread": 0, "color": "#000000"}}`. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/modal.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/modal.md new file mode 100644 index 0000000000..994ed196b1 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/modal.md @@ -0,0 +1,120 @@ +--- +id: modal +title: Modal +--- +# Modal + +The **Modal** widget renders in front of a backdrop, and it blocks interaction with the rest of the application until the modal is closed. It can be used to add dialog boxes to your app for lightboxes, user notifications, forms, etc. + +:::caution Restricted components +In order to avoid excessively complex situations, certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the Modal component using drag-and-drop functionality. + +If the builder attempts to add any of the aforementioned components inside the Modal, an error message will be displayed: + +` cannot be used as a child component within the Modal.` +::: + +
    + +## Add Widgets to Modal + +To add widgets to the Modals please refer to **[Tutorial - Adding widgets to a modal](/docs/tutorial/adding-widget#adding-widgets-to-modal)** + +
    + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:----------- |:----------- | +| Title | Title that should be shown on the header of the modal. | +| Loading state | Loading state can be used to show a spinner on the modal content. Loading state is commonly used with isLoading property of the queries to show a loading status while a query is being run. Enable the toggle **On** or click on `fx` to programmatically set the value `{{true}}` or `{{false}}` . | +| Hide title bar | Enabling this option hides the title bar in the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. | +| Hide close button | By enabling this option, the close button within the modal will be hidden. The value can be programmatically set to either `{{true}}` or `{{false}}` by clicking the adjacent `Fx` button. | +| Close on escape key | Enabling this option will cause the modal to close whenever the escape key is pressed. The value can be programmatically set to either `{{true}}` or `{{false}}` by clicking the adjacent `Fx` button. This property is enabled by default. | +| Close on outside click | Enabling this feature will result in the modal closing when clicked outside of its boundaries. The value can be programmatically set to either `{{true}}` or `{{false}}` by clicking the adjacent `Fx` button. | +| Modal size | Determines the size of the modal. Available options include `medium`, `small`, and `large`, with the default set to `medium`. The value can also be programmatically configured by clicking the `Fx` button and setting it to `sm`, `md`, or `lg`. | +| Modal height | Specifies the height of the modal, with the default height set to `400px`. The modal's height can also be dynamically set using JS binding by utilizing the `{{components.xyz.data.key === 'Sun' ?? '600px' : '300px'}}` syntax. | + +
    + +
    + +## Events + +Modal supports the following two events: +- **On open** +- **On close** + +:::info +Just like any other event on ToolJet, you can set multiple handlers for the events supported by Modal. Check all the [actions here](/docs/category/actions-reference). +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Modal component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| open | Control the opening and closing of the Modal component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.modal1.open()` | +| close | Control the closing of the Modal component via a component-specific action within any event handler.| Employ a RunJS query to execute component-specific actions such as `await components.modal1.close()` | + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## Options + +|
    Option
    |
    Description
    | +|:----------- |:----------- | +| Use default trigger button | The default trigger button is enabled by default, this button can be used to show the modal. The value `{{true}}` or `{{false}}` can be set programmatically by clicking on the `Fx` button next to it. | +| Trigger button label | It can be used to set the label of the trigger button. | + +:::info +A modal can be triggered using the default trigger button, [action](/docs/actions/show-modal) or via [JavaScript](/docs/how-to/run-actions-from-runjs#show-modal). +::: + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on `Fx` to set the value `{{true}}` or `{{false}}` | + +
    + +
    + +## Styles + +|
    Style
    |
    Description
    |
    Value
    | +|:----------- |:----------- |:------ | +| Header background color | Change the background color of the header in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Header title color | Change the color of the Title in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Body background color | Change the background color of the body in modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Visibility | Toggle on or off to control the visibility of the default trigger button that comes with modal | You can programmatically change its value by clicking on the `Fx` button next to it. If `{{false}}` the button will not visible after the app is released. By default, it's set to `{{true}}`. | +| Disable | Toggle on to disable the default trigger button that comes with modal | You can programmatically change its value by clicking on the `Fx` button next to it, if set to `{{true}}`, the button will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | +| Trigger button background color | Change the background color of the default trigger button of modal | Enter the Hex color code or choose a color of your choice from the color picker | +| Trigger button text color | Change the color of the label in default trigger button of modal | Enter the Hex color code or choose a color of your choice from the color picker | + +:::info +Trigger Button styles are only visible when **Use default trigger button** under Options is toggled on. +::: +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/multiselect.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/multiselect.md new file mode 100644 index 0000000000..b2d576555e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/multiselect.md @@ -0,0 +1,162 @@ +--- +id: multiselect +title: Multiselect +--- +# Multiselect + +The Multiselect component enables users to select multiple options from a predefined list, making it ideal for gathering multiple inputs. + +## Data + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the component. | String (e.g., `Select an option`). | +| Placeholder | Text to display when none of the options are selected. | String (e.g., `Select the loan type`). | + + +## Options +Allows you to add options to the multiselect component field. You can click on `Add new option` and add options manually or enable `Dynamic options` and enter the options using code. + +### Example Code for Dynamic Columns + +1. Passing an array of objects and specifying each value: + +```js +{{ + [{label: 'option1', value: 1, disable: false, visible: true, default: true}, + {label: 'option2', value: 2, disable: false, visible: true}, + {label: 'option3', value: 3, disable: false, visible: true}] +}} +``` + +2. Passing an array of objects with a default value from a **Table** component's selected row: + +```js +{{ + queries.getEmployees.data.map(option => ({ + label: option.firstname, + value: option.firstname, + disable: false, + visible: true, + default: option.firstname === components.table1.selectedRow.firstname + })) +}} +``` + +### Options loading state +Allows you to add a loading state to the dynamically generated options. You can enable or disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. + +## Component specific actions (CSA) + +Following actions of the component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| clear() | Clears the selected option. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.setDisable(true)`) or trigger it using an event. | +| selectOptions() | Selects an option. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.selectOptions(['2','3'])`) or trigger it using an event. | +| deselectOptions() | Deselects all options. | Employ a RunJS query (for e.g.,
    `await components.multiselect1.deselectOptions()`) or trigger it using an event. | + +**Note:** The data type passed to CSAs like `selectOptions()` depends on how you configure the component. When adding options manually using the **Add new option** button, values must be strings (for example, `components.multiselect1.selectOptions(['2', '3'])`). When using dynamic options, supply values with the correct data types as they appear in your code logic. + +For example, if the code is: +```javascript +{{ + [ + { label: 'option1', value: 1, disable: false, visible: true, default: true }, + { label: 'option2', value: 2, disable: false, visible: true }, + { label: 'option3', value: 3, disable: false, visible: true } + ] +}} +``` + +You should pass numeric values in the `selectOptions` component-specific action since the value type is **Number**: + +```javascript +components.multiselect1.selectOptions([2, 3]) +``` + +## Exposed Variables + +|
    Variable
    |
    Description
    |
    How To Access
    | +|:----------|:----------|:------------| +| label | Holds the label name of the multiselect component. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.label}}`). | +| value | Holds the value selected by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.value}}`). | +| options | Holds all the option values of the multiselect component in array form. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.options}}` or
    `{{components.multiselect1.options[0].label}}` for a specific option). | +| isValid | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isValid}}`). | +| isMandatory | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isMandatory}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isLoading}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isVisible}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.multiselect1.isDisabled}}`). | + +## Events + +|
    Event
    |
    Description
    | +|:----------------- | :--------------------------------------------- | +| On select | The **On select** event is triggered when a particular option is chosen. | + +:::info +For comprehensive information on all available **Actions**, refer to the [Action Reference](/docs/category/actions-reference) documentation. +::: + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no option is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{!components.multiselect1.value && "Please select an option"}}`). | + +## 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 (e.g., `Select an option.` ). | + +
    + +## 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. | + +
    + +--- + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | + +## Field + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Accent | Sets the color of the border when the dropdown is opened. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Error text | Sets the text color of validation message that displays. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color | +| 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. | + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. + + + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/number-input.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/number-input.md new file mode 100644 index 0000000000..36d62dfc68 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/number-input.md @@ -0,0 +1,160 @@ +--- +id: number-input +title: Number Input +--- + +The **Number Input** component allows users to enter numeric values. It can be used as a standalone component or in form fields. In this document, we'll go through all the configuration options for the **Number Input** component. + +
    + +## Properties + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the field. | String (e.g., `Age`). | +| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `John Doe`). | +| Default value | The default value that the component will hold when the app is loaded. | String (e.g., `Default Text`). | +| Decimal places | Specifies the number of decimal places for numerical values. | Integer (e.g., `2`). | + +
    + +
    + +## Events + +| Event | Description | +|:------------------|:---------------------| +| On change | Triggers whenever the user types something in the input field. | +| On focus | Triggers whenever the user clicks inside the input field. | +| On blur | Triggers whenever the user clicks outside the input field. | +| On enter pressed | Triggers whenever the user presses the enter button on the keyboard after entering some text in the input field. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| setText() | Sets the value of the input field. | Employ a RunJS query (for e.g.,
    `await components.numberinput1.setText(1)`) or trigger it using an event. | +| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.numberinput1.clear()`) or trigger it using an event. | +| setFocus() | Sets the focus of the cursor on the input field. | Employ a RunJS query (for e.g.,
    `await components.numberinput1.setFocus()`) or trigger it using an event. | +| setBlur() | Removes the focus of the cursor from the input field. | Employ a RunJS query (for e.g.,
    `await components.numberinput1.setBlur()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.numberinput1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.numberinput1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.numberinput1.setDisable(true)`) or trigger it using an event. | + +:::info +Check the **component specific actions** available for this component **[here](/docs/actions/control-component)**. +::: + +
    + +
    + +## Exposed Variables + +| Variable | Description | How To Access | +|:-------- |:----------- |:------------ | +|
    value
    | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.numberinput1.value}}`).| +|
    label
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.numberinput1.label}}`).| +|
    isValid
    | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.numberinput1.isValid}}`).| +|
    isMandatory
    | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.numberinput1.isMandatory}}`).| +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.numberinput1.isLoading}}`).| +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.numberinput1.isVisible}}`).| +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.numberinput1.isDisabled}}`).| + +
    + +
    + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Regex | Regular Expression to validate the input. | Regular Expression Pattern (e.g., `^\d{10}$`). | +| Min value | Sets the minimum value allowed. | Integer (e.g., `10` for a minimum value of 10). | +| Max value | Sets the maximum value allowed. | Integer (e.g., `1000` for a maximum value of 1000).| +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.numberinput1.value<5&&"Value needs to be more than 5"}}`). | + +To add regex inside `Custom Validation`, you can use the below format: + +**Format**: `{{(.test()) ? '' : 'Error message';}}` + +**Example**: `{{(/^\d{1,10}$/.test(components.numberinput1.value)) ? '' : 'Error message';}}` + +
    + +
    + +## 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 (e.g., `Enter your age here.` ). | + +
    + +
    + +## 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. | + +
    + +--- + +# Styles + +
    + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Text | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | + +
    + +
    + +## Field + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the color of the number entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Error text| Sets the text color of validation message that displays. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can programmatically set it using **fx**. | +| 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**. | + + +
    + +
    + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/overview.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/overview.md new file mode 100644 index 0000000000..83e8375321 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/overview.md @@ -0,0 +1,138 @@ +--- +id: overview +title: Overview +--- + +# Components: Overview + +Components are used to build the user interface(UI) of the applications. They can be dragged onto the canvas from the **Component Library** and can be modified from the **Properties Panel** without needing to write any code. **[Event Handlers](/docs/widgets/overview#component-event-handlers)** in Components allow end users to trigger queries and other application events to perform the **[Actions](/docs/category/actions-reference)**. + +
    + +## Adding Components + +Components can be dragged and dropped from the **Component Library**(from the right side on app builder) on to the canvas. You can reposition components by clicking and dragging them around the canvas. To resize a component, drag its edges or borders. + +
    + +Components: Overview + +
    + +
    + +
    + +### Select Multiple Components + +You can use **Shift+Click** to select and group multiple components together. Once grouped, the components can be moved around the canvas while maintaining their relative positions. + +
    + +Components: Overview + +
    + +You can also create a selection rectangle to select and move multiple components together by clicking and dragging. + +
    + +Components: Overview + +
    + +:::tip +You can also use many other **[Keyboard Shortcuts](/docs/tutorial/keyboard-shortcuts)** in ToolJet to copy, cut, and paste components onto the canvas. +::: + +
    + +
    + +## Component Properties + +Components can be customized and styled using the **Properties Panel** such as the data field, a toggle for disabling the component, or styling like a background color. Properties can be modified directly or programmatically by using **[Bindings](/docs/widgets/overview/#bindings)**, which enables you to write JavaScript code. + +
    + +
    + +## Component Event Handlers + +Event Handlers can be found in the Component's **Property Panel** or in the **Advanced** section of the Query. Event handlers can be used to trigger **[Actions](/docs/category/actions-reference)** such as executing the queries, performing Component Specific Actions(CSA) or for setting a variable. + +Event handlers for components have the following properties: + +1. **Event**: Each component has its own set of exclusive events. You can refer to the component reference to find the specific events available for each component. These events are triggered by user interactions or other actions within the application. + +2. **Action**: Actions are the operations that can be performed when an event is triggered. There is a comprehensive list of available actions, which can be found in the **[actions reference documentation](/docs/category/actions-reference)**. In addition to general actions, each component may also have its own set of **Component Specific Actions (CSA)** that are specific to that particular component. The CSA can be found in the respective component reference. + +3. **Run Only If**: This property allows you to define a condition that must be satisfied before the event handler's action is executed. By specifying a condition, you can control the flow of execution and ensure that the action is only performed when the condition is met. + +
    + +Event Handler + +
    + +
    + +
    + +### Using Run only if + +With this option in Event Handlers, users can specify a condition that must be met before the event handler's action is executed. This allows for more fine-grained control over when certain actions should be triggered in response to component events. + +For example, let's consider a button component with an `OnClick` event handler. By specifying a **Run Only If** condition for the event handler, users can control when the associated action should be executed. Here's an example: + +```javascript +Button Component + └─ OnClick Event Handler: runQuery() + │ + ├─ Run Only If: expression/condition +``` + +In this case, the action `runQuery()` will only be triggered if the `expression/condition` evaluates to a true/truthy value. The `expression/condition` can utilize the values dynamically from other parts of the application or exposed variables. + +**Example expressions:** + +```js +{{globals.currentUser.groups[1] === 'admin'}} // returns true if the current user is admin + +or + +{{components.form1.isValid}} // isValid holds the boolean value true or false +``` + +
    + +Components: Run only if + +
    + +
    + +
    + +## Bindings + +Bindings allow you to get dynamic data into the components. Anything inside of **`{{}}`** is evaluated as a JavaScript expression in ToolJet. + +Any arbitrary JavaScript code can be written inside **`{{}}`**: + +```js +{{(function () { + + })() +}} + +// or + +{{components.xyz.data.key === Sun ?? true : false}} +``` + +:::tip +Check out the How-to guides like **[changing color of text in table column](/docs/how-to/access-cellvalue-rowdata)**, **[Enable/Disable a component using JavaScript](/docs/how-to/access-currentuser)**, and more. +::: + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/package-lock.json b/docs/versioned_docs/version-3.0.0-LTS/widgets/package-lock.json new file mode 100644 index 0000000000..624508d7dc --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/package-lock.json @@ -0,0 +1,32216 @@ +{ + "name": "docs", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "version": "0.0.0", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "^2.0.0-alpha.73", + "@docusaurus/preset-classic": "2.0.0-alpha.73", + "@mdx-js/react": "^1.6.21", + "clsx": "^1.1.1", + "react": "^17.0.1", + "react-dom": "^17.0.1" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz", + "integrity": "sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw==", + "dependencies": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz", + "integrity": "sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q==", + "dependencies": { + "@algolia/autocomplete-shared": "1.2.2" + }, + "peerDependencies": { + "@algolia/client-search": "^4.9.1", + "algoliasearch": "^4.9.1" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz", + "integrity": "sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw==" + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.5.tgz", + "integrity": "sha512-cfX2rEKOtuuljcGI5DMDHClwZHdDqd2nT2Ohsc8aHtBiz6bUxKVyIqxr2gaC6tU8AgPtrTVBzcxCA+UavXpKww==", + "dependencies": { + "@algolia/cache-common": "4.10.5" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.5.tgz", + "integrity": "sha512-1mClwdmTHll+OnHkG+yeRoFM17kSxDs4qXkjf6rNZhoZGXDvfYLy3YcZ1FX4Kyz0DJv8aroq5RYGBDsWkHj6Tw==" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.5.tgz", + "integrity": "sha512-+ciQnfIGi5wjMk02XhEY8fmy2pzy+oY1nIIfu8LBOglaSipCRAtjk6WhHc7/KIbXPiYzIwuDbM2K1+YOwSGjwA==", + "dependencies": { + "@algolia/cache-common": "4.10.5" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.5.tgz", + "integrity": "sha512-I9UkSS2glXm7RBZYZIALjBMmXSQbw/fI/djPcBHxiwXIheNIlqIFl2SNPkvihpPF979BSkzjqdJNRPhE1vku3Q==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.5.tgz", + "integrity": "sha512-h2owwJSkovPxzc+xIsjY1pMl0gj+jdVwP9rcnGjlaTY2fqHbSLrR9yvGyyr6305LvTppxsQnfAbRdE/5Z3eFxw==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.5.tgz", + "integrity": "sha512-21FAvIai5qm8DVmZHm2Gp4LssQ/a0nWwMchAx+1hIRj1TX7OcdW6oZDPyZ8asQdvTtK7rStQrRnD8a95SCUnzA==", + "dependencies": { + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.5.tgz", + "integrity": "sha512-nH+IyFKBi8tCyzGOanJTbXC5t4dspSovX3+ABfmwKWUYllYzmiQNFUadpb3qo+MLA3jFx5IwBesjneN6dD5o3w==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.5.tgz", + "integrity": "sha512-1eQFMz9uodrc5OM+9HeT+hHcfR1E1AsgFWXwyJ9Q3xejA2c1c4eObGgOgC9ZoshuHHdptaTN1m3rexqAxXRDBg==", + "dependencies": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/@algolia/logger-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.5.tgz", + "integrity": "sha512-gRJo9zt1UYP4k3woEmZm4iuEBIQd/FrArIsjzsL/b+ihNoOqIxZKTSuGFU4UUZOEhvmxDReiA4gzvQXG+TMTmA==" + }, + "node_modules/@algolia/logger-console": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.5.tgz", + "integrity": "sha512-4WfIbn4253EDU12u9UiYvz+QTvAXDv39mKNg9xSoMCjKE5szcQxfcSczw2byc6pYhahOJ9PmxPBfs1doqsdTKQ==", + "dependencies": { + "@algolia/logger-common": "4.10.5" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.5.tgz", + "integrity": "sha512-53/MURQEqtK+bGdfq4ITSPwTh5hnADU99qzvpAINGQveUFNSFGERipJxHjTJjIrjFz3vxj5kKwjtxDnU6ygO9g==", + "dependencies": { + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.5.tgz", + "integrity": "sha512-UkVa1Oyuj6NPiAEt5ZvrbVopEv1m/mKqjs40KLB+dvfZnNcj+9Fry4Oxnt15HMy/HLORXsx4UwcthAvBuOXE9Q==" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.5.tgz", + "integrity": "sha512-aNEKVKXL4fiiC+bS7yJwAHdxln81ieBwY3tsMCtM4zF9f5KwCzY2OtN4WKEZa5AAADVcghSAUdyjs4AcGUlO5w==", + "dependencies": { + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.5.tgz", + "integrity": "sha512-F8DLkmIlvCoMwSCZA3FKHtmdjH3o5clbt0pi2ktFStVNpC6ZDmY307HcK619bKP5xW6h8sVJhcvrLB775D2cyA==", + "dependencies": { + "@algolia/cache-common": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/requester-common": "4.10.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "dependencies": { + "@babel/highlight": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "dependencies": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "dependencies": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "dependencies": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "dependencies": { + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "dependencies": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "dependencies": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "dependencies": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "dependencies": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd/node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs/node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs/node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "dependencies": { + "regenerator-transform": "^0.14.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz", + "integrity": "sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==", + "dependencies": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz", + "integrity": "sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "dependencies": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "dependencies": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "dependencies": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "dependencies": { + "commander": "^2.15.1" + }, + "bin": { + "findup": "bin/findup.js" + } + }, + "node_modules/@choojs/findup/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/@docsearch/css": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.40.tgz", + "integrity": "sha512-PrOTPgJMl+Iji1zOH0+J0PEDMriJ1teGxbgll7o4h8JrvJW6sJGqQw7/bLW7enWiFaxbJMK76w1yyPNLFHV7Qg==" + }, + "node_modules/@docsearch/react": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.40.tgz", + "integrity": "sha512-aKxnu7sgpP1R7jtgOV/pZdJEHXx6Ts+jnS9U/ejSUS2BMUpwQI5SA3oLs1BA5TA9kIViJ5E+rrjh0VsbcsJ6sQ==", + "dependencies": { + "@algolia/autocomplete-core": "1.2.2", + "@algolia/autocomplete-preset-algolia": "1.2.2", + "@docsearch/css": "3.0.0-alpha.40", + "algoliasearch": "^4.0.0" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 18.0.0", + "react": ">= 16.8.0 < 18.0.0", + "react-dom": ">= 16.8.0 < 18.0.0" + } + }, + "node_modules/@docusaurus/core": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.73.tgz", + "integrity": "sha512-gUF5UOcy/5XmPWFOpLdiilI+7FEEYtvunB62xnvwEp/SNRvoL9PAs9dI2mFaDkme1RmUtPMXKzPZxwlntFnA9A==", + "dependencies": { + "@babel/core": "^7.12.16", + "@babel/generator": "^7.12.15", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/preset-react": "^7.12.13", + "@babel/preset-typescript": "^7.12.16", + "@babel/runtime": "^7.12.5", + "@babel/runtime-corejs3": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@docusaurus/cssnano-preset": "2.0.0-alpha.73", + "@docusaurus/react-loadable": "5.5.0", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", + "@svgr/webpack": "^5.5.0", + "autoprefixer": "^10.2.5", + "babel-loader": "^8.2.2", + "babel-plugin-dynamic-import-node": "2.3.0", + "boxen": "^5.0.0", + "cache-loader": "^4.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "clean-css": "^5.1.1", + "commander": "^5.1.0", + "copy-webpack-plugin": "^6.4.1", + "core-js": "^3.9.1", + "css-loader": "^5.1.1", + "del": "^6.0.0", + "detect-port": "^1.3.0", + "eta": "^1.12.1", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "globby": "^11.0.2", + "html-minifier-terser": "^5.1.1", + "html-tags": "^3.1.0", + "html-webpack-plugin": "^4.5.0", + "import-fresh": "^3.3.0", + "is-root": "^2.1.0", + "leven": "^3.1.0", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^0.8.0", + "module-alias": "^2.2.2", + "nprogress": "^0.2.0", + "null-loader": "^4.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pnp-webpack-plugin": "^1.6.4", + "postcss": "^8.2.7", + "postcss-loader": "^4.1.0", + "prompts": "^2.4.0", + "react-dev-utils": "^11.0.1", + "react-helmet": "^6.1.0", + "react-loadable": "^5.5.0", + "react-loadable-ssr-addon": "^0.3.0", + "react-router": "^5.2.0", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.2.0", + "resolve-pathname": "^3.0.0", + "rtl-detect": "^1.0.2", + "semver": "^7.3.4", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.4", + "std-env": "^2.2.1", + "terser-webpack-plugin": "^4.1.0", + "tslib": "^2.1.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^5.2.1", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-dev-server": "^3.11.2", + "webpack-merge": "^4.2.2", + "webpackbar": "^5.0.0-3" + }, + "bin": { + "docusaurus": "bin/docusaurus.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.73.tgz", + "integrity": "sha512-8DregwCCcKl5h3WAwK/NuTQ8BpXiKUnF8owVE4XAS7OnHXSobKfxz0wpF2Jzi0G8TdVfnZzPrXelnWWDL1mc3g==", + "dependencies": { + "cssnano-preset-advanced": "^4.0.7", + "postcss": "^7.0.2", + "postcss-sort-media-queries": "^1.7.26" + } + }, + "node_modules/@docusaurus/cssnano-preset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/@docusaurus/cssnano-preset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@docusaurus/cssnano-preset/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.73.tgz", + "integrity": "sha512-cteoaLe8rFLULAjRy8iOyKwo9LBupu6VPEvQbjhrM23EWap15LD5b66MmfRsCS8ubTdB1i5uYTVhwg1j41Fxjw==", + "dependencies": { + "@babel/parser": "^7.12.16", + "@babel/traverse": "^7.12.13", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "loader-utils": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "unist-util-visit": "^2.0.2", + "url-loader": "^4.1.1", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.73.tgz", + "integrity": "sha512-1G5lV+hIhZJPS+Z1/QWEVBB26MtTpgA3V9nMXrivet88LBi97X/O4auat4gzCd1ZAAAIssBqvjJZux3iYYuTZg==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "feed": "^4.2.2", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "reading-time": "^1.3.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-blog/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.73.tgz", + "integrity": "sha512-exMBKvTgJ//AazsXNYx/rSlIOt/8nMebOYNd0YMOrY1HNH3SFiTMln2nf6DhZlqDnC+e3DHxBV1mJJnZCef8xQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "combine-promises": "^1.1.0", + "execa": "^5.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "import-fresh": "^3.2.2", + "js-yaml": "^4.0.0", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "remark-admonitions": "^1.2.1", + "shelljs": "^0.8.4", + "tslib": "^2.1.0", + "utility-types": "^3.10.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.73.tgz", + "integrity": "sha512-/q9B+N3ICWlnI5mm58lMXhzWit7IP3ntY1snfy8qD98wEfWKLZwefdxnB1HI+qJXBQq5uQTWIe9lULaN/gbDzw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "remark-admonitions": "^1.2.1", + "slash": "^3.0.0", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/@docusaurus/plugin-content-pages/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.73.tgz", + "integrity": "sha512-EdovLNi8oxLFZDi/7lfLwfmgbaWFR/wOZqOYuyrHJto/TlqCCIOziX4dHYqUPHItbnwV1PGGR49DUrqyNYuLBQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "react-json-view": "^1.21.1", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.73.tgz", + "integrity": "sha512-t3Noo80wT412IMI4vnapWVpfm5PBhYPQpXQxVIZap61K2CT1lAkelyi43vREWt80HwCjXh5HvoR2TxCdGwi6nA==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.73.tgz", + "integrity": "sha512-DqrmV4eW81DzlAJrqMiki+m4tTUlpPkUL7sNemVjzqVl4616tng7wa93FcNw3sZbVm1Kp69Hep3uN2OgRmEqRQ==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.73.tgz", + "integrity": "sha512-APBI/l8T5lsfEYvRZ0ipzZlUlKX/4x47w3WfIvlqS78vk7WHAXa0tEp3S8FK36TqeTjmdmCP0F4DJCY7UJZCSw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "fs-extra": "^9.1.0", + "sitemap": "^6.3.6", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-eXgwPVMXA9K9FmGrXwOeec9Uqr0KXMdHvx3C5Ocm4E7b/mylMGwykOgR9iaSLYdVY12EKrO7T9Lm3Z37Gll7Zw==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/plugin-debug": "2.0.0-alpha.73", + "@docusaurus/plugin-google-analytics": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "2.0.0-alpha.73", + "@docusaurus/plugin-sitemap": "2.0.0-alpha.73", + "@docusaurus/theme-classic": "2.0.0-alpha.73", + "@docusaurus/theme-search-algolia": "2.0.0-alpha.73" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", + "dependencies": { + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-SVjq3xPIFQ/Uzs6WJn+8Gm1b47jLV7YBbcUXpIGd3NBKj16yZml9t7YNpos6Vt7Y5mCVhIP4IqWYJshArw6Aog==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "chalk": "^4.1.0", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "infima": "0.2.0-alpha.22", + "lodash": "^4.17.20", + "parse-numeric-range": "^1.2.0", + "postcss": "^7.0.2", + "prism-react-renderer": "^1.1.1", + "prismjs": "^1.23.0", + "prop-types": "^15.7.2", + "react-router-dom": "^5.2.0", + "rtlcss": "^2.6.2" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/@docusaurus/theme-classic/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/@docusaurus/theme-classic/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.73.tgz", + "integrity": "sha512-ePteJFQkQRkK+J1FKDhmczq+yiEmORTW9YJgYceQVq+9L6unr0XxeOBBNC27BxSabUI+A9YXjQbtdmOHFM8LKA==", + "dependencies": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "prism-react-renderer": "^1.1.1", + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.73.tgz", + "integrity": "sha512-SMfeGYZb85GIcuUjefMN+RunLDK+x6ETnlGuY9LU2S6bvoaZ4YTcqBPOt0iyZ1LH+XZmFuz78lFDW1gklaNmfg==", + "dependencies": { + "@docsearch/react": "^3.0.0-alpha.33", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "algoliasearch": "^4.8.4", + "algoliasearch-helper": "^3.3.4", + "clsx": "^1.1.1", + "eta": "^1.12.1", + "lodash": "^4.17.20" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "react": "^16.8.4 || ^17.0.0", + "react-dom": "^16.8.4 || ^17.0.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.73.tgz", + "integrity": "sha512-+q7q178LS2mMTGD/U5KgloLGKtG8yzpqj+NOp2QprjFVqTfkwTFcMhN33PTZTUcDunMDuUt+LOo9hi9Vz9+r5Q==", + "dependencies": { + "@types/webpack": "^4.41.0", + "commander": "^5.1.0", + "joi": "^17.4.0", + "querystring": "0.2.0", + "webpack-merge": "^4.2.2" + } + }, + "node_modules/@docusaurus/utils": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.73.tgz", + "integrity": "sha512-kUHnE1b/3yNWNAn0V8owLgCrxqyxfolkCbkPFfnRT+4m+agyn3riEcr+ZVObs7K9nxCla8oklX5RKSJGzyqWww==", + "dependencies": { + "@docusaurus/types": "2.0.0-alpha.73", + "@types/github-slugger": "^1.3.0", + "chalk": "^4.1.0", + "escape-string-regexp": "^4.0.0", + "fs-extra": "^9.1.0", + "gray-matter": "^4.0.2", + "lodash": "^4.17.20", + "resolve-pathname": "^3.0.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.73.tgz", + "integrity": "sha512-A36kKC+tCy/MGXdaK7emH2CHyHKru/+Td9zCm6fvNdNbu+dDNvEddTZ3ecjB0zNdDZM25Er4+KIo9GV3vnJ8Rg==", + "dependencies": { + "@docusaurus/utils": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "joi": "^17.4.0", + "tslib": "^2.1.0" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/@docusaurus/utils/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@endiliey/static-site-generator-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==", + "dependencies": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.4", + "url": "^0.11.0", + "webpack-sources": "^1.4.3" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "node_modules/@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@mdx-js/mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0" + } + }, + "node_modules/@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/move-file/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "node_modules/@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@types/github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" + }, + "node_modules/@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "node_modules/@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "node_modules/@types/node": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.0.tgz", + "integrity": "sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "node_modules/@types/sax": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", + "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "node_modules/@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, + "node_modules/@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "dependencies": { + "source-map": "^0.6.1" + } + }, + "node_modules/@types/uglify-js/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "node_modules/@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "dependencies": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "dependencies": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + } + }, + "node_modules/@types/webpack-sources/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dependencies": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "node_modules/@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dependencies": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "node_modules/@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "node_modules/@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==", + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "peerDependencies": { + "ajv": ">=5.0.0" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/algoliasearch": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.5.tgz", + "integrity": "sha512-KmH2XkiN+8FxhND4nWFbQDkIoU6g2OjfeU9kIv4Lb+EiOOs3Gpp7jvd+JnatsCisAZsnWQdjd7zVlW7I/85QvQ==", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.10.5", + "@algolia/cache-common": "4.10.5", + "@algolia/cache-in-memory": "4.10.5", + "@algolia/client-account": "4.10.5", + "@algolia/client-analytics": "4.10.5", + "@algolia/client-common": "4.10.5", + "@algolia/client-personalization": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/logger-console": "4.10.5", + "@algolia/requester-browser-xhr": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/requester-node-http": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.6.0.tgz", + "integrity": "sha512-F4Smiq+Vyv/JJytuKNFuzXndPSb4pjtiHZSkEztQCcB+SORu71A8grgt2NSJhbB5VhqHW19QDtlPKbdYdcNrLg==", + "dependencies": { + "events": "^1.1.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 5" + } + }, + "node_modules/algoliasearch-helper/node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "node_modules/arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "node_modules/asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dependencies": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/asn1.js/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dependencies": { + "object-assign": "^4.1.1", + "util": "0.10.3" + } + }, + "node_modules/assert/node_modules/inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "node_modules/assert/node_modules/util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dependencies": { + "inherits": "2.0.1" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "node_modules/async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "dependencies": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/autoprefixer/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@babel/core": "^7.11.6" + } + }, + "node_modules/babel-plugin-apply-mdx-type-prop/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "dependencies": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/babel-plugin-extract-import-names/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "node_modules/body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dependencies": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/bonjour/node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "node_modules/browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dependencies": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dependencies": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "node_modules/browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dependencies": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dependencies": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "node_modules/browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dependencies": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + } + }, + "node_modules/browserify-sign/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dependencies": { + "pako": "~1.0.5" + } + }, + "node_modules/browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "dependencies": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dependencies": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "node_modules/buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "node_modules/buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "node_modules/bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cacache/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "dependencies": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "engines": { + "node": ">= 8.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/cache-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/cache-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dependencies": { + "callsites": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-callsite/node_modules/callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "engines": { + "node": ">=4" + } + }, + "node_modules/caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dependencies": { + "caller-callsite": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + } + }, + "node_modules/ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/chalk/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/chalk/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "dependencies": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cheerio/node_modules/css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dependencies": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "node_modules/cheerio/node_modules/css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "engines": { + "node": "*" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "dependencies": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "node_modules/cheerio/node_modules/domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/cheerio/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "node_modules/cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.1.tgz", + "integrity": "sha512-ooQCa1/70oRfVdUUGjKpbHuxgMgm8BsDT5EBqBGvPxMoRoGXf4PNx5mMnkjzJ9Ptx4vvmDdha0QVh86QtYIk1g==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "dependencies": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "dependencies": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/coa/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "dependencies": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "node_modules/color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "dependencies": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "node_modules/combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "node_modules/concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "engines": [ + "node >= 0.8" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/concat-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "node_modules/console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "node_modules/constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "node_modules/content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dependencies": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } + }, + "node_modules/copy-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "dependencies": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz", + "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", + "dependencies": { + "browserslist": "^4.17.3", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-js-pure": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dependencies": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + } + }, + "node_modules/create-ecdh/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dependencies": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "node_modules/create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dependencies": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "node_modules/cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "dependencies": { + "node-fetch": "2.6.1" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dependencies": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", + "engines": { + "node": "*" + } + }, + "node_modules/css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dependencies": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">4" + } + }, + "node_modules/css-declaration-sorter/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/css-declaration-sorter/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/css-declaration-sorter/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "dependencies": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.27.0 || ^5.0.0" + } + }, + "node_modules/css-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "dependencies": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.8.tgz", + "integrity": "sha512-DlZ5+XNKwB3ZnrtJ7jdj8WxT5Zgt1WIr4gdP9v1Sdn3SObqcLwbBobQaM7BqLIVHS74TE5iWn2TSYmOVSsmozQ==", + "dependencies": { + "autoprefixer": "^9.4.7", + "cssnano-preset-default": "^4.0.8", + "postcss-discard-unused": "^4.0.1", + "postcss-merge-idents": "^4.0.1", + "postcss-reduce-idents": "^4.0.2", + "postcss-zindex": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-advanced/node_modules/autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dependencies": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + }, + "node_modules/cssnano-preset-advanced/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-preset-advanced/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-advanced/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "dependencies": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-preset-default/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-preset-default/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-preset-default/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano-util-raw-cache/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano-util-raw-cache/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/cssnano/node_modules/cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dependencies": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dependencies": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/cssnano/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/cssnano/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "node_modules/csso/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dependencies": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dependencies": { + "object-keys": "^1.0.12" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-property/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "dependencies": { + "repeat-string": "^1.5.4" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dependencies": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + } + }, + "node_modules/diffie-hellman/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "engines": { + "node": ">=0.4", + "npm": ">=1.2" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/duplexify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/duplexify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/electron-to-chromium": { + "version": "1.3.870", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz", + "integrity": "sha512-PiJMshfq6PL+i1V+nKLwhHbCKeD8eAz8rvO9Cwk/7cChOHJBtufmjajLyYLsSRHguRFiOCVx3XzJLeZsIAYfSA==" + }, + "node_modules/elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/elliptic/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/enhanced-resolve/node_modules/memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/enhanced-resolve/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/enhanced-resolve/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-ex/node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "node_modules/es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dependencies": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", + "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "dependencies": { + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "dependencies": { + "original": "^1.0.0" + }, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dependencies": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/execa/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/execa/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dependencies": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "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-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "dependencies": { + "fbjs": "^3.0.0" + } + }, + "node_modules/fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "dependencies": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "node_modules/fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "node_modules/feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dependencies": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "node_modules/flush-write-stream/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/flush-write-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/flux": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.2.tgz", + "integrity": "sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ==", + "dependencies": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.0" + }, + "peerDependencies": { + "react": "^15.0.2 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "dependencies": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "engines": { + "node": ">=6.11.5", + "yarn": ">=1.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/from2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/from2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dependencies": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/fs-write-stream-atomic/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "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.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "dependencies": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dependencies": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hash-base/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "dependencies": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "dependencies": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "dependencies": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "dependencies": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "node_modules/history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "node_modules/hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "node_modules/html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "node_modules/html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "dependencies": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/html-minifier-terser/node_modules/clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-minifier-terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", + "dependencies": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "engines": { + "node": ">=6.9" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/html-webpack-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/html-webpack-plugin/node_modules/util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dependencies": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/htmlparser2/node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "node_modules/http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dependencies": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "node_modules/ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dependencies": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/import-local/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/import-local/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "node_modules/infima": { + "version": "0.2.0-alpha.22", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.22.tgz", + "integrity": "sha512-wKOWp4C1lTFG/h54UWD3Uf6VEsj5qYehM3ZVio3GBzIQuY8B3cTiwG7ZRNoobg+LvdQA21p5BJTugpTLQJLIrA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "node_modules/internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dependencies": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "node_modules/ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "engines": { + "node": ">=4" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-ci/node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "dependencies": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "node_modules/is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-descriptor/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dependencies": { + "is-path-inside": "^2.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-in-cwd/node_modules/is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dependencies": { + "path-is-inside": "^1.0.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "dependencies": { + "call-bind": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "dependencies": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "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-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "node_modules/json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "dependencies": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "node_modules/loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "engines": { + "node": ">=4.3.0 <5.0.0 || >=5.10" + } + }, + "node_modules/loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "node_modules/lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "node_modules/lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "node_modules/lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "node_modules/lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "node_modules/lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "node_modules/lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "node_modules/lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "node_modules/lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "node_modules/lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "node_modules/lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "node_modules/loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "engines": { + "node": ">= 0.6.0" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/loglevel" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "dependencies": { + "unist-util-remove": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "dependencies": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dependencies": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "node_modules/memory-fs/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/memory-fs/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dependencies": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "bin": { + "miller-rabin": "bin/miller-rabin" + } + }, + "node_modules/miller-rabin/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "dependencies": { + "mime-db": "1.50.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + }, + "peerDependencies": { + "prop-types": "^15.0.0", + "react": "^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "dependencies": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.4.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dependencies": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dependencies": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "node_modules/move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dependencies": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "node_modules/move-concurrently/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "node_modules/nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "dependencies": { + "lodash": "^4.17.21" + } + }, + "node_modules/node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==", + "engines": { + "node": "4.x || >=6.0.0" + } + }, + "node_modules/node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dependencies": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/node-libs-browser/node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/null-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "dependencies": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dependencies": { + "url-parse": "^1.4.3" + } + }, + "node_modules/os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dependencies": { + "retry": "^0.12.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "node_modules/parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dependencies": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "node_modules/parallel-transform/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/parallel-transform/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dependencies": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "node_modules/path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "dependencies": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "dependencies": { + "ts-pnp": "^1.1.6" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "dependencies": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "dependencies": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "node_modules/postcss-calc/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-calc/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-calc/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "dependencies": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-colormin/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-colormin/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-colormin/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-colormin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-convert-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-convert-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-convert-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-convert-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-comments/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-comments/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-comments/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-duplicates/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-duplicates/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-empty/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-empty/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-empty/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-overridden/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-overridden/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-overridden/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-discard-unused": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz", + "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-discard-unused/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-discard-unused/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-discard-unused/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-discard-unused/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/postcss-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/postcss-merge-idents": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz", + "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==", + "dependencies": { + "cssnano-util-same-parent": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-idents/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-idents/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-idents/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-idents/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "dependencies": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-longhand/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-longhand/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-longhand/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-merge-longhand/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-merge-rules/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-merge-rules/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-merge-rules/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-font-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-font-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-font-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-font-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-gradients/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-gradients/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-gradients/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-gradients/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-params/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-params/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-params/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-minify-params/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-minify-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-minify-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-minify-selectors/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/postcss-minify-selectors/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dependencies": { + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-charset/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-charset/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-charset/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-display-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-display-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-positions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-positions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-positions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-positions/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-repeat-style/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-repeat-style/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-string/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-string/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-string/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-string/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-timing-functions/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-timing-functions/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-unicode/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-unicode/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "dependencies": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-url/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-url/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-url/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-url/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-normalize-whitespace/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-normalize-whitespace/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "dependencies": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-ordered-values/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-ordered-values/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-ordered-values/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-ordered-values/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz", + "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-idents/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-idents/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-idents/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-reduce-idents/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-initial/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-initial/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-initial/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "dependencies": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-reduce-transforms/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-reduce-transforms/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "1.31.21", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz", + "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==", + "dependencies": { + "postcss": "^7.0.27", + "sort-css-media-queries": "1.5.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-sort-media-queries/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-sort-media-queries/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-sort-media-queries/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "dependencies": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-svgo/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-svgo/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-svgo/node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/postcss-svgo/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dependencies": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-unique-selectors/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-unique-selectors/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-unique-selectors/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "node_modules/postcss-zindex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-4.0.1.tgz", + "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==", + "dependencies": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/postcss-zindex/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/postcss-zindex/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-zindex/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", + "peerDependencies": { + "react": ">=0.14.9" + } + }, + "node_modules/prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "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==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "node_modules/public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dependencies": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "node_modules/public-encrypt/node_modules/bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dependencies": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } + }, + "node_modules/pumpify/node_modules/pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dependencies": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dependencies": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "dependencies": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "node_modules/react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "dependencies": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-dev-utils/node_modules/@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/react-dev-utils/node_modules/browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "dependencies": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + }, + "funding": { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/react-dev-utils/node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/react-dev-utils/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/react-dev-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/react-dev-utils/node_modules/node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + }, + "node_modules/react-dev-utils/node_modules/prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/react-dev-utils/node_modules/strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dependencies": { + "ansi-regex": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + }, + "peerDependencies": { + "react": "17.0.2" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "node_modules/react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "node_modules/react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "dependencies": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + }, + "peerDependencies": { + "react": ">=16.3.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "dependencies": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + }, + "peerDependencies": { + "react": "^17.0.0 || ^16.3.0 || ^15.5.4", + "react-dom": "^17.0.0 || ^16.3.0 || ^15.5.4" + } + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "dependencies": { + "prop-types": "^15.5.0" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz", + "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=4.2.4" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1" + } + }, + "node_modules/react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "node_modules/react-router/node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "dependencies": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "dependencies": { + "minimatch": "3.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "node_modules/regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "dependencies": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "dependencies": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "dependencies": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/rehype-parse/node_modules/parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "dependencies": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + } + }, + "node_modules/remark-admonitions/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/remark-admonitions/node_modules/unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "dependencies": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "node_modules/remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "dependencies": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx/node_modules/@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/remark-mdx/node_modules/@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/remark-mdx/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "dependencies": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "dependencies": { + "mdast-squeeze-paragraphs": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "node_modules/renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + } + }, + "node_modules/renderkid/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/renderkid/node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "engines": { + "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": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=", + "engines": { + "node": "*" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "node_modules/resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "dependencies": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dependencies": { + "resolve-from": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "engines": { + "node": ">=0.12" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "node_modules/rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dependencies": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "node_modules/rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "node_modules/rtlcss": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", + "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==", + "dependencies": { + "@choojs/findup": "^0.2.1", + "chalk": "^2.4.2", + "mkdirp": "^0.5.1", + "postcss": "^6.0.23", + "strip-json-comments": "^2.0.0" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + } + }, + "node_modules/rtlcss/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/rtlcss/node_modules/postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "dependencies": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/rtlcss/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dependencies": { + "aproba": "^1.1.1" + } + }, + "node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "dependencies": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "node_modules/selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "dependencies": { + "node-forge": "^0.10.0" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + }, + "node_modules/serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/serve-handler/node_modules/content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "node_modules/serve-handler/node_modules/range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "node_modules/setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "node_modules/sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dependencies": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "node_modules/shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + }, + "node_modules/simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "dependencies": { + "is-arrayish": "^0.3.1" + } + }, + "node_modules/sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "dependencies": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sirv/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/sitemap": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", + "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", + "dependencies": { + "@types/node": "^14.14.28", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=10.3.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "14.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.27.tgz", + "integrity": "sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dependencies": { + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dependencies": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "dependencies": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + } + }, + "node_modules/sockjs-client/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/sort-css-media-queries": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz", + "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "node_modules/state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "dependencies": { + "ci-info": "^3.1.1" + } + }, + "node_modules/stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dependencies": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "node_modules/stream-browserify/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-browserify/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dependencies": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-http/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/stream-http/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "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.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/stringify-object/node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dependencies": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/stylehacks/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/stylehacks/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/stylehacks/node_modules/postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dependencies": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylehacks/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/svgo/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tar/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "dependencies": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser-webpack-plugin/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "dependencies": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin/node_modules/terser/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/terser/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dependencies": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/through2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dependencies": { + "setimmediate": "^1.0.4" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "node_modules/tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "node_modules/trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" + }, + "node_modules/ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==", + "engines": { + "node": ">=6" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "dependencies": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dependencies": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "dependencies": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/unified/node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "node_modules/uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "dependencies": { + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "dependencies": { + "unist-util-visit": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "dependencies": { + "@types/unist": "^2.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dependencies": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-parse-lax/node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "dependencies": { + "ts-essentials": "^2.0.3" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dependencies": { + "inherits": "2.0.3" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/util/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "node_modules/utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "dependencies": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "dependencies": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile/node_modules/is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=4" + } + }, + "node_modules/vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "node_modules/wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "dependencies": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + }, + "bin": { + "wait-on": "bin/wait-on" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dependencies": { + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + }, + "optionalDependencies": { + "chokidar": "^3.4.1", + "watchpack-chokidar2": "^2.0.1" + } + }, + "node_modules/watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "dependencies": { + "chokidar": "^2.1.8" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "optional": true, + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "optional": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/watchpack-chokidar2/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/watchpack-chokidar2/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/watchpack-chokidar2/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "dependencies": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=6.11.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + }, + "webpack-command": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "dependencies": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "dependencies": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "dependencies": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 6.11.5" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/webpack-dev-server/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dependencies": { + "array-uniq": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 will break on node v14+. Upgrade to chokidar 3 with 15x less dependencies.", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/webpack-dev-server/node_modules/del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dependencies": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/webpack-dev-server/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dependencies": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/globby/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/webpack-dev-server/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/webpack-dev-server/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/webpack-dev-server/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack-dev-server/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/webpack-dev-server/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack-dev-server/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "dependencies": { + "async-limiter": "~1.0.0" + } + }, + "node_modules/webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dependencies": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/webpack-sources/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/braces/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dependencies": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "node_modules/webpack/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/extend-shallow/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/fill-range/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/webpack/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/webpack/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/webpack/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/webpack/node_modules/pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/webpack/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dependencies": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/webpack/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/webpack/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/webpack/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "dependencies": { + "figgy-pudding": "^3.5.1" + } + }, + "node_modules/webpack/node_modules/terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dependencies": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "webpack": "^4.0.0" + } + }, + "node_modules/webpack/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/webpackbar": { + "version": "5.0.0-3", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", + "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "consola": "^2.15.0", + "figures": "^3.2.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dependencies": { + "errno": "~0.1.7" + } + }, + "node_modules/worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "dependencies": { + "microevent.ts": "~0.1.1" + } + }, + "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/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dependencies": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "node_modules/yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "node_modules/yargs-parser/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "node_modules/yargs/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "engines": { + "node": ">=4" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + }, + "dependencies": { + "@algolia/autocomplete-core": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.2.2.tgz", + "integrity": "sha512-JOQaURze45qVa8OOFDh+ozj2a/ObSRsVyz6Zd0aiBeej+RSTqrr1hDVpGNbbXYLW26G5ujuc9QIdH+rBHn95nw==", + "requires": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "@algolia/autocomplete-preset-algolia": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.2.2.tgz", + "integrity": "sha512-AZkh+bAMaJDzMZTelFOXJTJqkp5VPGH8W3n0B+Ggce7DdozlMRsDLguKTCQAkZ0dJ1EbBPyFL5ztL/JImB137Q==", + "requires": { + "@algolia/autocomplete-shared": "1.2.2" + } + }, + "@algolia/autocomplete-shared": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.2.2.tgz", + "integrity": "sha512-mLTl7d2C1xVVazHt/bqh9EE/u2lbp5YOxLDdcjILXmUqOs5HH1D4SuySblXaQG1uf28FhTqMGp35qE5wJQnqAw==" + }, + "@algolia/cache-browser-local-storage": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.10.5.tgz", + "integrity": "sha512-cfX2rEKOtuuljcGI5DMDHClwZHdDqd2nT2Ohsc8aHtBiz6bUxKVyIqxr2gaC6tU8AgPtrTVBzcxCA+UavXpKww==", + "requires": { + "@algolia/cache-common": "4.10.5" + } + }, + "@algolia/cache-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.10.5.tgz", + "integrity": "sha512-1mClwdmTHll+OnHkG+yeRoFM17kSxDs4qXkjf6rNZhoZGXDvfYLy3YcZ1FX4Kyz0DJv8aroq5RYGBDsWkHj6Tw==" + }, + "@algolia/cache-in-memory": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.10.5.tgz", + "integrity": "sha512-+ciQnfIGi5wjMk02XhEY8fmy2pzy+oY1nIIfu8LBOglaSipCRAtjk6WhHc7/KIbXPiYzIwuDbM2K1+YOwSGjwA==", + "requires": { + "@algolia/cache-common": "4.10.5" + } + }, + "@algolia/client-account": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.10.5.tgz", + "integrity": "sha512-I9UkSS2glXm7RBZYZIALjBMmXSQbw/fI/djPcBHxiwXIheNIlqIFl2SNPkvihpPF979BSkzjqdJNRPhE1vku3Q==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-analytics": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.10.5.tgz", + "integrity": "sha512-h2owwJSkovPxzc+xIsjY1pMl0gj+jdVwP9rcnGjlaTY2fqHbSLrR9yvGyyr6305LvTppxsQnfAbRdE/5Z3eFxw==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.10.5.tgz", + "integrity": "sha512-21FAvIai5qm8DVmZHm2Gp4LssQ/a0nWwMchAx+1hIRj1TX7OcdW6oZDPyZ8asQdvTtK7rStQrRnD8a95SCUnzA==", + "requires": { + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-personalization": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.10.5.tgz", + "integrity": "sha512-nH+IyFKBi8tCyzGOanJTbXC5t4dspSovX3+ABfmwKWUYllYzmiQNFUadpb3qo+MLA3jFx5IwBesjneN6dD5o3w==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/client-search": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.10.5.tgz", + "integrity": "sha512-1eQFMz9uodrc5OM+9HeT+hHcfR1E1AsgFWXwyJ9Q3xejA2c1c4eObGgOgC9ZoshuHHdptaTN1m3rexqAxXRDBg==", + "requires": { + "@algolia/client-common": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "@algolia/logger-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.10.5.tgz", + "integrity": "sha512-gRJo9zt1UYP4k3woEmZm4iuEBIQd/FrArIsjzsL/b+ihNoOqIxZKTSuGFU4UUZOEhvmxDReiA4gzvQXG+TMTmA==" + }, + "@algolia/logger-console": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.10.5.tgz", + "integrity": "sha512-4WfIbn4253EDU12u9UiYvz+QTvAXDv39mKNg9xSoMCjKE5szcQxfcSczw2byc6pYhahOJ9PmxPBfs1doqsdTKQ==", + "requires": { + "@algolia/logger-common": "4.10.5" + } + }, + "@algolia/requester-browser-xhr": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.10.5.tgz", + "integrity": "sha512-53/MURQEqtK+bGdfq4ITSPwTh5hnADU99qzvpAINGQveUFNSFGERipJxHjTJjIrjFz3vxj5kKwjtxDnU6ygO9g==", + "requires": { + "@algolia/requester-common": "4.10.5" + } + }, + "@algolia/requester-common": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.10.5.tgz", + "integrity": "sha512-UkVa1Oyuj6NPiAEt5ZvrbVopEv1m/mKqjs40KLB+dvfZnNcj+9Fry4Oxnt15HMy/HLORXsx4UwcthAvBuOXE9Q==" + }, + "@algolia/requester-node-http": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.10.5.tgz", + "integrity": "sha512-aNEKVKXL4fiiC+bS7yJwAHdxln81ieBwY3tsMCtM4zF9f5KwCzY2OtN4WKEZa5AAADVcghSAUdyjs4AcGUlO5w==", + "requires": { + "@algolia/requester-common": "4.10.5" + } + }, + "@algolia/transporter": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.10.5.tgz", + "integrity": "sha512-F8DLkmIlvCoMwSCZA3FKHtmdjH3o5clbt0pi2ktFStVNpC6ZDmY307HcK619bKP5xW6h8sVJhcvrLB775D2cyA==", + "requires": { + "@algolia/cache-common": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/requester-common": "4.10.5" + } + }, + "@babel/code-frame": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", + "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", + "requires": { + "@babel/highlight": "^7.14.5" + } + }, + "@babel/compat-data": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz", + "integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==" + }, + "@babel/core": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.8.tgz", + "integrity": "sha512-3UG9dsxvYBMYwRv+gS41WKHno4K60/9GPy1CJaH6xy3Elq8CTtvtjT5R5jmNhXfCYLX2mTw+7/aq5ak/gOE0og==", + "requires": { + "@babel/code-frame": "^7.15.8", + "@babel/generator": "^7.15.8", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.8", + "@babel/helpers": "^7.15.4", + "@babel/parser": "^7.15.8", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/generator": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.8.tgz", + "integrity": "sha512-ECmAKstXbp1cvpTTZciZCgfOt6iN64lR0d+euv3UZisU5awfRawOvg07Utn/qBGuH4bRIEZKrA/4LzZyXhZr8g==", + "requires": { + "@babel/types": "^7.15.6", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz", + "integrity": "sha512-QwrtdNvUNsPCj2lfNQacsGSQvGX8ee1ttrBrcozUP2Sv/jylewBP/8QFe6ZkBsC8T/GYWonNAWJV4aRR9AL2DA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.15.4.tgz", + "integrity": "sha512-P8o7JP2Mzi0SdC6eWr1zF+AEYvrsZa7GSY1lTayjF5XJhVH0kjLYUZPvTMflP7tBgZoe9gIhTa60QwFpqh/E0Q==", + "requires": { + "@babel/helper-explode-assignable-expression": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.4.tgz", + "integrity": "sha512-rMWPCirulnPSe4d+gwdWXLfAXTTBj8M3guAf5xFQJ0nvFY7tfNAFnWdqaHegHlgDZOCT4qvhF3BYlSJag8yhqQ==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-validator-option": "^7.14.5", + "browserslist": "^4.16.6", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz", + "integrity": "sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz", + "integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz", + "integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==", + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.15.4.tgz", + "integrity": "sha512-J14f/vq8+hdC2KoWLIQSsGrC9EFBKE4NFts8pfMpymfApds+fPqR30AOUWc4tyr56h9l/GA1Sxv2q3dLZWbQ/g==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-function-name": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.15.4.tgz", + "integrity": "sha512-Z91cOMM4DseLIGOnog+Z8OI6YseR9bua+HpvLAQ2XayUGU+neTtX+97caALaLdyu53I/fjhbeCnWnRH1O3jFOw==", + "requires": { + "@babel/helper-get-function-arity": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.15.4.tgz", + "integrity": "sha512-1/AlxSF92CmGZzHnC515hm4SirTxtpDnLEJ0UyEMgTMZN+6bxXKg04dKhiRx5Enel+SUA1G1t5Ed/yQia0efrA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.15.4.tgz", + "integrity": "sha512-VTy085egb3jUGVK9ycIxQiPbquesq0HUQ+tPO0uv5mPEBZipk+5FkRKiWq5apuyTE9FUrjENB0rCf8y+n+UuhA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.4.tgz", + "integrity": "sha512-cokOMkxC/BTyNP1AlY25HuBWM32iCEsLPI4BHDpJCHHm1FU2E7dKWWIXJgQgSFiu4lp8q3bL1BIKwqkSUviqtA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-imports": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz", + "integrity": "sha512-jeAHZbzUwdW/xHgHQ3QmWR4Jg6j15q4w/gCfwZvtqOxoo5DKtLHk8Bsf4c5RZRC7NmLEs+ohkdq8jFefuvIxAA==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-module-transforms": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.8.tgz", + "integrity": "sha512-DfAfA6PfpG8t4S6npwzLvTUpp0sS7JrcuaMiy1Y5645laRJIp/LiLGIBbQKaXSInK8tiGNI7FL7L8UvB8gdUZg==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-simple-access": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/helper-validator-identifier": "^7.15.7", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.6" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.15.4.tgz", + "integrity": "sha512-E/z9rfbAOt1vDW1DR7k4SzhzotVV5+qMciWV6LaG1g4jeFrkDlJedjtV4h0i4Q/ITnUu+Pk08M7fczsB9GXBDw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", + "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.15.4.tgz", + "integrity": "sha512-v53MxgvMK/HCwckJ1bZrq6dNKlmwlyRNYM6ypaRTdXWGOE2c1/SCa6dL/HimhPulGhZKw9W0QhREM583F/t0vQ==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-wrap-function": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-replace-supers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.4.tgz", + "integrity": "sha512-/ztT6khaXF37MS47fufrKvIsiQkx1LBRvSJNzRqmbyeZnTwU9qBxXYLaaT/6KaxfKhjs2Wy8kG8ZdsFUuWBjzw==", + "requires": { + "@babel/helper-member-expression-to-functions": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-simple-access": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz", + "integrity": "sha512-UzazrDoIVOZZcTeHHEPYrr1MvTR/K+wgLg6MY6e1CJyaRhbibftF6fR2KU2sFRtI/nERUZR9fBd6aKgBlIBaPg==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.15.4.tgz", + "integrity": "sha512-BMRLsdh+D1/aap19TycS4eD1qELGrCBJwzaY9IE8LrpJtJb+H7rQkPIdsfgnMtLBA6DJls7X9z93Z4U8h7xw0A==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.15.4.tgz", + "integrity": "sha512-HsFqhLDZ08DxCpBdEVtKmywj6PQbwnF6HHybur0MAnkAKnlS6uHkwnmRIkElB2Owpfb4xL4NwDmDLFubueDXsw==", + "requires": { + "@babel/types": "^7.15.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.15.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", + "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + }, + "@babel/helper-validator-option": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", + "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + }, + "@babel/helper-wrap-function": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.15.4.tgz", + "integrity": "sha512-Y2o+H/hRV5W8QhIfTpRIBwl57y8PrZt6JM3V8FOo5qarjshHItyH5lXlpMfBfmBefOqSCpKZs/6Dxqp0E/U+uw==", + "requires": { + "@babel/helper-function-name": "^7.15.4", + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/helpers": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.4.tgz", + "integrity": "sha512-V45u6dqEJ3w2rlryYYXf6i9rQ5YMNu4FLS6ngs8ikblhu2VdR1AqAd6aJjBzmf2Qzh6KOLqKHxEN9+TFbAkAVQ==", + "requires": { + "@babel/template": "^7.15.4", + "@babel/traverse": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/highlight": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", + "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "@babel/parser": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.8.tgz", + "integrity": "sha512-BRYa3wcQnjS/nqI8Ac94pYYpJfojHVvVXJ97+IDCImX4Jc8W8Xv1+47enbruk+q1etOpsQNwnfFcNGw+gtPGxA==" + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz", + "integrity": "sha512-eBnpsl9tlhPhpI10kU06JHnrYXwg3+V6CaP2idsCXNef0aeslpqyITXQ74Vfk5uHgY7IG7XP0yIH8b42KSzHog==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4", + "@babel/plugin-proposal-optional-chaining": "^7.14.5" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.15.8.tgz", + "integrity": "sha512-2Z5F2R2ibINTc63mY7FLqGfEbmofrHU9FitJW1Q7aPaKFhiPvSq6QEt/BoWN5oME3GVyjcRuNNSRbb9LC0CSWA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.15.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz", + "integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.15.4.tgz", + "integrity": "sha512-M682XWrrLNk3chXCjoPUQWOyYsB93B9z3mRyjtqqYJWDf2mfCdIYgDrA11cgNVhAQieaq6F2fn2f3wI0U4aTjA==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz", + "integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz", + "integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz", + "integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz", + "integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz", + "integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz", + "integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.15.6.tgz", + "integrity": "sha512-qtOHo7A1Vt+O23qEAX+GdBpqaIuD3i9VRrWgCJeq7WO6H2d14EK3q11urj5Te2MAeK97nMiIdRpwd/ST4JFbNg==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.15.4" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz", + "integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz", + "integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.14.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz", + "integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.15.4.tgz", + "integrity": "sha512-X0UTixkLf0PCCffxgu5/1RQyGGbgZuKoI+vXP4iSbJSYwPb7hu06omsFGBvQ9lJEvwgrxHdS8B5nbfcd8GyUNA==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz", + "integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz", + "integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-typescript": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz", + "integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz", + "integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz", + "integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==", + "requires": { + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz", + "integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.15.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz", + "integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.15.4.tgz", + "integrity": "sha512-Yjvhex8GzBmmPQUvpXRPWQ9WnxXgAFuZSrqOK/eJlOGIXwvv8H3UEdUigl1gb/bnjTrln+e8bkZUYCBt/xYlBg==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-optimise-call-expression": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz", + "integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.14.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz", + "integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz", + "integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz", + "integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz", + "integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==", + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.15.4.tgz", + "integrity": "sha512-DRTY9fA751AFBDh2oxydvVm4SYevs5ILTWLs6xKXps4Re/KG5nfUkr+TdHCrRWB8C69TlzVgA9b3RmGWmgN9LA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz", + "integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==", + "requires": { + "@babel/helper-function-name": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz", + "integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz", + "integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz", + "integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.4.tgz", + "integrity": "sha512-qg4DPhwG8hKp4BbVDvX1s8cohM8a6Bvptu4l6Iingq5rW+yRUAhe/YRup/YcW2zCOlrysEWVhftIcKzrEZv3sA==", + "requires": { + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-simple-access": "^7.15.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.15.4.tgz", + "integrity": "sha512-fJUnlQrl/mezMneR72CKCgtOoahqGJNVKpompKwzv3BrEXdlPspTcyxrZ1XmDTIr9PpULrgEQo3qNKp6dW7ssw==", + "requires": { + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-module-transforms": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-identifier": "^7.14.9", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "requires": { + "object.assign": "^4.1.0" + } + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz", + "integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==", + "requires": { + "@babel/helper-module-transforms": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz", + "integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz", + "integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz", + "integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-replace-supers": "^7.14.5" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.15.4.tgz", + "integrity": "sha512-9WB/GUTO6lvJU3XQsSr6J/WKvBC2hcs4Pew8YxZagi6GkTdniyqp8On5kqdK8MN0LMeu0mGbhPN+O049NV/9FQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz", + "integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-constant-elements": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz", + "integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-display-name": { + "version": "7.15.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz", + "integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-react-jsx": { + "version": "7.14.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz", + "integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-module-imports": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-jsx": "^7.14.5", + "@babel/types": "^7.14.9" + } + }, + "@babel/plugin-transform-react-jsx-development": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz", + "integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==", + "requires": { + "@babel/plugin-transform-react-jsx": "^7.14.5" + } + }, + "@babel/plugin-transform-react-pure-annotations": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz", + "integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==", + "requires": { + "@babel/helper-annotate-as-pure": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz", + "integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==", + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz", + "integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.8.tgz", + "integrity": "sha512-+6zsde91jMzzvkzuEA3k63zCw+tm/GvuuabkpisgbDMTPQsIMHllE3XczJFFtEHLjjhKQFZmGQVRdELetlWpVw==", + "requires": { + "@babel/helper-module-imports": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz", + "integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.15.8.tgz", + "integrity": "sha512-/daZ8s2tNaRekl9YJa9X4bzjpeRZLt122cpgFnQPLGUe61PH8zMEBmYqKkW5xF5JUEh5buEGXJoQpqBmIbpmEQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.15.4" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz", + "integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz", + "integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz", + "integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-typescript": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.8.tgz", + "integrity": "sha512-ZXIkJpbaf6/EsmjeTbiJN/yMxWPFWvlr7sEG1P95Xb4S4IBcrf2n7s/fItIhsAmOf8oSh3VJPDppO6ExfAfKRQ==", + "requires": { + "@babel/helper-create-class-features-plugin": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/plugin-syntax-typescript": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz", + "integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz", + "integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==", + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.14.5", + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/preset-env": { + "version": "7.15.8", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.8.tgz", + "integrity": "sha512-rCC0wH8husJgY4FPbHsiYyiLxSY8oMDJH7Rl6RQMknbN9oDDHhM9RDFvnGM2MgkbUJzSQB4gtuwygY5mCqGSsA==", + "requires": { + "@babel/compat-data": "^7.15.0", + "@babel/helper-compilation-targets": "^7.15.4", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.15.4", + "@babel/plugin-proposal-async-generator-functions": "^7.15.8", + "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-static-block": "^7.15.4", + "@babel/plugin-proposal-dynamic-import": "^7.14.5", + "@babel/plugin-proposal-export-namespace-from": "^7.14.5", + "@babel/plugin-proposal-json-strings": "^7.14.5", + "@babel/plugin-proposal-logical-assignment-operators": "^7.14.5", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5", + "@babel/plugin-proposal-numeric-separator": "^7.14.5", + "@babel/plugin-proposal-object-rest-spread": "^7.15.6", + "@babel/plugin-proposal-optional-catch-binding": "^7.14.5", + "@babel/plugin-proposal-optional-chaining": "^7.14.5", + "@babel/plugin-proposal-private-methods": "^7.14.5", + "@babel/plugin-proposal-private-property-in-object": "^7.15.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.14.5", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.14.5", + "@babel/plugin-transform-async-to-generator": "^7.14.5", + "@babel/plugin-transform-block-scoped-functions": "^7.14.5", + "@babel/plugin-transform-block-scoping": "^7.15.3", + "@babel/plugin-transform-classes": "^7.15.4", + "@babel/plugin-transform-computed-properties": "^7.14.5", + "@babel/plugin-transform-destructuring": "^7.14.7", + "@babel/plugin-transform-dotall-regex": "^7.14.5", + "@babel/plugin-transform-duplicate-keys": "^7.14.5", + "@babel/plugin-transform-exponentiation-operator": "^7.14.5", + "@babel/plugin-transform-for-of": "^7.15.4", + "@babel/plugin-transform-function-name": "^7.14.5", + "@babel/plugin-transform-literals": "^7.14.5", + "@babel/plugin-transform-member-expression-literals": "^7.14.5", + "@babel/plugin-transform-modules-amd": "^7.14.5", + "@babel/plugin-transform-modules-commonjs": "^7.15.4", + "@babel/plugin-transform-modules-systemjs": "^7.15.4", + "@babel/plugin-transform-modules-umd": "^7.14.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9", + "@babel/plugin-transform-new-target": "^7.14.5", + "@babel/plugin-transform-object-super": "^7.14.5", + "@babel/plugin-transform-parameters": "^7.15.4", + "@babel/plugin-transform-property-literals": "^7.14.5", + "@babel/plugin-transform-regenerator": "^7.14.5", + "@babel/plugin-transform-reserved-words": "^7.14.5", + "@babel/plugin-transform-shorthand-properties": "^7.14.5", + "@babel/plugin-transform-spread": "^7.15.8", + "@babel/plugin-transform-sticky-regex": "^7.14.5", + "@babel/plugin-transform-template-literals": "^7.14.5", + "@babel/plugin-transform-typeof-symbol": "^7.14.5", + "@babel/plugin-transform-unicode-escapes": "^7.14.5", + "@babel/plugin-transform-unicode-regex": "^7.14.5", + "@babel/preset-modules": "^0.1.4", + "@babel/types": "^7.15.6", + "babel-plugin-polyfill-corejs2": "^0.2.2", + "babel-plugin-polyfill-corejs3": "^0.2.5", + "babel-plugin-polyfill-regenerator": "^0.2.2", + "core-js-compat": "^3.16.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "@babel/preset-modules": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz", + "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==", + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/preset-react": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz", + "integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-react-display-name": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.5", + "@babel/plugin-transform-react-jsx-development": "^7.14.5", + "@babel/plugin-transform-react-pure-annotations": "^7.14.5" + } + }, + "@babel/preset-typescript": { + "version": "7.15.0", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz", + "integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==", + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-transform-typescript": "^7.15.0" + } + }, + "@babel/runtime": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz", + "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==", + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/runtime-corejs3": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.4.tgz", + "integrity": "sha512-lWcAqKeB624/twtTc3w6w/2o9RqJPaNBhPGK6DKLSiwuVWC7WFkypWyNg+CpZoyJH0jVzv1uMtXZ/5/lQOLtCg==", + "requires": { + "core-js-pure": "^3.16.0", + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.15.4.tgz", + "integrity": "sha512-UgBAfEa1oGuYgDIPM2G+aHa4Nlo9Lh6mGD2bDBGMTbYnc38vulXPuC1MGjYILIEmlwl6Rd+BPR9ee3gm20CBtg==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4" + } + }, + "@babel/traverse": { + "version": "7.15.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.4.tgz", + "integrity": "sha512-W6lQD8l4rUbQR/vYgSuCAE75ADyyQvOpFVsvPPdkhf6lATXAsQIG9YdtOcu8BB1dZ0LKu+Zo3c1wEcbKeuhdlA==", + "requires": { + "@babel/code-frame": "^7.14.5", + "@babel/generator": "^7.15.4", + "@babel/helper-function-name": "^7.15.4", + "@babel/helper-hoist-variables": "^7.15.4", + "@babel/helper-split-export-declaration": "^7.15.4", + "@babel/parser": "^7.15.4", + "@babel/types": "^7.15.4", + "debug": "^4.1.0", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.15.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.6.tgz", + "integrity": "sha512-BPU+7QhqNjmWyDO0/vitH/CuhpV8ZmK1wpKva8nuyNF5MJfuRNWMc+hc14+u9xT93kvykMdncrJT19h74uB1Ig==", + "requires": { + "@babel/helper-validator-identifier": "^7.14.9", + "to-fast-properties": "^2.0.0" + } + }, + "@choojs/findup": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@choojs/findup/-/findup-0.2.1.tgz", + "integrity": "sha512-YstAqNb0MCN8PjdLCDfRsBcGVRN41f3vgLvaI0IrIcBp4AqILRSS0DeWNGkicC+f/zRIPJLc+9RURVSepwvfBw==", + "requires": { + "commander": "^2.15.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "@docsearch/css": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-3.0.0-alpha.40.tgz", + "integrity": "sha512-PrOTPgJMl+Iji1zOH0+J0PEDMriJ1teGxbgll7o4h8JrvJW6sJGqQw7/bLW7enWiFaxbJMK76w1yyPNLFHV7Qg==" + }, + "@docsearch/react": { + "version": "3.0.0-alpha.40", + "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-3.0.0-alpha.40.tgz", + "integrity": "sha512-aKxnu7sgpP1R7jtgOV/pZdJEHXx6Ts+jnS9U/ejSUS2BMUpwQI5SA3oLs1BA5TA9kIViJ5E+rrjh0VsbcsJ6sQ==", + "requires": { + "@algolia/autocomplete-core": "1.2.2", + "@algolia/autocomplete-preset-algolia": "1.2.2", + "@docsearch/css": "3.0.0-alpha.40", + "algoliasearch": "^4.0.0" + } + }, + "@docusaurus/core": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-2.0.0-alpha.73.tgz", + "integrity": "sha512-gUF5UOcy/5XmPWFOpLdiilI+7FEEYtvunB62xnvwEp/SNRvoL9PAs9dI2mFaDkme1RmUtPMXKzPZxwlntFnA9A==", + "requires": { + "@babel/core": "^7.12.16", + "@babel/generator": "^7.12.15", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.16", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.12.15", + "@babel/preset-env": "^7.12.16", + "@babel/preset-react": "^7.12.13", + "@babel/preset-typescript": "^7.12.16", + "@babel/runtime": "^7.12.5", + "@babel/runtime-corejs3": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@docusaurus/cssnano-preset": "2.0.0-alpha.73", + "@docusaurus/react-loadable": "5.5.0", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@endiliey/static-site-generator-webpack-plugin": "^4.0.0", + "@svgr/webpack": "^5.5.0", + "autoprefixer": "^10.2.5", + "babel-loader": "^8.2.2", + "babel-plugin-dynamic-import-node": "2.3.0", + "boxen": "^5.0.0", + "cache-loader": "^4.1.0", + "chalk": "^4.1.0", + "chokidar": "^3.5.1", + "clean-css": "^5.1.1", + "commander": "^5.1.0", + "copy-webpack-plugin": "^6.4.1", + "core-js": "^3.9.1", + "css-loader": "^5.1.1", + "del": "^6.0.0", + "detect-port": "^1.3.0", + "eta": "^1.12.1", + "express": "^4.17.1", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "globby": "^11.0.2", + "html-minifier-terser": "^5.1.1", + "html-tags": "^3.1.0", + "html-webpack-plugin": "^4.5.0", + "import-fresh": "^3.3.0", + "is-root": "^2.1.0", + "leven": "^3.1.0", + "lodash": "^4.17.20", + "mini-css-extract-plugin": "^0.8.0", + "module-alias": "^2.2.2", + "nprogress": "^0.2.0", + "null-loader": "^4.0.0", + "optimize-css-assets-webpack-plugin": "^5.0.4", + "pnp-webpack-plugin": "^1.6.4", + "postcss": "^8.2.7", + "postcss-loader": "^4.1.0", + "prompts": "^2.4.0", + "react-dev-utils": "^11.0.1", + "react-helmet": "^6.1.0", + "react-loadable": "^5.5.0", + "react-loadable-ssr-addon": "^0.3.0", + "react-router": "^5.2.0", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.2.0", + "resolve-pathname": "^3.0.0", + "rtl-detect": "^1.0.2", + "semver": "^7.3.4", + "serve-handler": "^6.1.3", + "shelljs": "^0.8.4", + "std-env": "^2.2.1", + "terser-webpack-plugin": "^4.1.0", + "tslib": "^2.1.0", + "update-notifier": "^5.1.0", + "url-loader": "^4.1.1", + "wait-on": "^5.2.1", + "webpack": "^4.44.1", + "webpack-bundle-analyzer": "^4.4.0", + "webpack-dev-server": "^3.11.2", + "webpack-merge": "^4.2.2", + "webpackbar": "^5.0.0-3" + } + }, + "@docusaurus/cssnano-preset": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.0.0-alpha.73.tgz", + "integrity": "sha512-8DregwCCcKl5h3WAwK/NuTQ8BpXiKUnF8owVE4XAS7OnHXSobKfxz0wpF2Jzi0G8TdVfnZzPrXelnWWDL1mc3g==", + "requires": { + "cssnano-preset-advanced": "^4.0.7", + "postcss": "^7.0.2", + "postcss-sort-media-queries": "^1.7.26" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@docusaurus/mdx-loader": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.0.0-alpha.73.tgz", + "integrity": "sha512-cteoaLe8rFLULAjRy8iOyKwo9LBupu6VPEvQbjhrM23EWap15LD5b66MmfRsCS8ubTdB1i5uYTVhwg1j41Fxjw==", + "requires": { + "@babel/parser": "^7.12.16", + "@babel/traverse": "^7.12.13", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "escape-html": "^1.0.3", + "file-loader": "^6.2.0", + "fs-extra": "^9.1.0", + "github-slugger": "^1.3.0", + "loader-utils": "^2.0.0", + "mdast-util-to-string": "^2.0.0", + "remark-emoji": "^2.1.0", + "stringify-object": "^3.3.0", + "unist-util-visit": "^2.0.2", + "url-loader": "^4.1.1", + "webpack": "^4.44.1" + } + }, + "@docusaurus/plugin-content-blog": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.0.0-alpha.73.tgz", + "integrity": "sha512-1G5lV+hIhZJPS+Z1/QWEVBB26MtTpgA3V9nMXrivet88LBi97X/O4auat4gzCd1ZAAAIssBqvjJZux3iYYuTZg==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "feed": "^4.2.2", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "reading-time": "^1.3.0", + "remark-admonitions": "^1.2.1", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "@docusaurus/plugin-content-docs": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.0.0-alpha.73.tgz", + "integrity": "sha512-exMBKvTgJ//AazsXNYx/rSlIOt/8nMebOYNd0YMOrY1HNH3SFiTMln2nf6DhZlqDnC+e3DHxBV1mJJnZCef8xQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "combine-promises": "^1.1.0", + "execa": "^5.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "import-fresh": "^3.2.2", + "js-yaml": "^4.0.0", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "remark-admonitions": "^1.2.1", + "shelljs": "^0.8.4", + "tslib": "^2.1.0", + "utility-types": "^3.10.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "requires": { + "path-key": "^3.0.0" + } + } + } + }, + "@docusaurus/plugin-content-pages": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.0.0-alpha.73.tgz", + "integrity": "sha512-/q9B+N3ICWlnI5mm58lMXhzWit7IP3ntY1snfy8qD98wEfWKLZwefdxnB1HI+qJXBQq5uQTWIe9lULaN/gbDzw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/mdx-loader": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "globby": "^11.0.2", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "minimatch": "^3.0.4", + "remark-admonitions": "^1.2.1", + "slash": "^3.0.0", + "tslib": "^2.1.0", + "webpack": "^4.44.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "@docusaurus/plugin-debug": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.0.0-alpha.73.tgz", + "integrity": "sha512-EdovLNi8oxLFZDi/7lfLwfmgbaWFR/wOZqOYuyrHJto/TlqCCIOziX4dHYqUPHItbnwV1PGGR49DUrqyNYuLBQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "react-json-view": "^1.21.1", + "tslib": "^2.1.0" + } + }, + "@docusaurus/plugin-google-analytics": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.0.0-alpha.73.tgz", + "integrity": "sha512-t3Noo80wT412IMI4vnapWVpfm5PBhYPQpXQxVIZap61K2CT1lAkelyi43vREWt80HwCjXh5HvoR2TxCdGwi6nA==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73" + } + }, + "@docusaurus/plugin-google-gtag": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.0.0-alpha.73.tgz", + "integrity": "sha512-DqrmV4eW81DzlAJrqMiki+m4tTUlpPkUL7sNemVjzqVl4616tng7wa93FcNw3sZbVm1Kp69Hep3uN2OgRmEqRQ==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73" + } + }, + "@docusaurus/plugin-sitemap": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.0.0-alpha.73.tgz", + "integrity": "sha512-APBI/l8T5lsfEYvRZ0ipzZlUlKX/4x47w3WfIvlqS78vk7WHAXa0tEp3S8FK36TqeTjmdmCP0F4DJCY7UJZCSw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "fs-extra": "^9.1.0", + "sitemap": "^6.3.6", + "tslib": "^2.1.0" + } + }, + "@docusaurus/preset-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-eXgwPVMXA9K9FmGrXwOeec9Uqr0KXMdHvx3C5Ocm4E7b/mylMGwykOgR9iaSLYdVY12EKrO7T9Lm3Z37Gll7Zw==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/plugin-debug": "2.0.0-alpha.73", + "@docusaurus/plugin-google-analytics": "2.0.0-alpha.73", + "@docusaurus/plugin-google-gtag": "2.0.0-alpha.73", + "@docusaurus/plugin-sitemap": "2.0.0-alpha.73", + "@docusaurus/theme-classic": "2.0.0-alpha.73", + "@docusaurus/theme-search-algolia": "2.0.0-alpha.73" + } + }, + "@docusaurus/react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-Ld/kwUE6yATIOTLq3JCsWiTa/drisajwKqBQ2Rw6IcT+sFsKfYek8F2jSH8f68AT73xX97UehduZeCSlnuCBIg==", + "requires": { + "prop-types": "^15.6.2" + } + }, + "@docusaurus/theme-classic": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.0.0-alpha.73.tgz", + "integrity": "sha512-SVjq3xPIFQ/Uzs6WJn+8Gm1b47jLV7YBbcUXpIGd3NBKj16yZml9t7YNpos6Vt7Y5mCVhIP4IqWYJshArw6Aog==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "@mdx-js/mdx": "^1.6.21", + "@mdx-js/react": "^1.6.21", + "chalk": "^4.1.0", + "clsx": "^1.1.1", + "copy-text-to-clipboard": "^3.0.0", + "fs-extra": "^9.1.0", + "globby": "^11.0.2", + "infima": "0.2.0-alpha.22", + "lodash": "^4.17.20", + "parse-numeric-range": "^1.2.0", + "postcss": "^7.0.2", + "prism-react-renderer": "^1.1.1", + "prismjs": "^1.23.0", + "prop-types": "^15.7.2", + "react-router-dom": "^5.2.0", + "rtlcss": "^2.6.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@docusaurus/theme-common": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.0.0-alpha.73.tgz", + "integrity": "sha512-ePteJFQkQRkK+J1FKDhmczq+yiEmORTW9YJgYceQVq+9L6unr0XxeOBBNC27BxSabUI+A9YXjQbtdmOHFM8LKA==", + "requires": { + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/plugin-content-blog": "2.0.0-alpha.73", + "@docusaurus/plugin-content-docs": "2.0.0-alpha.73", + "@docusaurus/plugin-content-pages": "2.0.0-alpha.73", + "@docusaurus/types": "2.0.0-alpha.73", + "tslib": "^2.1.0" + } + }, + "@docusaurus/theme-search-algolia": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.0.0-alpha.73.tgz", + "integrity": "sha512-SMfeGYZb85GIcuUjefMN+RunLDK+x6ETnlGuY9LU2S6bvoaZ4YTcqBPOt0iyZ1LH+XZmFuz78lFDW1gklaNmfg==", + "requires": { + "@docsearch/react": "^3.0.0-alpha.33", + "@docusaurus/core": "2.0.0-alpha.73", + "@docusaurus/theme-common": "2.0.0-alpha.73", + "@docusaurus/utils": "2.0.0-alpha.73", + "@docusaurus/utils-validation": "2.0.0-alpha.73", + "algoliasearch": "^4.8.4", + "algoliasearch-helper": "^3.3.4", + "clsx": "^1.1.1", + "eta": "^1.12.1", + "lodash": "^4.17.20" + } + }, + "@docusaurus/types": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/types/-/types-2.0.0-alpha.73.tgz", + "integrity": "sha512-+q7q178LS2mMTGD/U5KgloLGKtG8yzpqj+NOp2QprjFVqTfkwTFcMhN33PTZTUcDunMDuUt+LOo9hi9Vz9+r5Q==", + "requires": { + "@types/webpack": "^4.41.0", + "commander": "^5.1.0", + "joi": "^17.4.0", + "querystring": "0.2.0", + "webpack-merge": "^4.2.2" + } + }, + "@docusaurus/utils": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.0.0-alpha.73.tgz", + "integrity": "sha512-kUHnE1b/3yNWNAn0V8owLgCrxqyxfolkCbkPFfnRT+4m+agyn3riEcr+ZVObs7K9nxCla8oklX5RKSJGzyqWww==", + "requires": { + "@docusaurus/types": "2.0.0-alpha.73", + "@types/github-slugger": "^1.3.0", + "chalk": "^4.1.0", + "escape-string-regexp": "^4.0.0", + "fs-extra": "^9.1.0", + "gray-matter": "^4.0.2", + "lodash": "^4.17.20", + "resolve-pathname": "^3.0.0", + "tslib": "^2.1.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + } + } + }, + "@docusaurus/utils-validation": { + "version": "2.0.0-alpha.73", + "resolved": "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.0.0-alpha.73.tgz", + "integrity": "sha512-A36kKC+tCy/MGXdaK7emH2CHyHKru/+Td9zCm6fvNdNbu+dDNvEddTZ3ecjB0zNdDZM25Er4+KIo9GV3vnJ8Rg==", + "requires": { + "@docusaurus/utils": "2.0.0-alpha.73", + "chalk": "^4.1.0", + "joi": "^17.4.0", + "tslib": "^2.1.0" + } + }, + "@endiliey/static-site-generator-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@endiliey/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-3MBqYCs30qk1OBRC697NqhGouYbs71D1B8hrk/AFJC6GwF2QaJOQZtA1JYAaGSe650sZ8r5ppRTtCRXepDWlng==", + "requires": { + "bluebird": "^3.7.1", + "cheerio": "^0.22.0", + "eval": "^0.1.4", + "url": "^0.11.0", + "webpack-sources": "^1.4.3" + } + }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==" + }, + "@hapi/hoek": { + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz", + "integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==" + }, + "@hapi/topo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@mdx-js/mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz", + "integrity": "sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==", + "requires": { + "@babel/core": "7.12.9", + "@babel/plugin-syntax-jsx": "7.12.1", + "@babel/plugin-syntax-object-rest-spread": "7.8.3", + "@mdx-js/util": "1.6.22", + "babel-plugin-apply-mdx-type-prop": "1.6.22", + "babel-plugin-extract-import-names": "1.6.22", + "camelcase-css": "2.0.1", + "detab": "2.0.4", + "hast-util-raw": "6.0.1", + "lodash.uniq": "4.5.0", + "mdast-util-to-hast": "10.0.1", + "remark-footnotes": "2.0.0", + "remark-mdx": "1.6.22", + "remark-parse": "8.0.3", + "remark-squeeze-paragraphs": "4.0.0", + "style-to-object": "0.3.0", + "unified": "9.2.0", + "unist-builder": "2.0.3", + "unist-util-visit": "2.0.3" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "@mdx-js/react": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz", + "integrity": "sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==", + "requires": {} + }, + "@mdx-js/util": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", + "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==" + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz", + "integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==", + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "@polka/url": { + "version": "1.0.0-next.21", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", + "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" + }, + "@sideway/address": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz", + "integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==", + "requires": { + "@hapi/hoek": "^9.0.0" + } + }, + "@sideway/formula": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.0.tgz", + "integrity": "sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==" + }, + "@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==" + }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==" + }, + "@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==" + }, + "@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==" + }, + "@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==" + }, + "@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==" + }, + "@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==" + }, + "@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==" + }, + "@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==" + }, + "@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "requires": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + } + }, + "@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "requires": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + } + }, + "@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "requires": { + "@babel/types": "^7.12.6" + } + }, + "@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "requires": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + } + }, + "@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "requires": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + } + }, + "@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "requires": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + } + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/github-slugger": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@types/github-slugger/-/github-slugger-1.3.0.tgz", + "integrity": "sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==" + }, + "@types/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-w+LsMxKyYQm347Otw+IfBXOv9UWVjpHpCDdbBMt8Kz/xbvCYNjP+0qPh91Km3iKfSRLBB0P7fAMf0KHrPu+MyA==", + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "requires": { + "@types/unist": "*" + } + }, + "@types/html-minifier-terser": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.2.tgz", + "integrity": "sha512-h4lTMgMJctJybDp8CQrxTUiiYmedihHWkjnF/8Pxseu2S6Nlfcy8kwboQ8yejh456rP2yWoEVm1sS/FVsfM48w==" + }, + "@types/json-schema": { + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", + "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" + }, + "@types/mdast": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz", + "integrity": "sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==", + "requires": { + "@types/unist": "*" + } + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==" + }, + "@types/node": { + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.11.0.tgz", + "integrity": "sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg==" + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "@types/parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz", + "integrity": "sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==" + }, + "@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "@types/sax": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@types/sax/-/sax-1.2.3.tgz", + "integrity": "sha512-+QSw6Tqvs/KQpZX8DvIl3hZSjNFLW/OqE5nlyHXtTwODaJvioN2rOWpBNEWZp2HZUFhOh+VohmJku/WxEXU2XA==", + "requires": { + "@types/node": "*" + } + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==" + }, + "@types/tapable": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", + "integrity": "sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==" + }, + "@types/uglify-js": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.13.1.tgz", + "integrity": "sha512-O3MmRAk6ZuAKa9CHgg0Pr0+lUOqoMLpc9AS4R8ano2auvsg7IE8syF3Xh/NPr26TWklxYcqoEEFdzLLs1fV9PQ==", + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/unist": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.6.tgz", + "integrity": "sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==" + }, + "@types/webpack": { + "version": "4.41.31", + "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.31.tgz", + "integrity": "sha512-/i0J7sepXFIp1ZT7FjUGi1eXMCg8HCCzLJEQkKsOtbJFontsJLolBcDC+3qxn5pPwiCt1G0ZdRmYRzNBtvpuGQ==", + "requires": { + "@types/node": "*", + "@types/tapable": "^1", + "@types/uglify-js": "*", + "@types/webpack-sources": "*", + "anymatch": "^3.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "@types/webpack-sources": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz", + "integrity": "sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==", + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.7.3" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==" + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==" + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==" + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==" + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==" + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==" + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "address": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.1.2.tgz", + "integrity": "sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==" + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "requires": {} + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "requires": {} + }, + "algoliasearch": { + "version": "4.10.5", + "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.10.5.tgz", + "integrity": "sha512-KmH2XkiN+8FxhND4nWFbQDkIoU6g2OjfeU9kIv4Lb+EiOOs3Gpp7jvd+JnatsCisAZsnWQdjd7zVlW7I/85QvQ==", + "requires": { + "@algolia/cache-browser-local-storage": "4.10.5", + "@algolia/cache-common": "4.10.5", + "@algolia/cache-in-memory": "4.10.5", + "@algolia/client-account": "4.10.5", + "@algolia/client-analytics": "4.10.5", + "@algolia/client-common": "4.10.5", + "@algolia/client-personalization": "4.10.5", + "@algolia/client-search": "4.10.5", + "@algolia/logger-common": "4.10.5", + "@algolia/logger-console": "4.10.5", + "@algolia/requester-browser-xhr": "4.10.5", + "@algolia/requester-common": "4.10.5", + "@algolia/requester-node-http": "4.10.5", + "@algolia/transporter": "4.10.5" + } + }, + "algoliasearch-helper": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.6.0.tgz", + "integrity": "sha512-F4Smiq+Vyv/JJytuKNFuzXndPSb4pjtiHZSkEztQCcB+SORu71A8grgt2NSJhbB5VhqHW19QDtlPKbdYdcNrLg==", + "requires": { + "events": "^1.1.1" + }, + "dependencies": { + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + } + } + }, + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=" + }, + "ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "requires": { + "string-width": "^4.1.0" + } + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "requires": { + "type-fest": "^0.21.3" + }, + "dependencies": { + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==" + } + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "arg": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.1.tgz", + "integrity": "sha512-e0hDa9H2Z9AwFkk2qDlwhoMYE4eToKarchkQHovNdLTCYMHZHeRjI71crOh+dio4K6u1IcwubQqo79Ga4CyAQA==" + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==" + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==" + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" + }, + "at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" + }, + "autoprefixer": { + "version": "10.3.7", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.7.tgz", + "integrity": "sha512-EmGpu0nnQVmMhX8ROoJ7Mx8mKYPlcUHuxkwrRYEYMz85lu7H09v8w6R1P0JPdn/hKU32GjpLBFEOuIlDWCRWvg==", + "requires": { + "browserslist": "^4.17.3", + "caniuse-lite": "^1.0.30001264", + "fraction.js": "^4.1.1", + "normalize-range": "^0.1.2", + "picocolors": "^0.2.1", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + } + } + }, + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "requires": { + "follow-redirects": "^1.14.0" + } + }, + "babel-loader": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz", + "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==", + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-apply-mdx-type-prop": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz", + "integrity": "sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4", + "@mdx-js/util": "1.6.22" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz", + "integrity": "sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ==", + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-extract-import-names": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz", + "integrity": "sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==", + "requires": { + "@babel/helper-plugin-utils": "7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + } + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz", + "integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==", + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.2.2", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.5.tgz", + "integrity": "sha512-ninF5MQNwAX9Z7c9ED+H2pGt1mXdP4TqzlHKyPIYmJIYz0N+++uwdM7RnJukklhzJ54Q84vA4ZJkgs7lu5vqcw==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2", + "core-js-compat": "^3.16.2" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz", + "integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==", + "requires": { + "@babel/helper-define-polyfill-provider": "^0.2.2" + } + }, + "bail": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==" + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base16": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz", + "integrity": "sha1-4pf2DX7BAUp6lxo568ipjAtoHnA=" + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=" + }, + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bn.js": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", + "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + }, + "dependencies": { + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + } + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.4.tgz", + "integrity": "sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ==", + "requires": { + "caniuse-lite": "^1.0.30001265", + "electron-to-chromium": "^1.3.867", + "escalade": "^3.1.1", + "node-releases": "^2.0.0", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==" + }, + "buffer-json": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-json/-/buffer-json-2.0.0.tgz", + "integrity": "sha512-+jjPFVqyfF1esi9fvfUs3NqM0pH1ziZ36VP4hmA/y/Ssfo/5w5xHKfTw9BwQjoJ1w/oVtpLomqwUHKdefGyuHw==" + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "cache-loader": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cache-loader/-/cache-loader-4.1.0.tgz", + "integrity": "sha512-ftOayxve0PwKzBF/GLsZNC9fJBXl8lkZE3TOsjkboHfVHVkL39iUEs1FO07A33mizmci5Dudt38UZrrYXDtbhw==", + "requires": { + "buffer-json": "^2.0.0", + "find-cache-dir": "^3.0.0", + "loader-utils": "^1.2.3", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "schema-utils": "^2.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "requires": { + "callsites": "^2.0.0" + }, + "dependencies": { + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=" + } + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", + "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==" + }, + "caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001267", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz", + "integrity": "sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg==" + }, + "ccount": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", + "integrity": "sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==" + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==" + }, + "character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==" + }, + "character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==" + }, + "cheerio": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-0.22.0.tgz", + "integrity": "sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "^3.9.1", + "lodash.assignin": "^4.0.9", + "lodash.bind": "^4.1.4", + "lodash.defaults": "^4.0.1", + "lodash.filter": "^4.4.0", + "lodash.flatten": "^4.2.0", + "lodash.foreach": "^4.3.0", + "lodash.map": "^4.4.0", + "lodash.merge": "^4.4.0", + "lodash.pick": "^4.2.1", + "lodash.reduce": "^4.4.0", + "lodash.reject": "^4.4.0", + "lodash.some": "^4.4.0" + }, + "dependencies": { + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==" + }, + "dom-serializer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", + "requires": { + "domelementtype": "^1.3.0", + "entities": "^1.1.1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" + }, + "ci-info": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", + "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==" + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.2.1.tgz", + "integrity": "sha512-ooQCa1/70oRfVdUUGjKpbHuxgMgm8BsDT5EBqBGvPxMoRoGXf4PNx5mMnkjzJ9Ptx4vvmDdha0QVh86QtYIk1g==", + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==" + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + } + } + } + }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "clsx": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.1.1.tgz", + "integrity": "sha512-6/bPho624p3S2pMyvP5kKBPXnI3ufHLObBFCfgx+LkeR5lg2XYy2hqZqUf45ypD8COn2bhgGJSUE+l5dhNBieA==" + }, + "coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "requires": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "collapse-white-space": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==" + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, + "color": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", + "requires": { + "color-convert": "^1.9.3", + "color-string": "^1.6.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.6.0.tgz", + "integrity": "sha512-c/hGS+kRWJutUBEngKKmk4iH3sD59MBkoxVapS/0wgpCz2u7XsNloxknyvBhzwEs1IbV36D9PwqLPJ2DTu3vMA==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } + }, + "combine-promises": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz", + "integrity": "sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==" + }, + "comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==" + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "consola": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", + "integrity": "sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==" + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" + }, + "copy-text-to-clipboard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.0.1.tgz", + "integrity": "sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==" + }, + "copy-webpack-plugin": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.4.1.tgz", + "integrity": "sha512-MXyPCjdPVx5iiWyl40Va3JGh27bKzOTNY3NjUTrosD2q7dR/cLD0013uqJ3BpFbUjyONINjb6qI7nDIJujrMbA==", + "requires": { + "cacache": "^15.0.5", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "core-js": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.18.3.tgz", + "integrity": "sha512-tReEhtMReZaPFVw7dajMx0vlsz3oOb8ajgPoHVYGxr8ErnZ6PcYEvvmjGmXlfpnxpkYSdOQttjB+MvVbCGfvLw==" + }, + "core-js-compat": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.18.3.tgz", + "integrity": "sha512-4zP6/y0a2RTHN5bRGT7PTq9lVt3WzvffTNjqnTKsXhkAYNDTkdCLOIfAdOLcQ/7TDdyRj3c+NeHe1NmF1eDScw==", + "requires": { + "browserslist": "^4.17.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" + } + } + }, + "core-js-pure": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.18.3.tgz", + "integrity": "sha512-qfskyO/KjtbYn09bn1IPkuhHl5PlJ6IzJ9s9sraJ1EqcuGyLGKzhSM1cY0zgyL9hx42eulQLZ6WaeK5ycJCkqw==" + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-fetch": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.4.tgz", + "integrity": "sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ==", + "requires": { + "node-fetch": "2.6.1" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, + "css-color-names": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz", + "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=" + }, + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-loader": { + "version": "5.2.7", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz", + "integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==", + "requires": { + "icss-utils": "^5.1.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.5" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==" + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" + }, + "cssnano": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.11.tgz", + "integrity": "sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g==", + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.8", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-preset-advanced": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-4.0.8.tgz", + "integrity": "sha512-DlZ5+XNKwB3ZnrtJ7jdj8WxT5Zgt1WIr4gdP9v1Sdn3SObqcLwbBobQaM7BqLIVHS74TE5iWn2TSYmOVSsmozQ==", + "requires": { + "autoprefixer": "^9.4.7", + "cssnano-preset-default": "^4.0.8", + "postcss-discard-unused": "^4.0.1", + "postcss-merge-idents": "^4.0.1", + "postcss-reduce-idents": "^4.0.2", + "postcss-zindex": "^4.0.1" + }, + "dependencies": { + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-preset-default": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz", + "integrity": "sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ==", + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.3", + "postcss-unique-selectors": "^4.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=" + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=" + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==" + }, + "csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "requires": { + "css-tree": "^1.1.2" + }, + "dependencies": { + "css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "requires": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "detab": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz", + "integrity": "sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==", + "requires": { + "repeat-string": "^1.5.4" + } + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "detect-port": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.3.0.tgz", + "integrity": "sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=" + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "requires": { + "utila": "~0.4" + } + }, + "dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "requires": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + }, + "dependencies": { + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + } + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==" + }, + "domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "electron-to-chromium": { + "version": "1.3.870", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz", + "integrity": "sha512-PiJMshfq6PL+i1V+nKLwhHbCKeD8eAz8rvO9Cwk/7cChOHJBtufmjajLyYLsSRHguRFiOCVx3XzJLeZsIAYfSA==" + }, + "elliptic": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", + "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "requires": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" + }, + "emoticon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz", + "integrity": "sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "enhanced-resolve": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz", + "integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==", + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + } + } + }, + "es-abstract": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz", + "integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-symbols": "^1.0.2", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.1", + "is-string": "^1.0.7", + "is-weakref": "^1.0.1", + "object-inspect": "^1.11.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.4", + "string.prototype.trimstart": "^1.0.4", + "unbox-primitive": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz", + "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==" + } + } + }, + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "eta": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/eta/-/eta-1.12.3.tgz", + "integrity": "sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "eval": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eval/-/eval-0.1.6.tgz", + "integrity": "sha512-o0XUw+5OGkXw4pJZzQoXUk+H87DHuC+7ZE//oSrRGtatTmr12oTnLfg6QOq9DyTt0c/p4TwzgmkKrBzWTSizyQ==", + "requires": { + "require-like": ">= 0.1.1" + } + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" + }, + "eventsource": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", + "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fast-url-parser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz", + "integrity": "sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=", + "requires": { + "punycode": "^1.3.2" + } + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "fbemitter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz", + "integrity": "sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==", + "requires": { + "fbjs": "^3.0.0" + } + }, + "fbjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-3.0.0.tgz", + "integrity": "sha512-dJd4PiDOFuhe7vk4F80Mba83Vr2QuK86FoxtgPmzBqEJahncp+13YCmfoa53KHCo6OnlXLG7eeMWPfB5CrpVKg==", + "requires": { + "cross-fetch": "^3.0.4", + "fbjs-css-vars": "^1.0.0", + "loose-envify": "^1.0.0", + "object-assign": "^4.1.0", + "promise": "^7.1.1", + "setimmediate": "^1.0.5", + "ua-parser-js": "^0.7.18" + } + }, + "fbjs-css-vars": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", + "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" + }, + "feed": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz", + "integrity": "sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==", + "requires": { + "xml-js": "^1.6.11" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "filesize": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz", + "integrity": "sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==" + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "flux": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/flux/-/flux-4.0.2.tgz", + "integrity": "sha512-u/ucO5ezm3nBvdaSGkWpDlzCePoV+a9x3KHmy13TV/5MzOaCZDN8Mfd94jmf0nOi8ZZay+nOKbBUkOe2VNaupQ==", + "requires": { + "fbemitter": "^3.0.0", + "fbjs": "^3.0.0" + } + }, + "follow-redirects": { + "version": "1.14.4", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.4.tgz", + "integrity": "sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g==" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "fork-ts-checker-webpack-plugin": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-4.1.6.tgz", + "integrity": "sha512-DUxuQaKoqfNne8iikd14SAkh5uw4+8vNifp6gmA73yYNS6ywLIWSLD/n/mBzHQRpW3J7rbATEakmiA8JvkTyZw==", + "requires": { + "@babel/code-frame": "^7.5.5", + "chalk": "^2.4.1", + "micromatch": "^3.1.10", + "minimatch": "^3.0.4", + "semver": "^5.6.0", + "tapable": "^1.0.0", + "worker-rpc": "^0.1.0" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fraction.js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz", + "integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==" + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "requires": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gensync": { + "version": "1.0.0-beta.2", + "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.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" + }, + "github-slugger": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", + "integrity": "sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==" + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "requires": { + "is-glob": "^4.0.1" + } + }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "requires": { + "ini": "2.0.0" + }, + "dependencies": { + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" + } + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "requires": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, + "globby": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz", + "integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, + "graceful-fs": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", + "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + }, + "gray-matter": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", + "integrity": "sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==", + "requires": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + } + }, + "gzip-size": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz", + "integrity": "sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA==", + "requires": { + "duplexer": "^0.1.1", + "pify": "^4.0.1" + } + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz", + "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hast-to-hyperscript": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz", + "integrity": "sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==", + "requires": { + "@types/unist": "^2.0.3", + "comma-separated-tokens": "^1.0.0", + "property-information": "^5.3.0", + "space-separated-tokens": "^1.0.0", + "style-to-object": "^0.3.0", + "unist-util-is": "^4.0.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-from-parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz", + "integrity": "sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==", + "requires": { + "@types/parse5": "^5.0.0", + "hastscript": "^6.0.0", + "property-information": "^5.0.0", + "vfile": "^4.0.0", + "vfile-location": "^3.2.0", + "web-namespaces": "^1.0.0" + } + }, + "hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==" + }, + "hast-util-raw": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz", + "integrity": "sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==", + "requires": { + "@types/hast": "^2.0.0", + "hast-util-from-parse5": "^6.0.0", + "hast-util-to-parse5": "^6.0.0", + "html-void-elements": "^1.0.0", + "parse5": "^6.0.0", + "unist-util-position": "^3.0.0", + "vfile": "^4.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hast-util-to-parse5": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz", + "integrity": "sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==", + "requires": { + "hast-to-hyperscript": "^9.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.0.0", + "xtend": "^4.0.0", + "zwitch": "^1.0.0" + } + }, + "hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "requires": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" + }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==" + }, + "history": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/history/-/history-4.10.1.tgz", + "integrity": "sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==", + "requires": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=" + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=" + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==" + }, + "html-minifier-terser": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg==", + "requires": { + "camel-case": "^4.1.1", + "clean-css": "^4.2.3", + "commander": "^4.1.1", + "he": "^1.2.0", + "param-case": "^3.0.3", + "relateurl": "^0.2.7", + "terser": "^4.6.3" + }, + "dependencies": { + "clean-css": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", + "requires": { + "source-map": "~0.6.0" + } + }, + "commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "html-tags": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==" + }, + "html-void-elements": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz", + "integrity": "sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==" + }, + "html-webpack-plugin": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.2.tgz", + "integrity": "sha512-q5oYdzjKUIPQVjOosjgvCHQOv9Ett9CYYHlgvJeXG0qQvdSojnBq4vAdQBwn1+yGveAwHCoe/rMR86ozX3+c2A==", + "requires": { + "@types/html-minifier-terser": "^5.0.0", + "@types/tapable": "^1.0.5", + "@types/webpack": "^4.41.8", + "html-minifier-terser": "^5.0.1", + "loader-utils": "^1.2.3", + "lodash": "^4.17.20", + "pretty-error": "^2.1.1", + "tapable": "^1.1.3", + "util.promisify": "1.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } + } + } + }, + "htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "requires": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" + } + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "http-parser-js": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.3.tgz", + "integrity": "sha512-t7hjvef/5HEK7RWTdUzVUhl8zkEu+LlaE0IYzdMuvbSDipxBRpOn4Uhw8ZyECEa808iVT8XCjzo6xmYt4CiLZg==" + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==" + }, + "immer": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz", + "integrity": "sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA==" + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=" + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" + }, + "infima": { + "version": "0.2.0-alpha.22", + "resolved": "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.22.tgz", + "integrity": "sha512-wKOWp4C1lTFG/h54UWD3Uf6VEsj5qYehM3ZVio3GBzIQuY8B3cTiwG7ZRNoobg+LvdQA21p5BJTugpTLQJLIrA==" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inline-style-parser": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", + "integrity": "sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==" + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "is-absolute-url": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", + "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==" + }, + "is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "requires": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + } + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==" + }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "requires": { + "ci-info": "^2.0.0" + }, + "dependencies": { + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + } + } + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", + "requires": { + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" + } + }, + "is-core-module": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", + "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==" + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=" + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==" + }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==" + }, + "is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==" + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-object": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz", + "integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==" + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "requires": { + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "requires": { + "path-is-inside": "^1.0.2" + } + } + } + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==" + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "requires": { + "isobject": "^3.0.1" + } + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=" + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" + }, + "is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==" + }, + "is-shared-array-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz", + "integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-weakref": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz", + "integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==", + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-whitespace-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==" + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-word-character": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==" + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } + }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "dependencies": { + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "joi": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz", + "integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==", + "requires": { + "@hapi/hoek": "^9.0.0", + "@hapi/topo": "^5.0.0", + "@sideway/address": "^4.1.0", + "@sideway/formula": "^3.0.0", + "@sideway/pinpoint": "^2.0.0" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "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-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==" + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==" + }, + "kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" + }, + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" + }, + "klona": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz", + "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==" + }, + "last-call-webpack-plugin": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/last-call-webpack-plugin/-/last-call-webpack-plugin-3.0.0.tgz", + "integrity": "sha512-7KI2l2GIZa9p2spzPIVZBYyNKkN+e/SQPpnjlTiPhdbDW3F86tdKKELxKpzJ5sgU19wQWsACULZmpTPYHeWO5w==", + "requires": { + "lodash": "^4.17.5", + "webpack-sources": "^1.1.0" + } + }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==" + }, + "lines-and-columns": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", + "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==" + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=" + }, + "lodash.bind": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", + "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" + }, + "lodash.curry": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz", + "integrity": "sha1-JI42By7ekGUB11lmIAqG2riyMXA=" + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=" + }, + "lodash.defaults": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", + "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=" + }, + "lodash.filter": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.filter/-/lodash.filter-4.6.0.tgz", + "integrity": "sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=" + }, + "lodash.flatten": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", + "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=" + }, + "lodash.flow": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz", + "integrity": "sha1-h79AKSuM+D5OjOGjrkIJ4gBxZ1o=" + }, + "lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" + }, + "lodash.map": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", + "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=" + }, + "lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" + }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" + }, + "lodash.reduce": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", + "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + }, + "lodash.reject": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.reject/-/lodash.reject-4.6.0.tgz", + "integrity": "sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=" + }, + "lodash.some": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.some/-/lodash.some-4.6.0.tgz", + "integrity": "sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "requires": { + "tslib": "^2.0.3" + } + }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==" + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "mdast-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==", + "requires": { + "unist-util-remove": "^2.0.0" + } + }, + "mdast-util-definitions": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz", + "integrity": "sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-hast": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz", + "integrity": "sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==", + "requires": { + "@types/mdast": "^3.0.0", + "@types/unist": "^2.0.0", + "mdast-util-definitions": "^4.0.0", + "mdurl": "^1.0.0", + "unist-builder": "^2.0.0", + "unist-util-generated": "^1.0.0", + "unist-util-position": "^3.0.0", + "unist-util-visit": "^2.0.0" + } + }, + "mdast-util-to-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz", + "integrity": "sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==" + }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "microevent.ts": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/microevent.ts/-/microevent.ts-0.1.1.tgz", + "integrity": "sha512-jo1OfR4TaEwd5HOrt5+tAZ9mqT4jmpNAusXtyfNzqVm9uiSYFZlKM1wYL4oU7azZW/PxQW53wM0S6OR1JHNa2g==" + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.50.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", + "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + }, + "mime-types": { + "version": "2.1.33", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", + "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "requires": { + "mime-db": "1.50.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "mini-create-react-context": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/mini-create-react-context/-/mini-create-react-context-0.4.1.tgz", + "integrity": "sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==", + "requires": { + "@babel/runtime": "^7.12.1", + "tiny-warning": "^1.0.3" + } + }, + "mini-css-extract-plugin": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.2.tgz", + "integrity": "sha512-a3Y4of27Wz+mqK3qrcd3VhYz6cU0iW5x3Sgvqzbj+XmlrSizmvu8QQMl5oMYJjgHOC4iyt+w7l4umP+dQeW3bw==", + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minipass": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz", + "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "module-alias": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/module-alias/-/module-alias-2.2.2.tgz", + "integrity": "sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q==" + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=" + }, + "nanoid": { + "version": "3.1.30", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz", + "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node-emoji": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", + "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", + "requires": { + "lodash": "^4.17.21" + } + }, + "node-fetch": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz", + "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==" + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + } + } + }, + "node-releases": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.0.tgz", + "integrity": "sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA==" + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=" + }, + "normalize-url": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==" + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + } + } + }, + "nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha1-y480xTIT2JVyP8urkH6UIq28r7E=" + }, + "nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "requires": { + "boolbase": "~1.0.0" + } + }, + "null-loader": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/null-loader/-/null-loader-4.0.1.tgz", + "integrity": "sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz", + "integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==" + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.3.tgz", + "integrity": "sha512-VdDoCwvJI4QdC6ndjpqFmoL3/+HxffFBbcJzKi5hwLLqqx3mdbedRpfZDdK0SrOSauj8X4GzBvnDZl4vTN7dOw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz", + "integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, + "opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==" + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "requires": { + "is-wsl": "^1.1.0" + }, + "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + } + } + }, + "optimize-css-assets-webpack-plugin": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/optimize-css-assets-webpack-plugin/-/optimize-css-assets-webpack-plugin-5.0.8.tgz", + "integrity": "sha512-mgFS1JdOtEGzD8l+EuISqL57cKO+We9GcoiQEmdCWRqqck+FGNmYJtx9qfAPzEz+lRrlThWMuGDaRkI/yWNx/Q==", + "requires": { + "cssnano": "^4.1.10", + "last-call-webpack-plugin": "^3.0.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "requires": { + "retry": "^0.12.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "requires": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-numeric-range": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", + "integrity": "sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==" + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, + "pbkdf2": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", + "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", + "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "pnp-webpack-plugin": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/pnp-webpack-plugin/-/pnp-webpack-plugin-1.7.0.tgz", + "integrity": "sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==", + "requires": { + "ts-pnp": "^1.1.6" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "postcss": { + "version": "8.3.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.9.tgz", + "integrity": "sha512-f/ZFyAKh9Dnqytx5X62jgjhhzttjZS7hMsohcI7HEI5tjELX/HxCy3EFhsRxyzGvrzFF+82XPvCS8T9TFleVJw==", + "requires": { + "nanoid": "^3.1.28", + "picocolors": "^0.2.1", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + } + } + }, + "postcss-calc": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.5.tgz", + "integrity": "sha512-1tKHutbGtLtEZF6PT4JSihCHfIVldU72mZ8SdZHIYriIZ9fh9k9aWSppaT8rHsyI3dX+KSR+W+Ix9BMY3AODrg==", + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", + "requires": { + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-discard-unused": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-4.0.1.tgz", + "integrity": "sha512-/3vq4LU0bLH2Lj4NYN7BTf2caly0flUB7Xtrk9a5K3yLuXMkHMqMO/x3sDq8W2b1eQFSCyY0IVz2L+0HP8kUUA==", + "requires": { + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz", + "integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==", + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.4", + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0", + "semver": "^7.3.4" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "postcss-merge-idents": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-4.0.1.tgz", + "integrity": "sha512-43S/VNdF6II0NZ31YxcvNYq4gfURlPAAsJW/z84avBXQCaP4I4qRHUH18slW/SOlJbcxxCobflPNUApYDddS7A==", + "requires": { + "cssnano-util-same-parent": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", + "requires": { + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", + "requires": { + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", + "requires": { + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "requires": { + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-url": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", + "requires": { + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", + "requires": { + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-idents": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-4.0.2.tgz", + "integrity": "sha512-Tz70Ri10TclPoCtFfftjFVddx3fZGUkr0dEDbIEfbYhFUOFQZZ77TEqRrU0e6TvAvF+Wa5VVzYTpFpq0uwFFzw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-reduce-transforms": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", + "requires": { + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-selector-parser": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz", + "integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==", + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-sort-media-queries": { + "version": "1.31.21", + "resolved": "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-1.31.21.tgz", + "integrity": "sha512-h+HbXXfOVFeLvCJOzl/Z9SqQ25MNpG/73k71756ftisaaJy75h06/Dn6KOwC4OCMN10ewT2PXMzHV03JNKwBbg==", + "requires": { + "postcss": "^7.0.27", + "sort-css-media-queries": "1.5.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-svgo": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.3.tgz", + "integrity": "sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw==", + "requires": { + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==" + }, + "postcss-zindex": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-4.0.1.tgz", + "integrity": "sha512-d/8BlQcUdEugZNRM9AdCA2V4fqREUtn/wcixLN3L6ITgc2P/FMcVVYz8QZkhItWT9NB5qr8wuN2dJCE4/+dlrA==", + "requires": { + "has": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "pretty-error": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", + "requires": { + "lodash": "^4.17.20", + "renderkid": "^2.0.4" + } + }, + "pretty-time": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz", + "integrity": "sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==" + }, + "prism-react-renderer": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.2.1.tgz", + "integrity": "sha512-w23ch4f75V1Tnz8DajsYKvY5lF7H1+WvzvLUcF0paFxkTHSp42RS0H5CttdN2Q8RR3DRGZ9v5xD/h3n8C8kGmg==", + "requires": {} + }, + "prismjs": { + "version": "1.25.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.25.0.tgz", + "integrity": "sha512-WCjJHl1KEWbnkQom1+SzftbtXMKQoezOCYs5rECqMN+jP+apI7ftoflyqigqzopSO3hMhTEb0mFClA8lkolgEg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" + }, + "prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "prop-types": { + "version": "15.7.2", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz", + "integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.8.1" + } + }, + "property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "requires": { + "xtend": "^4.0.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", + "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "requires": { + "escape-goat": "^2.0.0" + } + }, + "pure-color": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz", + "integrity": "sha1-H+Bk+wrIUfDeYTIKi/eWg2Qi8z4=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "react": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", + "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "react-base16-styling": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz", + "integrity": "sha1-7yFW1mz0E5aVyKFniGy2nqZgeSw=", + "requires": { + "base16": "^1.0.0", + "lodash.curry": "^4.0.1", + "lodash.flow": "^3.3.0", + "pure-color": "^1.2.0" + } + }, + "react-dev-utils": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz", + "integrity": "sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A==", + "requires": { + "@babel/code-frame": "7.10.4", + "address": "1.1.2", + "browserslist": "4.14.2", + "chalk": "2.4.2", + "cross-spawn": "7.0.3", + "detect-port-alt": "1.1.6", + "escape-string-regexp": "2.0.0", + "filesize": "6.1.0", + "find-up": "4.1.0", + "fork-ts-checker-webpack-plugin": "4.1.6", + "global-modules": "2.0.0", + "globby": "11.0.1", + "gzip-size": "5.1.1", + "immer": "8.0.1", + "is-root": "2.1.0", + "loader-utils": "2.0.0", + "open": "^7.0.2", + "pkg-up": "3.1.0", + "prompts": "2.4.0", + "react-error-overlay": "^6.0.9", + "recursive-readdir": "2.2.2", + "shell-quote": "1.7.2", + "strip-ansi": "6.0.0", + "text-table": "0.2.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "browserslist": { + "version": "4.14.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.2.tgz", + "integrity": "sha512-HI4lPveGKUR0x2StIz+2FXfDk9SfVMrxn6PLh1JeGUwcuoDkdKZebWiyLRJ68iIPDpMI4JLVDf7S7XzslgWOhw==", + "requires": { + "caniuse-lite": "^1.0.30001125", + "electron-to-chromium": "^1.3.564", + "escalade": "^3.0.2", + "node-releases": "^1.1.61" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "requires": { + "address": "^1.0.1", + "debug": "^2.6.0" + } + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "globby": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.1.tgz", + "integrity": "sha512-iH9RmgwCmUJHi2z5o2l3eTtGBtXek1OYlHrbcxOYugyHLmAsZrPj43OtHThd62Buh/Vv6VyCBD2bdyWcGNQqoQ==", + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-releases": { + "version": "1.1.77", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.77.tgz", + "integrity": "sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ==" + }, + "prompts": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.0.tgz", + "integrity": "sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ==", + "requires": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "react-dom": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", + "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1", + "scheduler": "^0.20.2" + } + }, + "react-error-overlay": { + "version": "6.0.9", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz", + "integrity": "sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==" + }, + "react-fast-compare": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.0.tgz", + "integrity": "sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==" + }, + "react-helmet": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-6.1.0.tgz", + "integrity": "sha512-4uMzEY9nlDlgxr61NL3XbKRy1hEkXmKNXhjbAIOVw5vcFrsdYbH2FEwcNyWvWinl103nXgzYNlns9ca+8kFiWw==", + "requires": { + "object-assign": "^4.1.1", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.1.1", + "react-side-effect": "^2.1.0" + } + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-json-view": { + "version": "1.21.3", + "resolved": "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz", + "integrity": "sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==", + "requires": { + "flux": "^4.0.1", + "react-base16-styling": "^0.6.0", + "react-lifecycles-compat": "^3.0.4", + "react-textarea-autosize": "^8.3.2" + } + }, + "react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "react-loadable": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-loadable/-/react-loadable-5.5.0.tgz", + "integrity": "sha512-C8Aui0ZpMd4KokxRdVAm2bQtI03k2RMRNzOB+IipV3yxFTSVICv7WoUr5L9ALB5BmKO1iHgZtWM8EvYG83otdg==", + "requires": { + "prop-types": "^15.5.0" + } + }, + "react-loadable-ssr-addon": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/react-loadable-ssr-addon/-/react-loadable-ssr-addon-0.3.0.tgz", + "integrity": "sha512-E+lnmDakV0k6ut6R2J77vurwCOwTKEwKlHs9S62G8ez+ujecLPcqjt3YAU8M58kIGjp2QjFlZ7F9QWkq/mr6Iw==", + "requires": { + "@babel/runtime": "^7.10.3" + } + }, + "react-router": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.2.1.tgz", + "integrity": "sha512-lIboRiOtDLFdg1VTemMwud9vRVuOCZmUIT/7lUoZiSpPODiiH1UQlfXy+vPLC/7IWdFYnhRwAyNqA/+I7wnvKQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "mini-create-react-context": "^0.4.0", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "react-router-config": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz", + "integrity": "sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==", + "requires": { + "@babel/runtime": "^7.1.2" + } + }, + "react-router-dom": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.0.tgz", + "integrity": "sha512-ObVBLjUZsphUUMVycibxgMdh5jJ1e3o+KpAZBVeHcNQZ4W+uUGGWsokurzlF4YOldQYRQL4y6yFRWM4m3svmuQ==", + "requires": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.2.1", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + } + }, + "react-side-effect": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-2.1.1.tgz", + "integrity": "sha512-2FoTQzRNTncBVtnzxFOk2mCpcfxQpenBMbk5kSVBg5UcPqV9fRbgY2zhb7GTWWOlpFmAxhClBDlIq8Rsubz1yQ==", + "requires": {} + }, + "react-textarea-autosize": { + "version": "8.3.3", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.3.3.tgz", + "integrity": "sha512-2XlHXK2TDxS6vbQaoPbMOfQ8GK7+irc2fVK6QFIcC8GOnH3zI/v481n+j1L0WaPVvKxwesnY93fEfH++sus2rQ==", + "requires": { + "@babel/runtime": "^7.10.2", + "use-composed-ref": "^1.0.0", + "use-latest": "^1.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "reading-time": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz", + "integrity": "sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==" + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "^1.1.6" + } + }, + "recursive-readdir": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.2.tgz", + "integrity": "sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==", + "requires": { + "minimatch": "3.0.4" + } + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==" + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + } + } + }, + "rehype-parse": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/rehype-parse/-/rehype-parse-6.0.2.tgz", + "integrity": "sha512-0S3CpvpTAgGmnz8kiCyFLGuW5yA4OQhyNTm/nwPopZ7+PI11WnGl1TTWTGv/2hPEe/g2jRLlhVVSsoDH8waRug==", + "requires": { + "hast-util-from-parse5": "^5.0.0", + "parse5": "^5.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "hast-util-from-parse5": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-5.0.3.tgz", + "integrity": "sha512-gOc8UB99F6eWVWFtM9jUikjN7QkWxB3nY0df5Z0Zq1/Nkwl5V4hAAsl0tmwlgWl/1shlTF8DnNYLO8X6wRV9pA==", + "requires": { + "ccount": "^1.0.3", + "hastscript": "^5.0.0", + "property-information": "^5.0.0", + "web-namespaces": "^1.1.2", + "xtend": "^4.0.1" + } + }, + "hastscript": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-5.1.2.tgz", + "integrity": "sha512-WlztFuK+Lrvi3EggsqOkQ52rKbxkXL3RwB6t5lwoa8QLMemoWfBuL43eDrwOamJyR7uKQKdmKYaBH1NZBiIRrQ==", + "requires": { + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + } + }, + "parse5": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", + "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" + } + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=" + }, + "remark-admonitions": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remark-admonitions/-/remark-admonitions-1.2.1.tgz", + "integrity": "sha512-Ji6p68VDvD+H1oS95Fdx9Ar5WA2wcDA4kwrrhVU7fGctC6+d3uiMICu7w7/2Xld+lnU7/gi+432+rRbup5S8ow==", + "requires": { + "rehype-parse": "^6.0.2", + "unified": "^8.4.2", + "unist-util-visit": "^2.0.1" + }, + "dependencies": { + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + }, + "unified": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/unified/-/unified-8.4.2.tgz", + "integrity": "sha512-JCrmN13jI4+h9UAyKEoGcDZV+i1E7BLFuG7OsaDvTXI5P0qhHX+vZO/kOhz9jn8HGENDKbwSeB0nVOg4gVStGA==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + } + } + } + }, + "remark-emoji": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz", + "integrity": "sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==", + "requires": { + "emoticon": "^3.2.0", + "node-emoji": "^1.10.0", + "unist-util-visit": "^2.0.3" + } + }, + "remark-footnotes": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz", + "integrity": "sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==" + }, + "remark-mdx": { + "version": "1.6.22", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz", + "integrity": "sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==", + "requires": { + "@babel/core": "7.12.9", + "@babel/helper-plugin-utils": "7.10.4", + "@babel/plugin-proposal-object-rest-spread": "7.12.1", + "@babel/plugin-syntax-jsx": "7.12.1", + "@mdx-js/util": "1.6.22", + "is-alphabetical": "1.0.4", + "remark-parse": "8.0.3", + "unified": "9.2.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.12.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz", + "integrity": "sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==", + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.12.5", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helpers": "^7.12.5", + "@babel/parser": "^7.12.7", + "@babel/template": "^7.12.7", + "@babel/traverse": "^7.12.9", + "@babel/types": "^7.12.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-syntax-jsx": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz", + "integrity": "sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==", + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, + "remark-parse": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz", + "integrity": "sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==", + "requires": { + "ccount": "^1.0.0", + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^2.0.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "trim": "0.0.1", + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^2.0.0", + "vfile-location": "^3.0.0", + "xtend": "^4.0.1" + } + }, + "remark-squeeze-paragraphs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz", + "integrity": "sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==", + "requires": { + "mdast-squeeze-paragraphs": "^4.0.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "renderkid": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.7.tgz", + "integrity": "sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==", + "requires": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "css-select": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz", + "integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==", + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.0.0", + "domhandler": "^4.2.0", + "domutils": "^2.6.0", + "nth-check": "^2.0.0" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domhandler": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz", + "integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "requires": { + "boolbase": "^1.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-like": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "integrity": "sha1-rW8wwTvs15cBDEaK+ndcDAprR/o=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "requires": { + "resolve-from": "^3.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=" + } + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, + "resolve-pathname": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz", + "integrity": "sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==" + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=" + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=" + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=" + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rtl-detect": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz", + "integrity": "sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==" + }, + "rtlcss": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-2.6.2.tgz", + "integrity": "sha512-06LFAr+GAPo+BvaynsXRfoYTJvSaWRyOhURCQ7aeI1MKph9meM222F+Zkt3bDamyHHJuGi3VPtiRkpyswmQbGA==", + "requires": { + "@choojs/findup": "^0.2.1", + "chalk": "^2.4.2", + "mkdirp": "^0.5.1", + "postcss": "^6.0.23", + "strip-json-comments": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "postcss": { + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", + "requires": { + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "scheduler": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", + "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", + "requires": { + "loose-envify": "^1.1.0", + "object-assign": "^4.1.1" + } + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "section-matter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz", + "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==", + "requires": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=" + }, + "selfsigned": { + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + } + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serialize-javascript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", + "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-handler": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.3.tgz", + "integrity": "sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==", + "requires": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.0.4", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "requires": { + "mime-db": "~1.33.0" + } + }, + "path-to-regexp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz", + "integrity": "sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==" + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, + "shelljs": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", + "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", + "requires": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + } + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", + "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + } + }, + "sirv": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz", + "integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==", + "requires": { + "@polka/url": "^1.0.0-next.20", + "mime": "^2.3.1", + "totalist": "^1.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "sitemap": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/sitemap/-/sitemap-6.4.0.tgz", + "integrity": "sha512-DoPKNc2/apQZTUnfiOONWctwq7s6dZVspxAZe2VPMNtoqNq7HgXRvlRnbIpKjf+8+piQdWncwcy+YhhTGY5USQ==", + "requires": { + "@types/node": "^14.14.28", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "dependencies": { + "@types/node": { + "version": "14.17.27", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.17.27.tgz", + "integrity": "sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw==" + } + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "sockjs": { + "version": "0.3.21", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.21.tgz", + "integrity": "sha512-DhbPFGpxjc6Z3I+uX07Id5ZO2XwYsWOrYjaSeieES78cq+JaJvVe5q/m1uvjIQhXinhIeCFRH6JgXe+mvVMyXw==", + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^3.4.0", + "websocket-driver": "^0.7.4" + } + }, + "sockjs-client": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.2.tgz", + "integrity": "sha512-ZzRxPBISQE7RpzlH4tKJMQbHM9pabHluk0WBaxAQ+wm/UieeBVBou0p4wVnSQGN9QmpAZygQ0cDIypWuqOFmFQ==", + "requires": { + "debug": "^3.2.6", + "eventsource": "^1.0.7", + "faye-websocket": "^0.11.3", + "inherits": "^2.0.4", + "json3": "^3.3.3", + "url-parse": "^1.5.3" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "sort-css-media-queries": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-1.5.0.tgz", + "integrity": "sha512-QofNE7CEVH1AKdhS7L9IPbV9UtyQYNXyw++8lC+xG6iOLlpzsmncZRiKbihTAESvZ8wOhwnPoesHbMrehrQyyw==" + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.5.20", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.20.tgz", + "integrity": "sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "requires": { + "extend-shallow": "^3.0.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "requires": { + "minipass": "^3.1.1" + } + }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" + }, + "state-toggle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==" + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "std-env": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-2.3.1.tgz", + "integrity": "sha512-eOsoKTWnr6C8aWrqJJ2KAReXoa7Vn5Ywyw6uCXgA/xDhxPoaIsBa5aNJmISY04dLwXPBnDHW4diGM7Sn5K4R/g==", + "requires": { + "ci-info": "^3.1.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + } + } + }, + "string-width": { + "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.1" + } + }, + "string.prototype.trimend": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz", + "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz", + "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==", + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "requires": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-bom-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", + "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=" + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "style-to-object": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz", + "integrity": "sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==", + "requires": { + "inline-style-parser": "0.1.1" + } + }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "dependencies": { + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + } + } + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==" + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "terser-webpack-plugin": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz", + "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==", + "requires": { + "cacache": "^15.0.5", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.5.0", + "p-limit": "^3.0.2", + "schema-utils": "^3.0.0", + "serialize-javascript": "^5.0.1", + "source-map": "^0.6.1", + "terser": "^5.3.4", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "terser": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.9.0.tgz", + "integrity": "sha512-h5hxa23sCdpzcye/7b8YqbE5OwKca/ni0RQz1uRX3tGh8haaGHqcuSqbGRybuAKNdntZ0mDgFNXPJ48xQ2RXKQ==", + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "dependencies": { + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" + } + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "requires": { + "setimmediate": "^1.0.4" + } + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=" + }, + "tiny-invariant": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.1.0.tgz", + "integrity": "sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==" + }, + "tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=" + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "totalist": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz", + "integrity": "sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==" + }, + "trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=" + }, + "trim-trailing-lines": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz", + "integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==" + }, + "trough": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==" + }, + "ts-essentials": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-2.0.12.tgz", + "integrity": "sha512-3IVX4nI6B5cc31/GFFE+i8ey/N2eA0CZDbo6n0yrz0zDX8ZJ8djmU1p+XRz7G3is0F3bB3pu2pAroFdAWQKU3w==" + }, + "ts-pnp": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.2.0.tgz", + "integrity": "sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==" + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "ua-parser-js": { + "version": "0.7.28", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", + "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==" + }, + "unbox-primitive": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz", + "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==", + "requires": { + "function-bind": "^1.1.1", + "has-bigints": "^1.0.1", + "has-symbols": "^1.0.2", + "which-boxed-primitive": "^1.0.2" + } + }, + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" + }, + "unified": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", + "integrity": "sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==", + "requires": { + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-buffer": "^2.0.0", + "is-plain-obj": "^2.0.0", + "trough": "^1.0.0", + "vfile": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + }, + "is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==" + } + } + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=" + }, + "uniqs": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", + "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=" + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, + "unist-builder": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz", + "integrity": "sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==" + }, + "unist-util-generated": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz", + "integrity": "sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==" + }, + "unist-util-is": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz", + "integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==" + }, + "unist-util-position": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz", + "integrity": "sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==" + }, + "unist-util-remove": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz", + "integrity": "sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==", + "requires": { + "unist-util-is": "^4.0.0" + } + }, + "unist-util-remove-position": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz", + "integrity": "sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==", + "requires": { + "unist-util-visit": "^2.0.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", + "requires": { + "@types/unist": "^2.0.2" + } + }, + "unist-util-visit": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz", + "integrity": "sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0", + "unist-util-visit-parents": "^3.0.0" + } + }, + "unist-util-visit-parents": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", + "integrity": "sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-is": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=" + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==" + }, + "update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "requires": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "url-loader": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz", + "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==", + "requires": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, + "url-parse": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz", + "integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + }, + "dependencies": { + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + } + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" + }, + "use-composed-ref": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.1.0.tgz", + "integrity": "sha512-my1lNHGWsSDAhhVAT4MKs6IjBUtG6ZG11uUqexPH9PptiIZDQOzaF4f5tEbJ2+7qvNbtXNBbU3SfmN+fXlWDhg==", + "requires": { + "ts-essentials": "^2.0.3" + } + }, + "use-isomorphic-layout-effect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.1.tgz", + "integrity": "sha512-L7Evj8FGcwo/wpbv/qvSfrkHFtOpCzvM5yl2KVyDJoylVuSvzphiiasmjgQPttIGBAy2WKiBNR98q8w7PiNgKQ==", + "requires": {} + }, + "use-latest": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.0.tgz", + "integrity": "sha512-d2TEuG6nSLKQLAfW3By8mKr8HurOlTkul0sOpxbClIv4SQ4iOd7BYr7VIzdbktUCnv7dua/60xzd8igMU6jmyw==", + "requires": { + "use-isomorphic-layout-effect": "^1.0.0" + } + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=" + }, + "utility-types": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz", + "integrity": "sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "value-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz", + "integrity": "sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vendors": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==" + }, + "vfile": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", + "integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==", + "requires": { + "@types/unist": "^2.0.0", + "is-buffer": "^2.0.0", + "unist-util-stringify-position": "^2.0.0", + "vfile-message": "^2.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", + "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" + } + } + }, + "vfile-location": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz", + "integrity": "sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==" + }, + "vfile-message": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", + "requires": { + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + }, + "wait-on": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz", + "integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==", + "requires": { + "axios": "^0.21.1", + "joi": "^17.3.0", + "lodash": "^4.17.21", + "minimist": "^1.2.5", + "rxjs": "^6.6.3" + } + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "optional": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "optional": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "optional": true, + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "web-namespaces": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz", + "integrity": "sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==" + }, + "webpack": { + "version": "4.46.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", + "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/wasm-edit": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "acorn": "^6.4.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.5.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.3", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.3", + "watchpack": "^1.7.4", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + } + }, + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "requires": { + "minimist": "^1.2.0" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "requires": { + "find-up": "^3.0.0" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "ssri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", + "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + } + } + }, + "webpack-bundle-analyzer": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz", + "integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==", + "requires": { + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "chalk": "^4.1.0", + "commander": "^7.2.0", + "gzip-size": "^6.0.0", + "lodash": "^4.17.20", + "opener": "^1.5.2", + "sirv": "^1.0.7", + "ws": "^7.3.1" + }, + "dependencies": { + "acorn": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz", + "integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==" + }, + "commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" + }, + "gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "requires": { + "duplexer": "^0.1.2" + } + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.3.tgz", + "integrity": "sha512-djelc/zGiz9nZj/U7PTBi2ViorGJXEWo/3ltkPbDyxCXhhEXkW0ce99falaok4TPj+AsxLiXJR0EBOb0zh9fKQ==", + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", + "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==" + } + } + }, + "webpack-dev-server": { + "version": "3.11.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", + "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.8", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "sockjs-client": "^1.5.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==" + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==" + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "ws": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", + "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz", + "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==", + "requires": { + "lodash": "^4.17.15" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "webpackbar": { + "version": "5.0.0-3", + "resolved": "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.0-3.tgz", + "integrity": "sha512-viW6KCYjMb0NPoDrw2jAmLXU2dEOhRrtku28KmOfeE1vxbfwCYuTbTaMhnkrCZLFAFyY9Q49Z/jzYO80Dw5b8g==", + "requires": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.1.0", + "consola": "^2.15.0", + "figures": "^3.2.0", + "pretty-time": "^1.1.0", + "std-env": "^2.2.1", + "text-table": "^0.2.0", + "wrap-ansi": "^7.0.0" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "requires": { + "errno": "~0.1.7" + } + }, + "worker-rpc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/worker-rpc/-/worker-rpc-0.1.1.tgz", + "integrity": "sha512-P1WjMrUB3qgJNI9jfmpZ/htmBEjFh//6l/5y8SD9hg1Ef5zTTVVoRjTrTEzPrNBQvmhMxkoTsjOXN10GWU7aCg==", + "requires": { + "microevent.ts": "~0.1.1" + } + }, + "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" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "ws": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "requires": {} + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xml-js": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz", + "integrity": "sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==", + "requires": { + "sax": "^1.2.4" + } + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, + "zwitch": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz", + "integrity": "sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==" + } + } +} diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/pagination.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/pagination.md new file mode 100644 index 0000000000..037a769a1b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/pagination.md @@ -0,0 +1,89 @@ +--- +id: pagination +title: Pagination +--- + +**Pagination** enables the user to select a specific page from a range of pages. It is used to separate the content into discrete pages. + +:::tip +You can club the Pagination component with the List View component. +::: + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:------------ |:-------------| +| Number of pages | You can use this to predefined the total number of pages. It is calculated by dividing the length of the data array that will be passed, by the data limit which is the number of posts we will show on each page. | +| Default page index | It is used to set and display the default page index when the app initially loads. You can also put a conditional logic to set its value as per your use case. | + +
    + +
    + +## Event + +|
    Event
    |
    Description
    | +|:------------------|:---------------------| +| On Page Change | Triggered whenever the user switches to another page index. | + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| totalPages | Holds the value of the `Number of Pages` set from the Pagination component properties.| Accessible dynamically with JS(for e.g., `{{components.pagination1.totalPages}}`).| +| currentPageIndex | Holds the index of the currently selected option on the Pagination component. | Accessible dynamically with JS(for e.g., `{{components.pagination1.currentPageIndex}}`). | + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Default Value
    | +|:------------ |:-------------|:--------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/password-input.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/password-input.md new file mode 100644 index 0000000000..85b0853165 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/password-input.md @@ -0,0 +1,153 @@ +--- +id: password-input +title: Password Input +--- + +The **Password Input** component allows users to enter passwords securely. In this component, passwords are concealed, displaying each character as an asterisk to ensure privacy. In this document, we'll go through all the configuration options for the **Password Input** component. + +
    + +## Properties +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the field. | String (e.g., `Enter Your Password`). | +| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `SecurePassword123`). | +| Default value | The default value that the component will hold when the app is loaded. | String (e.g., `Default Text`). | + +
    + +
    + +## Events + +| Event | Description | +|:------------------|:--------------| +| On change | Triggers whenever the user types something in the input field. | +| On focus | Triggers whenever the user clicks inside the input field. | +| On blur | Triggers whenever the user clicks outside the input field. | +| On enter pressed | Triggers whenever the user presses the enter button on the keyboard after entering some text in the input field. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| setText() | Sets the value of the input field. | Employ a RunJS query (for e.g.,
    `await components.passwordinput1.setText('password123')`) or trigger it using an event | +| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.passwordinput1.clear()`) or trigger it using an event | +| setFocus() | Sets the focus of the cursor on the input field. | Employ a RunJS query (for e.g.,
    `await components.passwordinput1.setFocus()`) or trigger it using an event | +| setBlur() | Removes the focus of the cursor from the input field. | Employ a RunJS query (for e.g.,
    `await components.passwordinput1.setBlur()`) or trigger it using an event | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.passwordinput1.setVisibility(false)`) or trigger it using an event | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.passwordinput1.setLoading(true)`) or trigger it using an event | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.passwordinput1.setDisable(true)`) or trigger it using an event | + +
    + +
    + +## Exposed Variables + + +| Variable | Description | How To Access | +|:-------- |:----------- |:------------ | +|
    value
    | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.passwordinput1.value}}`).| +|
    label
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.passwordinput1.label}}`).| +|
    isValid
    | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.passwordinput1.isValid}}`).| +|
    isMandatory
    | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.passwordinput1.isMandatory}}`).| +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.passwordinput1.isLoading}}`).| +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.passwordinput1.isVisible}}`).| +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.passwordinput1.isDisabled}}`).| +
    + +
    + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression | +| Regex | Regular Expression to validate the input. | Regular Expression Pattern (e.g., `^\d{3}-\d{2}-\d{4}$`) | +| Min length | Sets the minimum number of characters allowed. | Integer (e.g., `6` for a minimum of 6 characters) | +| Max length | Sets the maximum number of characters allowed. | Integer (e.g., `12` for a maximum of 12 characters)| +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.passwordinput1.value<5&&"Value needs to be more than 5"}}`) | + +To add regex inside `Custom Validation`, you can use the below format: + +**Format**: `{{(.test()) ? '' : 'Error message';}}` + +**Example**: `{{(/^\d{1,10}$/.test(components.passwordinput1.value)) ? '' : 'Error message';}}` + +
    + +
    + +## Additional Actions + +|
    Action
    |
    Description
    |
    Configuration Options
    | +|:------------------|:------------|:------------------------------| +| Loading state | Enables a loading spinner, often used with `isLoading` to indicate progress. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Visibility | Controls component visibility. | 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. | 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. | String (e.g., `Enter your password here.` ). | + +
    + +
    + +## 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. | + +
    + +--- + +# Styles + +
    + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Text | Sets the color of the component's label. | Select the color or click on **fx** and input JavaScript code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | + +
    + +
    + +## Field + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Error text | Sets the color of validation message that displays. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can set it programmatically using **fx**. | +| 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 set it programmatically using **fx**. | + +
    + +
    + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/pdf.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/pdf.md new file mode 100644 index 0000000000..05dfb0aac4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/pdf.md @@ -0,0 +1,89 @@ +--- +id: pdf +title: PDF +--- + +The **PDF** component can be used to embed PDF files either by URL or through Base64 code. + +
    + +## Compatibility + +The PDF component is compatible with the following browser versions:
    + +|
    Browser
    |
    Version
    | +| :-------------------------------------------- | :-------------------------------------------- | +| Chrome | 92 or later | +| Edge | 92 or later | +| Safari | 15.4 or later | +| Firefox | 90 or later | + +If the PDF component is integrated into your application, it will only render in supported browsers. + +
    + +
    + +## Properties + +|
    Property
    |
    Description
    | +| :--------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| File URL | Under this property, you can enter the URL of the PDF file to display. Base64 format is also supported, the input needs to be prefixed with `data:application/pdf;base64,`. | +| Scale page to width | The **Scale page to width** property automatically adjusts the PDF to fill the entire width of the component. | +| Show page controls | By default, when hovering over the PDF file, buttons for the previous and next page, along with the page number, are displayed. They can be toggled on or off using the **Show page controls** toggle. | +| Show the download | The **Download** button on the PDF component allows you to download the PDF file. By default, **Show the download** button is enabled. Toggle it off to remove the **Download** button from the PDF component. | + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General + +### Tooltip + +To display instructional text when a user hovers over the PDF component, add some text under the Tooltip property. + +
    + +
    + +## 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. | + +
    + +--- + +
    + +## Styles + +|
    Property
    |
    Description
    |
    Configuration Options
    | +| :------------------------------------------ | :--------------------------------------------------- | :-------------------------------------------------- | +| 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. | + +:::info +Checkout **[this](/docs/how-to/loading-image-pdf-from-db)** guide to learn how to display images/PDFs using base64 string. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/qr-scanner.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/qr-scanner.md new file mode 100644 index 0000000000..13511dbaba --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/qr-scanner.md @@ -0,0 +1,86 @@ +--- +id: qr-scanner +title: QR Scanner +--- +# QR Scanner +Scan QR codes using device camera and hold the data they carry. + +:::note Known Issue +You might have to stick to the Safari browser in IOS as camera access is restricted for third-party browsers. +::: + +
    + +## Events + +|
    Event
    |
    Description
    | +|:------------------|:---------------------| +| On detect | Triggers whenever the component successfully scans a QR code. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +:::caution Debugging tip + +Browser camera APIs restrict this component to only work in either `localhost` or `https`. + +So if you're testing it out, be sure to either use `localhost` or `https`. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| lastDetectedValue | Holds the data from the last QR code scanned by the component. | Accessible dynamically with JS (for e.g., `{{components.qrscanner1.lastDetectedValue}}`). | + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the +mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. +Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Default Value
    | +|:------------ |:-------------|:--------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/radio-button.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/radio-button.md new file mode 100644 index 0000000000..85aff41d6b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/radio-button.md @@ -0,0 +1,132 @@ +--- +id: radio-button +title: Radio Button +--- + +The **Radio button** component can be used to collect user input from a list of options. + +## Data + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the component. | String (e.g., `Select an option`). | + +## Options +Allows you to add options to the radio button field. You can click on `Add new option` and add options manually or enable `Dynamic options` and enter the options using code. + +### Example Code for Dynamic Columns + +1. Passing an array of objects and specifying each value: + +```js +{{ + [{label: 'option1', value: 1, disable: false, visible: true, default: true}, + {label: 'option2', value: 2, disable: false, visible: true}, + {label: 'option3', value: 3, disable: false, visible: true}] +}} +``` + +2. Passing an array of objects with a default value from a **Table** component's selected row: + +```js +{{ + queries.getEmployees.data.map(option => ({ + label: option.firstname, + value: option.firstname, + disable: false, + visible: true, + default: option.firstname === components.table1.selectedRow.firstname + })) +}} +``` + +### Options loading state +Allows you to add a loading state to the dynamically generated options. You can enable or disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. + +## Component specific actions (CSA) + +Following actions of the component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| clear() | Clears the selected option. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.setDisable(true)`) or trigger it using an event. | +| selectOption() | Selects an option. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.selectOption(2)`) or trigger it using an event. | +| deselectOption() | Deselects the selected option. | Employ a RunJS query (for e.g.,
    `await components.radiobutton1.deselectOption()`) or trigger it using an event. | + +## Exposed Variables + +|
    Variable
    |
    Description
    |
    How To Access
    | +|:----------|:----------|:------------| +| label | Holds the label name of the radio button. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.label}}`). | +| value | Holds the value selected by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.value}}`). | +| options | Holds all the option values of the radio button in array form. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.options}}` or
    `{{components.radiobutton1.options[0].label}}` for a specific option). | +| isValid | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isValid}}`). | +| isMandatory | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isMandatory}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isLoading}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isVisible}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.radiobutton1.isDisabled}}`). | + +## Events + +|
    Event
    |
    Description
    | +|:----------------- | :--------------------------------------------- | +| On select | The **On select** event is triggered when a particular option is chosen. | + +:::info +For comprehensive information on all available **Actions**, refer to the [Action Reference](/docs/category/actions-reference) documentation. +::: + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no option is selected. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{!components.radiobutton1.value && "Please select an option"}}`). | + +## 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 (e.g., `Select an option.` ). | + +
    + +## 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. | + +
    + +--- + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | + +## Switch + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Border | Sets the border color of the checkboxes. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Checked background | Sets the color of the selected checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Unchecked background | Sets the color of the unselected checkboxes. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Handle color | Sets the fill color of the selected checkbox. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the colors of the option labels. | Enable the icon visibility, select icon and icon color | + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/range-slider.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/range-slider.md new file mode 100644 index 0000000000..9254d1cb25 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/range-slider.md @@ -0,0 +1,83 @@ +--- +id: range-slider +title: Range Slider +--- +# Range Slider + +The **Range Slider** component is widely used across different UIs. One of the main purposes is to filter, explore all the related content and available in the control and settings options. + +:::tip +Range Sliders have **Two handles** option which allows users to select a range. +::: + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:------------ |:-------------| +| Minimum value | Set the minimum value for the slider. This field accepts any numerical value. | +| Maximum value | Set the maximum value for the slider. This field accepts any numerical value. | +| Value | Set the default value when the component loads. This can be used to pre-fill the value based on your data and requirements. | +| Two handles | The slider will now have 2 dragging handles. It is used to define a range of values versus a single given value. | + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| value | Holds an object when `two handles` option is disabled or an array when `two handles` is enabled from the component properties. | The value can be accessed dynamically using JS: `{{components.rangeslider1.value}}` or `{{components.rangeslider1.value[1]}}` | + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    | +|:------------ |:-------------| +| Line color | Enter the hex code to set the default color for the slider's track. | +| Handle color | Enter the hex code to set the color for the slider's handler. | +| Track color | Enter the hex code to set the color for the slider's active portion on the track. | +| Visibility | Set the visibility of the slider programmatically. The default value is `{{true}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/rich-text-editor.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/rich-text-editor.md new file mode 100644 index 0000000000..923eb67d1e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/rich-text-editor.md @@ -0,0 +1,93 @@ +--- +id: rich-text-editor +title: Text Editor +--- + +# Text Editor + +The **Text Editor** component is used to enter and edit text in HTML format. It is recommended for blog posts, forum posts, or notes sections. The entered text is used as the label for the radio button. + +
    + +## Properties + +| **Property** | **Description** | **Expected Value** | +|:-----------|:-----------|:-----------| +| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `John Doe`)
    HTML(e.g., `

    John Doe

    `) | +| Default Value | The default value that the component will hold when the app is loaded. | String (e.g., `Default Text`)
    HTML (e,g., `

    Hello, ToolJet!

    `).| + +### HTML Support +The Placeholder and Default Value property also supports HTML content allowing the use of headings, paragraphs, bold text, and other HTML elements within the text editor. + + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Button component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------| +| setValue() | Sets the value of the text editor. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setValue(

    Hello ToolJet!

    )`) or trigger it using an event.| +| setVisibility() | Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.richtexteditor1.setDisable(true)`) or trigger it using an event. | + +
    + +
    + +## Exposed Variables + +| **Variable** | **Description** | **How To Access** | +|:-----------|:-----------|:-----------| +| value | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g.,`{{components.richtexteditor1.value}}`). | +| isLoading | Indicates if the component is loading. | Accessible dynamically with JS (e.g., `{{components.richtexteditor1.isLoading}}`). | +| isVisible | Indicates if the component is visible. | Accessible dynamically with JS (e.g., `{{components.richtexteditor1.isVisible}}`). | +| isDisabled | Indicates if the component is disabled. | Accessible dynamically with JS (e.g., `{{components.richtexteditor1.isDisabled}}`). | + +
    + +
    + +## 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. | + +
    + +
    + +## General +### Tooltip + +A tooltip provides additional information when the user hovers over the component. Under the **General** settings, you can set the tooltip text in string format. Hovering over the component will display the string as the tooltip. + +
    + +
    + +## Devices + +| **Property** |**Description** | **Expected Value** | +|:-----------|:-----------|:-----------| +| Show on desktop | Makes the component visible in desktop view. | You can set it using 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 using the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression | + +
    + +
    + +## Styles + +| **Property** | **Description** | **Configuration Options** | +|:-----------|:-----------|:-----------| +| 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. | +| 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**. | + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/spinner.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/spinner.md new file mode 100644 index 0000000000..5e9c627ad5 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/spinner.md @@ -0,0 +1,59 @@ +--- +id: spinner +title: Spinner +--- +# Spinner + +The **Spinner** component can be used to provide a visual indication that an action is in progress by awaiting a change. + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically change the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically change the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | + +
    + +--- + +
    + +## Styles + +|
    Style
    |
    Description
    | +|:------------ |:-------------| +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| Color | Change the color of the Spinner by entering the `Hex color code` or choosing a color of your choice from the color-picker. | +| Size | Change the size of the Spinner by selecting options from the dropdown. It has small and large sizes available. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/star-rating.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/star-rating.md new file mode 100644 index 0000000000..a208cd8e2a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/star-rating.md @@ -0,0 +1,90 @@ +--- +id: star-rating +title: Star Rating +--- +# Star Rating + +The **Star Rating** component can be used to display as well as input ratings. The component supports half stars, and the number of stars can be set too. + +
    + +## Properties + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:------------ |:-------------|:---------- | +| Label | The text to be used as the label for the star rating. | This field expects a `String` value. | +| Number of stars | Initial number of stars in the list on initial load. `default: 5`. | This field expects an integer value. | +| Default no of selected stars | This property specifies the default count of stars that are selected on the initial load. `default: 5` (integer). | This field expects an integer value. | +| Enable half star | Toggle `on` to allow selection of half stars. `default: false` (bool). | Click on **fx** to programmatically define the value `{{true}}` or `{{false}}`. | +| Tooltips | This is used for displaying informative tooltips on each star, and it is mapped to the index of the star. | `default: []` (array of strings ). | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On change | Triggers whenever the user clicks a star. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| value |Holds the value entered by the user whenever a rating is added on the component. | Accessible dynamically with JS (for e.g., `{{components.starrating1.value}}`).| + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Default Value
    | +|:------------ |:-------------|:--------- | +| Star Color | Display color of the star. Change color by providing `Hex color code` or choosing one from the picker. | `default: #ffb400` (color hex). | +| Label color | Change the color of label in component by providing `Hex color code` or choosing one from the picker. | | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/statistics.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/statistics.md new file mode 100644 index 0000000000..67325b2186 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/statistics.md @@ -0,0 +1,82 @@ +--- +id: statistics +title: Statistics +--- + +# Statistics + +**Statistics** can be used to display different statistical information. + +
    + +## Properties + +|
    Property
    |
    Description
    | +|:------------ |:-------------| +| Primary value label | This property lets you add and remove primary value label. | +| Primary value | This property lets you add and remove primary value, the actual amount can be represented here. | +| Hide secondary value | This property lets you show/hide the secondary value from the statistics component. By default, this property is disabled. Toggle it on to hide the secondary value, you can also click on the **fx** button next to it to dynamically set the value to `{{true}}` or `{{false}}`. | +| Secondary value label | This property lets you add and remove secondary value label. | +| Secondary value | This property lets you add and remove secondary value, the change in value can be represented here. | +| Secondary sign display | This property lets you add and secondary sign either positive or negative,can be used to represent positive(increase) or negative(decrease) movement. Default value is positive. | +| Loading state | Loading state can be used to show a spinner on the statistics. Loading state is commonly used with `isLoading` property of the queries to show a loading status while a query is being run. Switch the toggle **On** or click on **fx** to programmatically set the value `{{true}}` or `{{false}}`. | + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    | +|:------------ |:-------------| +| Primary label colour | You can change the primary label color by entering the Hex color code or choosing a color of your choice from the color picker. | +| Primary text colour | You can change the primary text color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. | +| Secondary label colour | You can change the secondary label color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. | +| Secondary text colour | You can change the secondary text color of the primary label by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/steps.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/steps.md new file mode 100644 index 0000000000..f95d4429ea --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/steps.md @@ -0,0 +1,107 @@ +--- +id: steps +title: Steps +--- +# Steps + +**Steps** helps guide users through a process, one step at a time. It's perfect for things like forms, onboarding, or any task that involves multiple stages. Each step shows users where they are, what they've completed, and what’s next. + +This makes complex tasks feel more manageable, giving users a clear sense of progress and direction. You can also add tooltips and status indicators to make the experience even more helpful. + +
    + +## Properties + +### Steps + +This property lets you add and the steps. Every object represents a step. + +```json +{{ + [ + { name: 'step 1', tooltip: 'some tooltip', id: 1}, + { name: 'step 2', tooltip: 'some tooltip', id: 2}, + { name: 'step 3', tooltip: 'some tooltip', id: 3}, + { name: 'step 4', tooltip: 'some tooltip', id: 4}, + { name: 'step 5', tooltip: 'some tooltip', id: 5} + ] +}} +``` + +### Current step + +This property lets you select the current step you want to be highlighted. + +### Steps selectable + +This property when disabled will disable the selection of steps. + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:------------------|:---------------------| +| On select | Triggers whenever the user selects any step. | +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------------| +| currentStepId | This variable holds the id of the currently selected step on the step component.| Access the value dynamically using JS: `{{components.steps1.currentStepId}}`| + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +--- + +
    + +## Styles + +|
    Style
    |
    Description
    | +|:------------ |:-------------| +| Theme | You can change the theme of a component by selecting available themes from the dropdown. | +| Colour | You can change the color of the component by entering the Hex color code or choosing a color of your choice from the color picker. | +| Text color | You can change the text color of the component by entering the Hex color code or choosing a color of your choice from the color picker. | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/svg-image.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/svg-image.md new file mode 100644 index 0000000000..228d26eebf --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/svg-image.md @@ -0,0 +1,78 @@ +--- +id: svg-image +title: Svg Image +--- +# SVG Image + +It is used to render vector images. We can display images, icons, and texts using this component. SVGs are vector images and therefore are usually much smaller in file size than bitmap-based images. + +Developers prefer having SVG **(Scalable Vector Graphics)** files as they are scalable and will render pixel-perfect at any resolution whereas JPEGs, PNGs, and GIFs will not. + +
    + +## Properties + +### SVG data + +Enter the SVG data of the image to display it on the component. + +:::tip +Refer to the resources where SVG files are downloaded for free. You can copy-paste the below data in this field to see a new icon being rendered. +::: + +``` + +``` + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## 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. | + +
    + +
    + +--- + +## Styles + +|
    Property
    |
    Description
    | Configuration Options | +|:------------ |:-------------|:--------- | +| 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. | +| 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**. | +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/columns.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/columns.md new file mode 100644 index 0000000000..a9a3c868bf --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/columns.md @@ -0,0 +1,492 @@ +--- +id: table-columns +title: Table Columns +--- + +Whenever data is loaded into a Table, the columns are automatically generated. You can add, remove, or modify columns by accessing the table properties under the column section. You can also rearrange the columns by dragging and dropping them. + +
    + ToolJet - Component Reference - Columns +
    + +### Use dynamic column + +The **Use dynamic column** toggle allows users to dynamically set the columns of the Table using a JSON value. + +For example, if you enter the below JSON, the table will display a column labeled "Name" where the data entries are editable strings, restricted in length between 5 and 20 characters, displayed in white text on a black background. + +```json +{ + "name":"Name", + "columnType":"string", + "key":"first_name", + "cellBackgroundColor":"#000", + "textColor":"#fff", + "isEditable":true, + "regex":"", + "maxLength":20, + "minLength":5, + "customRule":"" +} +``` + +
    + ToolJet - Component Reference - Dynamic Columns +
    + +## Types of Columns + +The table component supports the following column types: + +- **[String](#string)** +- **[Number](#number)** +- **[Text](#text)** +- **[Datepicker](#datepicker)** +- **[Select](#select)** +- **[Multiselect](#multiselect)** +- **[Boolean](#boolean)** +- **[Image](#image)** +- **[Link](#link)** +- **[Default](#default-deprecated)** - Deprecated +- **[Dropdown](#dropdown-deprecated)** - Deprecated +- **[Multiselect](#multiselect-deprecated)** - Deprecated +- **[Toggle switch](#toggle-switch-deprecated)** - Deprecated +- **[Radio](#radio-deprecated)** - Deprecated +- **[Badge](#badge-deprecated)** - Deprecated +- **[Multiple Badges](#multiple-badges-deprecated)** - Deprecated +- **[Tags](#tags-deprecated)** - Deprecated + + +### String + +This column type is used for columns with text values. Unlike the text column type, string type doesn't support multi-line text. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Product Name`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `product_name`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Number + +Selecting the column type as number will load numerical data in the column cells. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Quantity`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `quantity`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Decimal places | Specifies the number of decimal places for numerical values. | Integer (e.g., `{{2}}`). | | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + + +### Text + +The text column type can be used for multi-line text. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Product Description`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `product_description`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Datepicker + +The datepicker type can be used to display dates. + +#### Properties +| Property | Description | Expected Value | +|:-------------------|:----------------|:-----------------| +| Column Name | Specify the name to be displayed on the table column header. | Date (e.g., `13/09/1990`) | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `listing_date`) | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Date format + +| Property | Description | Configuration Options | +|:-------------------|:----------------|:-----------------| +|Enable date | Enables the option to change the formatting of the date. | Use the toggle button or click on `fx` and enter a logical expression. | +| Date format | Configures the display format for date values within the column. | Use the drop down with common formats (Default: `DD/MM/YYYY`) or click on `fx` and enter a logical expression. | +|Enable date | Enables the option to change the formatting of the time. | Use the toggle button or click on `fx` and enter a logical expression. | +|Enable 24 hr time format | Enables the option to change the formatting of the time to 24 hours. | Use the toggle button or click on `fx` and enter a logical expression. | +|Enable 24 hr time format | Enables the option to change the formatting of the time to 24 hours. | Use the toggle button or click on `fx` and enter a logical expression. | +|Time zone | Allows the selection of timezone. | Use the drop down to select the time zone. | + +#### Parse format +| Property | Description | Configuration Options | +|:-------------------|:----------------|:-----------------| +| Parse in unix timestamp | Enables parsing and display of date, time, and time zone data. | Use the toggle button or click on `fx` and enter a logical expression. | +| Unix timestamp | Select between `s` or `ms` as the format. | Use the drop down to select the desired unix timestamp format. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + + +### Select + +The select column can be used to display or select a single item from a list. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Category`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `category`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Options +Options can be used to provide values for the select column as an array. You can click on the **Add new option** button and enter `Option label` and `Option value` to create a new option. You can switch on the toggle for `Make this option as default` to mark an option as the default value. You can also enable `Dynamic option` and enter an array of values as shown in the example below: + +```js +{{[{ label: "Mobile Phones", value: "mobile-phones" }, + { label: "Smartphones", value: "smartphones" }, + { label: "Compact Cameras", value: "compact-cameras" }, + { label: "DSLR Cameras", value: "dslr-cameras" }, + { label: "Smart Watches", value: "smart-watches" }, +]}} +``` + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### MultiSelect + +The MultiSelect column can be used to display or select multiple items from a list. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Locations`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `locations`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Options +Options can be used to provide values for the select column as an array. You can click on the **Add new option** button and enter `Option label` and `Option value` to set the option values. You can switch on the toggle for `Make this option as default` to mark an option as the default value. You can also enable `Dynamic option` and enter an array of values as shown in the example below: + +```js +{{[{ label: "Technology", value: "technology" }, + { label: "Apparrel", value: "apparrel" }, + { label: "Jewelry", value: "jewelry" }, + { label: "Furniture", value: "furniture" }, +]}} +``` + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Boolean + +The boolean column type can be used to display boolean values. If the value is true, a green tick will be displayed and for false values a red cross will be displayed. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column name | Specify the name to be displayed on the table column header. | String (e.g., `Validity`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `is_valid`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Image + +The image column type can be used to display images. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column name | Specify the name to be displayed on the table column header. | String (e.g., `Product Image`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `product_image`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + + +### Link + +The link column type can be used to create a link to . + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Product Description`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `id`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + + +### Default (Deprecated) + +This default column is used to display text. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Product Description`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `product_description`). | +| Transformation | Allows you to transform the data of a cell value. The default value will be `{{cellValue}}`. | Use JavaScript for dynamic value generation, e.g., `{{cellValue > 4.5 ? 5 : 4}}`. | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`, which can be specified using the switch. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Dropdown (Deprecated) + +The **Dropdown** column type is used to display a dropdown in the column cells using the column data. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Category`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `category_id`). | +| Values | Provide the values for the dropdown as an array. | Array (e.g., `[1, 2, 3]`). | +| Labels | Provide the labels for the values in the dropdown as an array. | Array (e.g., `["Option 1", "Option 2", "Option 3"]`). | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Multiselect (Deprecated) + +The multiselect column type is used to show multiple selections or display a dropdown in the column cells using the column data. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Tags`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `tag_ids`). | +| Values | Provide the values for the dropdown as an array. | Array (e.g., `[1, 2, 3]`). | +| Labels | Provide the labels for the values in the dropdown as an array. | Array (e.g., `["Tag 1", "Tag 2", "Tag 3"]`). | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Toggle Switch (Deprecated) + +The **Toggle Switch** column type is used to display a toggle switch in the column cells, providing a clear visual indicator for boolean values. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Active Status`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `active`). | +| Active Color | Set the color of the toggle switch when it is active. | Color code (e.g., `#76D7C4`). | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Radio (Deprecated) + +The **Radio** column type is used to show radio buttons in the column cells, offering a single-choice selection from multiple options. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Membership Type`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `membership_type`). | +| Values | Provide the values for the radio buttons as an array. | Array (e.g., `[1, 2, 3]`). | +| Labels | Provide the labels for the values in the radio buttons as an array. | Array (e.g., `["Gold", "Silver", "Bronze"]`). | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Badge (Deprecated) + +The **Badge** column type is utilized to exhibit labels or tags on the columns, visually distinguishing the data. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Status`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `status`). | +| Values | Provide the values for the badge as an array. | Array (e.g., `["new", "in_progress", "completed"]`). | +| Labels | Provide the labels for the values in the badge as an array. | Array (e.g., `["New", "In Progress", "Completed"]`). | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Multiple Badges (Deprecated) + +Similar to the **Badge** type, the **Multiple Badges** type is used to display multiple badges within a column cell, providing a more nuanced display of statuses or categories. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Features`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `features`). | +| Values | Provide the values for the multiple badges as an array. | Array (e.g., `["wifi", "bluetooth", "gps"]`). | +| Labels | Provide the labels for the values in the multiple badges as an array. | Array (e.g., `["WiFi", "Bluetooth", "GPS"]`). | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Tags (Deprecated) + +The **Tags** column type is utilized to display an array of tags within the column cells, providing a flexible way to categorize or tag items dynamically. + +#### Properties +| Property | Description | Expected Value | +|:--------------|:----------------|:----------------------| +| Column Name | Specify the name to be displayed on the table column header. | String (e.g., `Tags`). | +| Key | Specify the key name associated with the loaded data in the table. Uses `Column name` if no key is provided. | String (e.g., `tag_list`). | +| Make Editable | This option is disabled by default. Enabling it allows the column to be edited by app users. | Enable/disable the toggle button or dynamically configure the setting by clicking on `fx` and entering a logical expression. | +| Visibility | This option is enabled by default. Disabling it hides the column from the table. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | + +#### Styles +| Property | Description | Configuration Options | +|:--------------|:----------------|:----------------------| +| Text Alignment | Aligns the text within the column. | Set alignment to `left`, `center`, or `right`. | +| Text Color | Modifies the color of the text in the column. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Cell Background Color| Adjusts the background color of the cell. | Select the color or click on `fx` and input code that programmatically returns a Hex color code.| + +### Add Column + +You can add a new column to the table by clicking on the **+ Add new column** button. On clicking this button a new column will be added to the Table and you can edit it's properties from the column section. + +### Duplicate Column + +On hovering on a column, you can see a clone icon next to delete which can be used to create a duplicate copy of the same column. + +### Delete Column + +On hovering on a column, you can see a delete icon on the right which can be used to delete a column. + +### Hide columns + +You can choose which columns to show or hide in the Table using this option. You also have the option to **[hide the column selector button](/docs/widgets/table/#hide-column-selector-button)** in the Table properties. + + +## Make all columns editable + +To make all the columns editable in your table, you can enable the `Make all columns editable` toggle. If you disable the `Make editable` property of any individual column, `Make all columns editable` will automatically switch to disabled. + + +## Validation + +Under column properties, when you switch on the `Make editable` toggle, you will be able to see validation options that will be different for each column type. For instance, the a column with `string` type will have the following validations. + +### Regex +Use this field to enter a Regular Expression that will validate the content. + +### Min length + +Enter the number for a minimum length of characters allowed. + +### Max length + +Enter the number for the maximum length of characters allowed. + +### Custom rule + +If the condition is true, the validation passes, otherwise return a string that should be displayed as the error message. For example: `{{components.table1.selectedRow.id==1&&"This row can't be deleted"}}` diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/csa-and-variables.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/csa-and-variables.md new file mode 100644 index 0000000000..a6c0f63c7a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/csa-and-variables.md @@ -0,0 +1,44 @@ +--- +id: table-csa-and-variables +title: Component Specific Actions (CSA) and Exposed Variables +--- + +## Component specific actions (CSA) + +The following actions of the Table component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| setPage() | Sets the page on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.setPage(2)`)
    or trigger it using an event. | +| selectRow() | Selects a row on the table | Employ a RunJS query (for e.g.,
    `await components.table1.selectRow('id','11')`)
    or trigger it using an event. | +| deselectRow() | Deselects a row on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.deselectRow()`)
    or trigger it using an event. | +| selectAllRows()| Selects all rows on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.selectAllRows()`)
    or trigger it using an event. | +| deselectAllRows() | Deselects all rows on the table| Employ a RunJS query (for e.g.,
    `await components.table1.deselectAllRows()`)
    or trigger it using an event. | +| discardChanges() | Discards the changes from the table when a cell is edited. | Employ a RunJS query (for e.g.,
    `await components.table1.discardChanges()`)
    or trigger it using an event. | +| discardNewlyAddedRows() | Discards the newly added rows from the add new row popup on the table. | Employ a RunJS query (for e.g.,
    `await components.table1.discardNewlyAddedRows()`)
    or trigger it using an event. | +| downloadTableData() | Retrieves the data from the table in the PDF, CSV, or Excel sheet. | Employ a RunJS query (for e.g.,
    `await components.table1.downloadTableData('pdf')`)
    or trigger it using an event. | +| setFilters() | Applies filters to the table data. | Employ a RunJS query (for e.g.,
    `await components.table1.setFilters ([{column:'name',condition:'contains',value: 'Sarah'}])`)
    or trigger it using an event. | +| clearFilters() | Removes all applied filters from the table. | Employ a RunJS query (for e.g.,
    `await components.table1.clearFilters()`)
    or trigger it using an event. | + +## Exposed variables + +| Variable | Description | +| :---------- | :---------- | +| currentData | Data that is currently being displayed by the table (including edits if any). | +| currentPageData | Data that is displayed on the current page if pagination is enabled (including edits if any). | +| pageIndex | Index of the current page, starting from 1 +| changeSet | Object with row number as the key and object of edited fields and their values as the value. | +| dataUpdates | Similar to `changeSet`, but `dataUpdates` includes data for the entire row that is being edited. | +| selectedRow | Contains the data of the row that was most recently clicked. When an action button is clicked, `selectedRow` is also updated. Its initial value is set to the data of the first row when the app is loaded. | +| selectedRowId | Stores the ID of the row that was last clicked. Similar to `selectedRow`, it gets updated when an action button is clicked. You can access its value using `{{components.table1.selectedRowId}}`. By default, it is set to `0`, representing the ID of the first row when the app is loaded. | +| selectedCell | The data of the cell that was last clicked on the table. | +| searchText | The value of the search field if server-side pagination is enabled. | +| newRows| The newRows variable stores an array of objects, each containing data for a row that was added to the table using the "Add new row" button. When the user clicks either the "Save" or "Discard" button in the modal, this data is cleared.| + +If the data in a cell is changed, `changeSet` property of the Table object will have the index of the row and the field that changed. + +Along with `changeSet`, `dataUpdates` property will also be changed when the value of a cell changes. `dataUpdates` will have the whole data of the changed index from the Table data. + +If the data of a cell is changed, **Save changes** button will be shown at the bottom of the Table. This button when clicked will trigger the `Bulk update query` event. This event can be used to run a query to update the data on your data source. + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/dynamic-column.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/dynamic-column.md new file mode 100644 index 0000000000..541629cc0a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/dynamic-column.md @@ -0,0 +1,112 @@ +--- +id: dynamic-column +title: Dynamic Columns +--- + +ToolJet allows users to dynamically set the columns of a **Table** component using a JSON value. This guide explains how to configure dynamic columns in ToolJet. + +
    + +## Using Dynamic Column + +1. Drag a **Table** component from the right-side component library onto the canvas. +2. Populate the **Table** component with data by connecting it to a query. +3. Toggle the Use dynamic column option. +4. Enter JSON to define the **Table's** columns dynamically. For example: + +```json +{ + "name": "Name", + "columnType": "string", + "key": "first_name", + "cellBackgroundColor": "#000", + "textColor": "#fff", + "isEditable": true, + "regex": "", + "maxLength": 20, + "minLength": 5, + "customRule": "" +} +``` + +This configuration displays a column labeled Name with editable string data restricted to lengths between 5 and 20 characters, with white text on a black background. + +
    + +
    + +## Displaying Different Table Schema Based on the Current User + +You can use dynamic columns to display different table schemas depending on the current user. Let's look at an example with the below schema: + +| ID | Name | Email | Department | Salary | Performance | Login | +|----|------|-------|------------|--------|-------------|-------| + +Here, two different schemas are to be displayed based on the current user. + +**For Admin:** + +| ID | Name | Email | Department | Salary | Performance | Login | +|----|------|-------|------------|--------|-------------|-------| + +**For Employees:** + +| ID | Name | Email | Department | Login | +|----|------|-------|------------|-------| + +1. To configure the schema as per the user, enable Use dynamic column property. + +2. Use the following JSON logic to dynamically adjust the schema based on the current user's role: + +```json +{{globals.currentUser.groups.includes("admin") ? [ + { name: 'id', key: 'id', id: '1' }, + { name: 'Name', key: 'name', id: '2' }, + { name: 'Email', key: 'email', id: '3' }, + { name: 'Department', key: 'department', id: '4' }, + { name: 'Salary', key: 'salary', id: '5' }, + { name: 'Performance Rating', key: 'performance', id: '6' }, + { name: 'Last Login', columnType:"datePicker", key: 'login', id: '7' } +] : [ + { name: 'id', key: 'id', id: '1' }, + { name: 'Name', key: 'name', id: '2' }, + { name: 'Email', key: 'email', id: '3' }, + { name: 'Department', key: 'department', id: '4' }, + { name: 'Last Login', columnType:"datePicker", key: 'login', id: '5' } +]}} +``` + +
    + +
    + +## Specifiying the Column Type + +Dynamic columns in ToolJet support various types, such as strings, numbers, dates, and links. + +In this example, you can see how you can specify a column type using dynamic columns. + +1. Add a **Table** component with the following columns and column types: + - Profile Photo - Image + - Name - String + - Contact Number - Number + - Date of Birth - Datepicker + - Website URL - Link + +2. Toggle the Use dynamic column option. + +3. Add the following JSON to define the columns: + +```json +{{[ + {name: 'Profile', key: 'photo',columnType: 'image', id: '1'}, + {name: 'Name', key: 'name', columnType:'string', id: '2'}, + {name: 'Contact', key: 'mobile_number', columnType:'number', id: '3'}, + {name: 'DOB', key: 'date', columnType:'datepicker', id: '4'}, + {name: 'Website', key: 'website', columnType:'link', id: '5'} +]}} +``` + +This configuration will create a table with the specified column types. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/properties.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/properties.md new file mode 100644 index 0000000000..644696af64 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/properties.md @@ -0,0 +1,269 @@ +--- +id: table-properties +title: Table Properties +slug: /widgets/table/ +--- + +The Table component displays and manages data, connecting seamlessly with databases and APIs. It allows users to view and edit data directly within the table. This document goes through all the properties related to the Table component. + +
    + +ToolJet - Component Reference - Table Preview + +
    + +## Data +To populate the Table with data, you need to provide the data in the form of an array of objects under its `Data` property. You can utilize data from queries by referring query data to populate the Table. + +The Table component will **automatically generate all the required columns** when the data is provided. The Table also loads one level of **nested data**. + +Example - Passing an array: +```js +{{[{ id: 1, name: 'Sarah', email: 'sarah@example.com', contact:{number: 8881212, address: '25, Huntley Road, Newark'} }]}} +``` + +Example - Passing a query data: +```js +{{queries.restapi1.data}} +//replace restapi1 with your query name +``` + + + +## Columns + +Go to the **[columns](/docs/widgets/table/table-columns)** section to read more about columns. + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +## Action Buttons + +
    + ToolJet - Component Reference - Actions +
    + +Action buttons are positioned in the Table's final column. These buttons' appearance can be customized, and specific actions can be defined for when they are clicked using the `On click` action. Upon clicking an action button, the `selectedRow` exposed variable of the Table is updated to reflect the data of the selected row. + +Below are the button text properties that you can set. + +| Property | Description | +| :------- | :----------- | +| Button text | Sets the text that you want to be displayed on the action button. | +| Button position | Sets the button position to left or right. | +| Background color | Sets the background color of the action button. | +| Text color | Sets the color of button-text of the action button. | +| Disable Action Button | Toggle on to disable the action button. You can programmatically set its value by clicking on the **fx** button next to it, if set to `{{true}}`, the action button will be disabled and becomes non-functional. By default, its value is set to `{{false}}`. | +| New event handler | The **New event handler** button lets you create an event handler to define behavior for action buttons based on the `On click` action. | + + +## Events + +You can trigger a range of events on the Table component. + +- **[Row hovered](#row-hovered)** +- **[Row clicked](#row-clicked)** +- **[Save changes](#save-changes)** +- **[Page changed](#page-changed)** +- **[Search](#search)** +- **[Cancel changes](#cancel-changes)** +- **[Sort applied](#sort-applied)** +- **[Cell value changed](#cell-value-changed)** +- **[Filter changed](#filter-changed)** +- **[Add new rows](#add-new-rows)** + +### Row hovered + +This event is activated when the mouse pointer hovers over a row. The `hoveredRowId` variable captures the ID of the hovered row, and the `hoveredRow` variable stores the row's data in object format. + +### Row clicked + +This event is triggered when a Table row is clicked. The `selectedRowId` and `selectedRow` exposed variables of the Table store the ID and data of the selected row, respectively. + +### Save changes + +If any cell of the Table is edited, the **Save changes** button appears at the footer of the Table. Save changes event is triggered when this button is clicked. + +### Page changed + +If server-side pagination is enabled, this event is fired when the current page is changed. Page changed event is triggered after updating the `pageIndex` variable. + +### Search + +Search event is triggered when a text is entered to the search input box of the Table. `searchText` variable is updated before triggering this event. + +### Cancel changes + +If any cell of the Table is edited, the `Discard changes` button appears at the footer of the Table. Cancel changes event is triggered when this button is clicked. + +### Sort applied + +This event is triggered when the column name header is clicked to apply sorting in `asc` or `desc`. The `sortApplied` variable is updated with an object having `column` and `direction` values. + +### Cell value changed + +If any cell of the Table is edited, the cell value changed event is triggered. + +### Filter changed + +Filter event is triggered when filter is added, removed, or updated from the filter section of the Table. `filters` variable of the Table is updated to reflect the status of filters applied. The objects will have properties: `condition`, `value`, and `column`. + +### Add new rows + +This event is triggered when the **Save** button is clicked from the **Add new row** modal on the Table. + +## Row Selection + +### Allow selection + +This option is active by default. **Enabling** this functionality allows users to choose a row in the Table by utilizing `checkboxes` placed next to each row. If this option is disabled, the ability to highlight selected rows and perform bulk selection will not be accessible. + +### Highlight selected row + +Enable this option to visually emphasize the last clicked row. **Enabling** this feature will alter the row selection appearance of the Table from a `checkbox`-based theme to a `highlight`-based theme. + +### Bulk selection + +To enable the selection of one or more rows from the current page of a table, you can activate the `Bulk selection` setting in the inspector. The values of the selected rows will be available in the `selectedRows` exposed variable. + +### Default selected row + +Default selected row will only be available when the `Allow selection` property is enabled. + +To set a default selected row, you need to provide an object with a single key-value pair. For instance, you can use the `id` key and dynamically obtain the value from a variable, let's say `x`, to specify the default selected row in the Table. We assume that the variable `x` holds a valid numerical id. + +Example: +```js +{{{"id": variables.x}}} //assuming variables.x is already set +``` + +Please ensure that the value provided in the object corresponds to an id in the Table to ensure proper functionality. + +### Select row on cell edit +Enabling the `Make editable` property for a column allows the app users to edit the column. While editing, the related row will be selected by default. To stop the row from getting selected by default, turn off `Select row on cell edit`. + +## Search, Sort and Filter + +
    + ToolJet - Component Reference - Table +
    + +### Show search + + The Show search property controls the search box on the Table. Client-side search is enabled by default and server-side search can be enabled from the events section of the inspector. Whenever the search text is changed, the `searchText` exposed variable of the Table component is updated. + + +#### Server-side search + +If server-side search is enabled, `Search` event is fired after the content of `searchText` variable is changed. `searchText` can be used to run a specific query to search for the records in your data source. + +### Enable column sorting + +Disable this option to lock the sorting of columns when the users clicks on the column header. + +#### Server-side sort +When server-side sort is enabled, clicking on the column headers will not automatically sort the table, instead, the `Sort applied` event will be fired and the applied sorting will be accessible in the `sortApplied` exposed variable. This information can be leveraged to execute queries that update the table content in accordance with the specified sorting. + +### Enable filtering + +The filter button in the Table header is visible by default. You can choose to hide it by disabling this option. + +The Table data can be filtered using the Filter data option on its top-left. You have the option to choose from various filters, such as: + +- **contains** +- **does not contain** +- **matches** +- **does not match** +- **equals** +- **does not equal** +- **is empty** +- **is not empty** +- **greater than** +- **greater than or equal to** +- **less than** +- **less than or equal to** + +#### Server-side filter +When Server-side filter is enabled, applying filters will not automatically filter the table, instead, the `Filter changed` event will be fired and the applied filters will be accessible in the `filters` exposed variables. This data can be utilized to execute queries that update the table content according to the applied filters. + + +## Pagination + +Pagination helps manage the display of large data sets by dividing them into manageable segments. Client-side pagination is enabled by default. When enabled, an additional property, **Number of rows per page**, becomes available to set the number of records per page. The default value is set to 10; if disabled, all records will appear on a single page. + +#### Server-side pagination + +Server-side pagination can be used to run a query whenever the page is changed. Under events section, you can use the `Page changed` event to execute a query and along with the `pageIndex` exposed variable. `pageIndex` can be used to query the next set of results when page is changed. + +When Server-side pagination is enabled, you'll be able to set three other Table properties: +- **Enable previous page button**: Toggle this off to disable the previous page button from the Table. +- **Enable next page button**: Toggle this off to disable the next page button from the Table. +- **Total records server side**: Set a numerical value to display particular number of records. + +:::tip +Check this how-to guide to learn more about **[server-side pagination](/docs/how-to/use-server-side-pagination)**. +::: + +## Additional actions + +### Show add new row button + +The **Add new row button** is located on the bottom-right of the Table is visible by default. You can choose to hide it by disabling this option. + +Upon clicking this button, a pop-up modal will show, providing users with the ability to insert new rows. If users input data into this row, it will be stored within the `newRows` exposed variable associated with the Table. Clicking on the **Discard** button will clear the data within this variable. However, if the users close the popup without any action (neither saving nor discarding), the data will persist. The Table incorporates an **Add new rows** event handler, which can be employed to execute queries that store the data into the data source upon clicking the **Save** button. + + +### Show download button +The download button in the Table footer is visible by default. You can choose to hide it by disabling this option. The download button allows users to download the Table data in three formats - CSV, Excel and PDF. + +The name of the downloaded file will be in the following format:
    +`Tablename_DD-MM-YYYY_HH-mm.filetype`

    +Example: Customers_25-03-2022_16-10.csv + +### Hide column selector button + +The column selector button on the Table footer is visible by default. You can choose to hide it by disabling this option. The column selector allows you define which columns you want to view on the Table. + +### Loading state + +Loading state shows a loading skeleton for the Table. This property can be used to show a loading status on the Table while data is being loaded. `isLoading` property of a query can be used to get the status of a query. + +### Show update buttons + +The update button is enabled by default. Table footer will show two update buttons **Save changes** and **Discard changes** whenever a cell is edited. Disable this option to hide update buttons. + +### Visibility +Visibility condition allows you to control whether the Table is visible or hidden on the canvas. It is enabled by default and can be turned off to hide the Table. + +### Disable +Disable condition allows you to control whether the Table is enabled or disabled on the canvas. It is enabled by default and can be turned off to hide the Table. When disabled, the Table will not be interactive. + +## 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.| + +## Styles +### Data +| Style Property | Description | Configuration Options | +|-----------------|------------------|--------------------| +| **Text color** | Change the text color of the component. | Provide a `hex color code`, choose from the picker, or set programmatically using **fx**. | +| **Row style** | Selects the style of the table rows. | Choose from dropdown: Bordered, Regular, or Striped. You can also set it programmatically using **fx**. | +| **Cell height** | Determines the size of the table cells. | Choose between `Condensed` or `Regular` size. You can also set it programmatically using **fx**. | +| **Max row height** | Controls the maximum height of rows when `Content wrap` is enabled. | Select `Auto` or define a `Custom` size. You can also set it programmatically using **fx**. | + +## Action Button +| Action | Description | Configuration Options | +|:-------------------|:----------------|:-----------------------| +| **Button radius** | Sets the radius for all action buttons. | Enter a value (default is `0`) or dynamically configure using **fx**. | + + +## Container +| Style Property | Description | Configuration Options | +|:---------------|:-----------|:----------------------| +| **Border radius** | Adds a radius to the borders of the Table. | Enter a value (default is `8`) or dynamically configure using **fx**. | +| **Border** | Defines the border color of the Table. | Change the color by providing a `hex color code`, choosing from the picker, or setting programmatically using **fx**. | +| **Box shadow** | Sets the box shadow properties of the component. | Select the box shadow color, adjust related properties, or set programmatically using **fx**. | diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/filter.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/filter.md new file mode 100644 index 0000000000..3fbce3cf8d --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/filter.md @@ -0,0 +1,116 @@ +--- +id: filter +title: Filter Operation +--- + +This guide explains how to implement a server side filter operation on the **Table** component in ToolJet. + +
    + +## Add Table Component + +Before implementing the filter operation, add the **Table** component and populate it with data: + +1. Drag a **Table** component from the right component library to the canvas. +2. Select a data source and create a new query using the query panel at the bottom. We are going to use ToolJet’s sample data source (Postgres) in this guide. Add the following query to fetch the data from the database: + +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` + +Fetch data from the data source + +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query. + +
    + +
    + +## Server Side Filter + +Follow the mentioned steps to perform server side filter operation on the **Table** component: + +1. Enable Server Side Filter under the **Table** component properties. + +Fetch data from the data source + +2. Create a new **RunJS** Query to dynamically create SQL queries for filters. + +```js +const filterData = components.table1.filters; + +const createSQLQueries = (filters) => { + + let conditions = ''; + + filters.forEach(({ condition, value, column }, index) => { + + const prefix = index === 0 ? 'WHERE' : 'AND'; + + switch (condition) { + case "contains": + conditions += ` ${prefix} ${column} ILIKE '%${value}%'`; + break; + case "doesNotContains": + conditions += ` ${prefix} ${column} NOT ILIKE '%${value}%'`; + break; + case "matches": + case "equals": + conditions += ` ${prefix} ${column} = '${value}'`; + break; + case "ne": + conditions += ` ${prefix} ${column} != '${value}'`; + break; + case "nl": + conditions += ` ${prefix} ${column} IS NULL`; + break; + case "isEmpty": + conditions += ` ${prefix} ${column} = ''`; + break; + default: + throw new Error(`Unsupported condition: ${condition}`); + } + }); + +const mainQuery = `SELECT * FROM public.sample_data_orders ${conditions}`; + +return { mainQuery }; + +} + +return createSQLQueries(filterData); +``` + +Fetch data from the data source + +3. Add an Event Handler to the **RunJS** Query
    + Event: **Query Success**
    + Action: **Run Query**
    + Query: **Select Your Query** + +Fetch data from the data source + +4. Enter the following query: +```sql + {{queries.runjs1.data.mainQuery}} +``` + +Fetch data from the data source + +5. Add an Event Handler to the **Table** component:
    + Event: **Filter Changed**
    + Action: **Run Query**
    + Query: **Select Your RunJS Query** + +Fetch data from the data source + +This will run the query and fetch the data every time a filter changes. + +6. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* + +Fetch data from the data source + +This is how server side filtering is implemented in ToolJet's **Table** component. When one or more filters are applied to the **Table** component, the query is executed on the server, ensuring that the filtering affects all records in the dataset, not just the data currently loaded into the **Table** component. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/overview.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/overview.md new file mode 100644 index 0000000000..70416b0e5a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/overview.md @@ -0,0 +1,41 @@ +--- +id: overview +title: Overview +--- + +This guide explains how to perform server side operations on a table component in ToolJet. Most databases support server side operations, but the specific implementation may vary by database. This guide uses PostgreSQL as the data source to demonstrate the process. + +
    + +## Server Side v/s Client Side + +Server side operations refer to tasks executed on the server, such as data fetching, filtering, sorting, and pagination. Server side operations use server resources, efficiently handling large datasets and ensuring faster load times for users. In contrast, client side operations are performed in the user's browser or application, which may lead to performance issues with large datasets as all data is first fetched and then processed locally. Server side operations offer better scalability and performance, especially for resource-intensive tasks. + +### When to Use Sever Side Operations? + +1. Handling Large Datasets +2. Security and Data Integrity +3. Complex Business Logic + +### When to Use Client Side Operations? + +1. Real-time Interactivity +2. Reduced Server Load +3. Offline Capabilities + +
    + +
    + +## Supported Operations + +The following server side operations can be performed on a Table in ToolJet: + +- [Search](/docs/widgets/table/serverside-operations/search/) +- [Sort](/docs/widgets/table/serverside-operations/sort/) +- [Filter](/docs/widgets/table/serverside-operations/filter/) +- [Pagination](/docs/widgets/table/serverside-operations/pagination/) + +Serverside Operations Present for Table Component in ToolJet + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/pagination.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/pagination.md new file mode 100644 index 0000000000..3df6a2c97e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/pagination.md @@ -0,0 +1,80 @@ +--- +id: pagination +title: Pagination +--- + +This guide explains how to perform server side pagination on a **Table** component in ToolJet. + +
    + +## Add a Table Component + +Before performing the server side pagination, add the **Table** component and populate it with data: + +1. Drag a **Table** component from the right component library to the canvas. +2. Select a data source and create a new query using the query panel at the bottom. This guide uses ToolJet’s sample data source (Postgres). Add the following query to fetch the data from the database: + +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` + +Fetch data from the data source + +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query. + +
    + +
    + +## Server Side Pagination + +Follow the mentioned steps to perform server side pagination on the **Table** component: + +1. Enable Server Side Pagination under the **Table** component properties. + +Fetch data from the data source + +2. Create a new query to find the total number of records on the server side. + +```sql +SELECT COUNT(*) FROM public.sample_data_orders +``` + +Fetch data from the data source + +3. Navigate to the Pagination section under the table component properties, in the Total record server side enter `{{queries.countOrders.data[0].count}}`. *Note: Make sure to change countOrders with your query name created in the last step.* + +Fetch data from the data source + +4. Enter the following query: + +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 OFFSET {{(components.table1.pageIndex-1)*100}} +``` + +Fetch data from the data source + +*Note: Make sure to replace table1 with your **Table** name.* + +5. Add an Event Handler to the **Table** component:
    + Event: **Page changed**
    + Action: **Run Query**
    + Query: **Select Your Query** + +Fetch data from the data source + +This will run the query and fetch the data every time the page is changed. + +6. To disable the next page button on the last page, navigate to the **Table** component properties under the Pagination section. Click on the **fx** icon next to the Enable next page button and enter `{{components.table1.pageIndex + +7. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* + +Fetch data from the data source + +This is how server side pagination is implemented in ToolJet's **Table** component. When pagination is used, the query is executed on the server, retrieving only the relevant set of records for the current page. This ensures that data is fetched efficiently from the server, rather than loading the entire dataset at once, improving performance and scalability. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/search.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/search.md new file mode 100644 index 0000000000..4f5d2ab617 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/search.md @@ -0,0 +1,67 @@ +--- +id: search +title: Search Operation +--- + +This guide explains how to perform a server side search operation on the **Table** component in ToolJet. + +
    + +## Add Table Component + +Before performing the search operation, add the **Table** component and populate it with data: + +1. Drag a **Table** component from the right component library to the canvas. +2. Select a data source and create a new query using the query panel at the bottom. We are going to use ToolJet’s sample data source (Postgres) in this guide. Add the following query to fetch the data from the database: + +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` + +Fetch data from the data source + +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query. + +
    + +
    + +## Server Side Search + +Follow the mentioned steps to perform server side search operation on the **Table** component: + +1. Enable Server side Search under the **Table** component properties. + +Enable server side search operation + +2. Enter the following query + +```sql +SELECT * FROM public.sample_data_orders +WHERE city ILIKE '%{{components.table1.searchText}}%' OR + country ILIKE '%{{components.table1.searchText}}%' OR + state ILIKE '%{{components.table1.searchText}}%' +LIMIT 100 +``` + +Enter the query + +The above query searches for the searched text in the city, state and country columns on the server side and returns the data. *Note: Make sure to replace table1 with your **Table** component name.* + +3. Add an Event Handler to the **Table** component:
    + Event: **Search**
    + Action: **Run Query** + Query: **Select Your Query**
    + +Add event handler + +This will run the query and fetch the data every time something is searched. + +4. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* + +Add loading state + +This is how server side search operation is implemented in ToolJet's **Table** component. Now when a search is performed in the **Table** component, the query is executed on the server, allowing the search to be applied across the entire dataset. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/sort.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/sort.md new file mode 100644 index 0000000000..39f883f212 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/table/serverside-operations/sort.md @@ -0,0 +1,70 @@ +--- +id: sort +title: Sort Operation +--- + +This guide explains how to implement a server side sort operation on the **Table** component in ToolJet. + +
    + +## Add Table Component + +Before implementing the sort operation, add the **Table** component and populate it with data: + +1. Drag a **Table** component from the right component library to the canvas. +2. Select a data source and create a new query using the query panel at the bottom. We are going to use ToolJet’s sample data source (Postgres) in this guide. Add the following query to fetch the data from the database: + +```sql +SELECT * FROM public.sample_data_orders +LIMIT 100 +``` + +Fetch data from the data source + +3. Set the value of the **Data** property of the **Table** component to `{{queries..data}}` to populate the **Table** component with the data retrieved by the query. + +
    + +
    + +## Server Side Sort + +Follow the mentioned steps to perform server side sort operation on the **Table** component: + +1. Enable Server Side Sort under the **Table** component properties. + +Fetch data from the data source + +2. Enter the following query: + +```sql +SELECT * +FROM public.sample_data_orders +{{components.table1.sortApplied ? ` + ORDER BY ${components.table1.sortApplied[0].column} + ${components.table1.sortApplied[0].direction} +` : ""}} +LIMIT 100 +``` + +Fetch data from the data source + +*Note: Make sure to replace table1 with your **Table** name.* + +3. Add an Event Handler to the **Table** component:
    + Event: **Sort applied**
    + Action: **Run Query**
    + Query: **Select Your Query** + +Fetch data from the data source + +This will run the query and fetch the data every time a sort is applied. + +4. Go to the Additional Actions section in the Table component's properties. Click the **fx** icon next to the Loading State and enter `{{queries.getOrders.isLoading}}` in the field to add a Loading State. *Note: Make sure to replace getOrders with your query name.* + +Fetch data from the data source + + +This is how server side sort operation is implemented in ToolJet's **Table** component. When sorting is applied to a column in the **Table** component, the query is executed on the server, enabling sorting across the entire dataset. This ensures that the sorting is not limited to the data loaded into the **Table** but covers all records in the database. + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/tabs.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/tabs.md new file mode 100644 index 0000000000..15d4b1ec80 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/tabs.md @@ -0,0 +1,134 @@ +--- +id: tabs +title: Tabs +--- + +# Tabs + +A **Tabs** component contains a number of defined containers that can be navigated through the tabs. Each tab acts as a [container](/docs/widgets/container/) that can have different component placed inside it. + +:::caution Restricted components +In order to avoid excessively complex situations, certain components, namely **Calendar** and **Kanban**, are restricted from being placed within the Tabs component using drag-and-drop functionality. + +If the builder attempts to add any of the aforementioned components inside the Tabs, an error message will be displayed: + +` cannot be used as a child component within the Tabs.` +::: + +
    + +## Properties + +### Tabs + +This property lets you add and remove containers from the Tabs component. Each container in the tab has its unique `id` , `title` and `disabled` for disabling individual tabs . This field expects an array of objects. + +```js +{{[ + { title: 'Home', id: '0' }, + { title: 'Profile', id: '1',disabled:'true' }, + { title: 'Settings', id: '2' } +]}} +``` + +#### Adding background color to Tabs + +You can specify the different color for each tab using the `backgroundColor` property and use hex color code or color name as the value. + +```js +{{[ + { title: 'Home', id: '0', backgroundColor: '#81D4FA' }, + { title: 'Profile', id: '1', backgroundColor: 'blue' }, + { title: 'Settings', id: '2', backgroundColor: '#ecf0f1'} + ]}} +``` + +### Default tab + +This property selects the container in the tab which matches the corresponding `id`. By default, the value is set to `0`. + +### Hide tab + +It allows you to hide all the tab titles defined in the Tabs property above. It accepts boolean values which can also be set using the toggle option or programmatically by clicking on the **fx** button. + +### Render only active tab + +This property is enabled by default. When enabled, only the active tab will be rendered and when disabled, all the tabs in the component will be rendered. + +
    + +
    + +## Events + +|
    Layout
    |
    Description
    | +|:----------- |:----------- | +| On tab switch | This event is triggered when the tab is switched. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Tabs component can be controlled using the component specific actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| setTab | Set the current tab of the Tabs component via a component-specific action within any event handler. | Employ a RunJS query to execute component-specific actions such as `await components.tabs1.setTab(1)` | + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:--------- | +| currentTab | This variable holds the id of the current tab selected on the Tabs component. | Access the value dynamically using JS: `{{components.tabs1.currentTab}}`| + +
    + +
    + +## Actions + +|
    Action
    |
    Description
    |
    Properties
    | +|:----------- |:----------- |:------------------ | +| setTab | Set current tab. | `id` | + +
    + +
    + +## 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. | + +
    + +
    + +---- + +## Styles + +|
    Style
    |
    Description
    | +|:----------- |:----------- | +| Highlight color | You can change the highlight color of the selected tab by entering the Hex color code or choosing a color of your choice from the color picker. | +| Tab width | Tab width can be set as **auto** or **equally split**. | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. By default, it's set to `{{true}}`. | +| Disable | This is `off` by default, toggle `on` the switch to lock the component and make it non-functional. You can also programmatically set the value by clicking on the **fx** button next to it. If set to `{{true}}`, the component will be locked and becomes non-functional. By default, its value is set to `{{false}}`. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/tags.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/tags.md new file mode 100644 index 0000000000..17d729d3f4 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/tags.md @@ -0,0 +1,78 @@ +--- +id: tags +title: Tags +--- +# Tags + +The **Tags** component can be used to show array of data as tags. + +
    + +## Properties + +### Tags + +It can be used to set an array of tags. It must be an array of objects like this: + +```js +{{ + [ + { title: 'success', color: '#2fb344', textColor: '#fff' }, + { title: 'info', color: '#206bc4', textColor: '#fff' }, + { title: 'warning', color: '#f59f00', textColor: '#fff' }, + { title: 'danger', color: '#d63939', textColor: '#fff' } + ] +}} +``` + +Each object should include a title, a color code for a specific tag, and a corresponding text color. + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:--------------- |:----------------------------------------- | :------------------------------------------------------------------------------------------------------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}`. | + +
    + +
    + +## Styles + +|
    Visibility
    |
    Description
    |
    Default Value
    | +|:----------- |:----------- |:---------- | +| Visibility | Toggle on or off to control the visibility of the component. You can programmatically change its value by clicking on the **fx** button next to it. If `{{false}}` the component will not be visible after the app is deployed. | By default, it's set to `{{true}}`. | + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/text-input.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/text-input.md new file mode 100644 index 0000000000..68d65bb6ad --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/text-input.md @@ -0,0 +1,153 @@ +--- +id: text-input +title: Text Input +--- + +The **Text Input** component allows users to enter a single line of text. It can be used as a standalone component or in Form fields. In this document, we'll go through all the configuration options for the **Text Input** component. + +
    + +## Properties +|
    Property
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Label | Text to display as the label for the field. | String (e.g., `Enter Your Name`). | +| Placeholder | A hint displayed to guide the user on what to enter. | String (e.g., `John Doe`). | +| Default Value | The default value that the component will hold when the app is loaded. | String (e.g., `Default Text`). | + +
    + +
    + +## Events + +| Event | Description | +|:-----------------|:---------------------------------------------| +| On change | Triggers whenever the user types something in the text input. | +| On enter pressed | Triggers whenever the user presses the enter key on the keyboard after entering text in the Text Input component. | +| On focus | Triggers whenever the user clicks inside the text input field. | +| On blur | Triggers whenever the user clicks outside the text input field. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| setText() | Sets the value of the input field. | Employ a RunJS query (for e.g.,
    `await components.textinput1.setText('this is input text')`) or trigger it using an event. | +| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.textinput1.clear()`) or trigger it using an event. | +| setFocus() | Sets the focus of the cursor on the input field. | Employ a RunJS query (for e.g.,
    `await components.textinput1.setFocus()`) or trigger it using an event. | +| setBlur() | Removes the focus of the cursor from the input field. | Employ a RunJS query (for e.g.,
    `await components.textinput1.setBlur()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.textinput1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.textinput1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.textinput1.setDisable(true)`) or trigger it using an event. | + +
    + +
    + +## Exposed Variables + +| Variable | Description | How To Access | +|:--------|:-----------|:------------| +|
    value
    | Holds the value entered by the user in the component. | Accessible dynamically with JS (for e.g., `{{components.textinput1.value}}`).| +|
    label
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.textinput1.label}}`).| +|
    isValid
    | Indicates if the input meets validation criteria. | Accessible dynamically with JS (for e.g., `{{components.textinput1.isValid}}`).| +|
    isMandatory
    | Indicates if the field is required. | Accessible dynamically with JS (for e.g., `{{components.textinput1.isMandatory}}`).| +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.textinput1.isLoading}}`).| +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.textinput1.isVisible}}`).| +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.textinput1.isDisabled}}`).| + +
    + +
    + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Regex | Regular Expression to validate the input. | Regular Expression Pattern (e.g., `^\d{3}-\d{2}-\d{4}$`). | +| Min length | Sets the minimum number of characters allowed. | Integer (e.g., `6` for a minimum of 6 characters). | +| Max length | Sets the maximum number of characters allowed. | Integer (e.g., `12` for a maximum of 12 characters).| +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.textinput1.value<5&&"Value needs to be more than 5"}}`). | + +To add regex inside `Custom Validation`, you can use the below format: + +**Format**: `{{(.test()) ? '' : 'Error message';}}` + +**Example**: `{{(/^\d{1,10}$/.test(components.textinput1.value)) ? '' : 'Error message';}}` + +
    + +
    + +## 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 (e.g., `Enter your name here.` ). | + +
    + +
    + +## 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. | + +
    + +--- + +# Styles + +
    + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Text | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `side` or `top`. | +| Width | Sets the width of the input field. | Keep the `Auto width` option for standard width or deselect it to modify the width using the slider or through code entry in **fx** that returns a numeric value. | + +
    + +
    + +## Field + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Text | Sets the text color of the text entered in the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Error text | Sets the text color of validation message that displays. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Icon | Allows you to select an icon for the component. | Enable the icon visibility, select icon and icon color. Alternatively, you can programmatically set it using **fx**. | +| 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 set it programmatically using **fx**. | + +
    + +
    + +## Container + +**Padding**
    +Allows you to maintain a standard padding by enabling the `Default` option. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/text.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/text.md new file mode 100644 index 0000000000..77f4cdb3ee --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/text.md @@ -0,0 +1,100 @@ +--- +id: text +title: Text +--- +# Text + +The **Text** component can be used to create headers, sub-headers, add labels next to various input fields and more. In this document, we'll go through all the configuration options for the **Text** component. + +## Data + +| Data Type | Description | +|:----------|:----------| +| **Plain text** | Simple text without any formatting. Ideal for straightforward messages where no emphasis or special layout is needed. | +| **Markdown** | Allows for easy formatting of text with elements like headers, bold, italics, links, and lists, making it suitable for writing content that requires basic styling. | +| **HTML** | Used to create formatted text and various elements on web pages. | + +## Events + +|
    Event
    |
    Description
    | +|:----------|:--------------------------------------| +| On click | Triggers whenever the user clicks on the component. | +| On hover | Triggers whenever the user hovers over the component. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get detailed information about all the **Actions**. +::: + +## Component Specific Actions (CSA) + +Following actions of the **Text** component can be controlled using Component-Specific Actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +| :------------ | :---------- | :------------ | +| setText() | Sets the value of the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.setText('this is input text')`) or trigger it using an event.| +| clear() | Clears the entered text in the input field. | Employ a RunJS query (for e.g.,
    `await components.text1.clear()`) or trigger it using an event. | +| setVisibility()| Sets the visibility of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setVisibility(false)`) or trigger it using an event. | +| setLoading() | Sets the loading state of the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setLoading(true)`) or trigger it using an event. | +| setDisable() | Disables the component. | Employ a RunJS query (for e.g.,
    `await components.text1.setDisable(true)`) or trigger it using an event. | + +:::info +Check the **component specific actions** available for this component **[here](/docs/actions/control-component)**. +::: + +## Exposed Variables + +| Variable | Description | How To Access | +|:--------:|:-----------:|:------------:| +|
    text
    | Holds the value of the component's label. | Accessible dynamically with JS (for e.g., `{{components.text1.text}}`). | +|
    isLoading
    | Indicates if the component is loading. | Accessible dynamically with JS (for e.g., `{{components.text1.isLoading}}`). | +|
    isVisible
    | Indicates if the component is visible. | Accessible dynamically with JS (for e.g., `{{components.text1.isVisible}}`). | +|
    isDisabled
    | Indicates if the component is disabled. | Accessible dynamically with JS (for e.g., `{{components.text1.isDisabled}}`). | + +## 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 (e.g., `Enter your name here.` ). | + +## 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. | + +--- +# Styles + +## Text + +| Text Property | Description | Configuration Options | +|:--------------------|:--------------------------------------|:---------------| +| Size | Dimensions of the characters in a font. | Enter any number between `1-100` or dynamically configure it using **fx**. | +| Weight | Determines how bold or light your text will appear. | Select from `light`, `regular`, `semi-bold` or `bold` or dynamically configure it using **fx**. | +| Style | Allows you to apply styles like italic or normal, altering the overall look of the text content. | Select from `normal`, `italic` or `oblique` or dynamically configure it using **fx**. | +| Color | Sets the color of the text. | Choose a color using the color picker or dynamically configure it using **fx**. | +| Scroll | Creates a scroll bar if the text exceeds the component's dimensions. | Choose between `enable` or `disable` or dynamically configure it using **fx**. | +| Line Height | Determines the vertical space between lines of text within an element. | Enter a number as the value (example: `1.5`) or dynamically configure it using **fx**.| +| Text Indent | Commonly used to create an indentation effect. | Enter a number as the value (example: `10`) or dynamically configure it using **fx**.| +| Alignment | Sets the alignment of the text. | Select the available options to align the text vertically or horizontally or dynamically configure it using **fx**.| +| Text Decoration | Adds an underline, overline, line-through, or a combination of lines to selected text. | Select one of the available options - `none(default)`, `underline`, `overline`, and `strike-through` or dynamically configure it using **fx**. | +| Transformation | Dictates the capitalization of text. | Select one of the available options - `none (default)`, `uppercase`, `lowercase`, `capitalize` or dynamically configure it using **fx**.| +| Letter spacing | Determines the space between each letter. | Enter a number as the value (example: `15`) or dynamically configure it using **fx**.| +| Word spacing | Determines the space between each word. | Enter a number as the value (example: `15`) or dynamically configure it using **fx**.| +| Font variant | Adjusts the text appearance by applying font variations. | Select one of the available options - `normal`, `inherit`, `small-caps`, `initial` or dynamically configure it using **fx**.| + + + +## Container + +|
    Field Property
    |
    Description
    |
    Configuration Options
    | +|:----------------|:------------|:--------------| +| Background | Sets the background color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Border | Sets the border color of the component. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| 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 | Adds padding to the component. | Select `None` for no padding and `Default` for standard padding. | diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/textarea.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/textarea.md new file mode 100644 index 0000000000..da6616c082 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/textarea.md @@ -0,0 +1,89 @@ +--- +id: textarea +title: Textarea +--- + +# Textarea + +The **Textarea** component allows users to enter text in an input field similar to the [Text Input](/docs/widgets/text-input) component. Textarea is generally preferred when we are expecting an input of multiple sentences. In this document, we'll go through all the configuration options for the **Textarea** component. + +
    + +## Properties + +|
    Property
    |
    Description
    |
    Expected Value
    | +|:-------------|:------------------------------------------------------------|:------------| +| Default value| Used to set initial value in textarea on load. It is a pre-established value that can be retrieved from the Text area component if no modifications are made to it. | Enter some text as the value (example: "John Doe"). | +| Placeholder | Provides a hint for the expected value. It disappears once the user interacts with the component. | Enter some instructional text as the value (example: "Type name here"). | + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of the **Textarea** component can be controlled using Component-Specific Actions(CSA): + +|
    Actions
    |
    Description
    |
    How To Access
    | +| :----------- | :----------- |:---------| +| setText | Sets the text on the text area component via a component-specific action within any event handler.| Employ a RunJS query to execute component-specific actions such as `await components.textarea1.setText('this is a textarea')`. | +| clear | Clears the value from the text area component via a component-specific action within any event handler.| Employ a RunJS query to execute component-specific actions such as `await components.textarea1.clear()`. | + +
    + +
    + +## Exposed Variables + +| Variables | Description | How To Access | +|:---------|:-----------|:-------------| +|
    value
    | This variable holds the value entered in the text area component. | Access the value dynamically using JS. For example, `{{components.textarea1.value}}` | + +
    + +
    + +## General + +### Tooltip + +A **Tooltip** is commonly used to provide additional information about an element. This information becomes visible when the user hovers the mouse pointer over the respective component. + +In the input field under **Tooltip**, you can enter some text and the component will show the specified text as a tooltip when it is hovered over. + +
    + +
    + +## Devices + +|
    Devices
    |
    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 + +|
    Style
    |
    Description
    |
    Expected Value
    | +| :------------- | :-------------- | :-------------- | +| Visibility | Controls the visibility of the component. If set to `{{false}}`, the component will not be visible after the app is deployed. | Use the toggle button OR click on **fx** to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`. | +| Disable | Makes the component non-functional when set to true. | Use the toggle button OR click on **fx** to pass a boolean value or a logical expression that returns a boolean value i.e. either `{{true}}` or `{{false}}`. | +| Border radius | Adjusts the roundness of the component's corners. | Numeric value | + +
    + +
    + +## General + +### Box Shadow + +The **Box Shadow** property is used to add shadow effects around a component's frame. You can specify the horizontal and vertical offsets(through X and Y sliders), blur and spread radius, and color of the shadow. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/timeline.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/timeline.md new file mode 100644 index 0000000000..e4d97edfb8 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/timeline.md @@ -0,0 +1,91 @@ +--- +id: timeline +title: Timeline +--- + +# Timeline + +The **Timeline** component provides a visual representation of a sequence of events. It's useful for displaying historical data, project milestones, or any chronological information in a clear and engaging format. + +
    + +## Properties + +### Timeline Data + +**Data requirements:** The data should be an array of objects. Each object must have **title**, **subTitle**, **iconBackgroundColor**, and **date** keys. The **iconBackgroundColor** can be a hex color code or in an RGBA format. + +**Example with hex color code:** +```json +[ + { "title": "Product Launched", "subTitle": "First version of our product released to public", "date": "20/10/2021", "iconBackgroundColor": "#4d72fa"}, + { "title": "First Signup", "subTitle": "Congratulations! We got our first signup", "date": "22/10/2021", "iconBackgroundColor": "#4d72fa"}, + { "title": "First Payment", "subTitle": "Hurray! We got our first payment", "date": "01/11/2021", "iconBackgroundColor": "#4d72fa"} +] +``` + +**Example with RGBA:** +```json +[ + { "title": "Product Launched", "subTitle": "First version of our product released to public", "date": "20/10/2021", "iconBackgroundColor": "rgba(240,17,17,0.5)"}, + { "title": "First Signup", "subTitle": "Congratulations! We got our first signup", "date": "22/10/2021", "iconBackgroundColor": "rgba(60, 179, 113,0.5)"}, + { "title": "First Payment", "subTitle": "Hurray! We got our first payment", "date": "01/11/2021", "iconBackgroundColor": "rgba(60, 179, 113,0.5)"} +] +``` + +### Hide Date + +Toggle this option to hide the date/time information in the Timeline component. + +
    + +
    + +## Component-Specific Actions (CSA) + +There are currently no Component-Specific Actions implemented for the Timeline component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the Timeline component. + +
    + +
    + +## General +### Tooltip + +A Tooltip provides additional information when users hover over the component. Set the tooltip content under the **General** accordion in the component's properties. + +
    + +
    + +## Devices + +| Property | Description | Expected Value | +| :-------------- | :---------------------------------------- | :------------- | +| Show on desktop | Controls the component's desktop visibility | 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 | Controls the component's mobile visibility | You can set it with the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | + +
    + +
    + +## Styles + +| Property | Description | Configuration Options | +| :------- | :---------- | :-------------------- | +| Visibility | Controls the component's visibility | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Box Shadow | Adds a shadow effect around the component | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. | + +:::info +Any property with an **fx** button next to it can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/timer.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/timer.md new file mode 100644 index 0000000000..4234393ef9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/timer.md @@ -0,0 +1,96 @@ +--- +id: timer +title: Timer +--- + +# Timer + +The **Timer** component allows users to track time by counting both upward and downward. It's useful for tasks like setting countdowns, tracking elapsed time, or timing events. + +
    + +## Properties + +|
    Property
    |
    Description
    | +| :--------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Default value | It specifies the initial value of timer. Format is: `HH.MM.SS.MS`. | +| Timer type | It specifies if its a upward or downward counter. Select **Count Up** or **Count Down** from the dropdown or you can click on **fx** to programmatically define the values **countUp** or **countDown**. | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +| :------------------------------------------ | :--------------------------------------------------- | +| On start | Triggers whenever the user clicks on start button. | +| On resume | Triggers whenever the user clicks on resume button. | +| On pause | Triggers whenever the user clicks on pause button. | +| On count down finish | Triggers whenever the count down timer reaches zero. | +| On reset | Triggers whenever the user clicks on reset button. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +| :---------------------------------------------- | :------------------------------------------------------------------------------------------------------------------- | :-------------------------------------------------------------------------- | +| value | This variable holds the value of the timer in the following keys: **hour**, **minute**, **second**, and **mSecond**. | Access the value dynamically using JS: `{{components.timer1.value.second}}` | + +
    + +
    + +## General + +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the General accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Devices + +|
    Devices
    |
    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 + +|
    Property
    |
    Description
    |
    Configuration Options
    | +| :--------------------------------------------- | :------------------------------------------------------------ | :--------------------------------------------------------------------------------------------------------------------------- | +| 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. | +| 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**. | + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/toggle-switch-v2.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/toggle-switch-v2.md new file mode 100644 index 0000000000..80928a871a --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/toggle-switch-v2.md @@ -0,0 +1,127 @@ +--- +id: toggle-switch-v2 +title: Toggle Switch +--- + +The **Toggle Switch** component can be used for binary choices, such as turning a feature on/off or enabling/disabling a setting. + +
    + +:::info +To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/widgets/toggle-switch)** document. +::: + +## Properties + +### Data + +| Property | Description | Expected Value | +|:---------------|:---------------|:-----------------------| +| Label | The text to be used as the label for the toggle switch. | String (e.g., `Enable notifications`). | +| Default status | Sets the default status when the app is loaded. | Toggle the on/off switch or click on **fx** and dynamically set the value. | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On change | On change event is triggered when toggle switch input is changed. | +| On check (deprecated) | On check event is triggered when toggle switch input is checked. | +| On uncheck (deprecated)| On uncheck event is triggered when toggle switch input is unchecked. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Toggle switch component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------| +| setChecked | Changes the status of the toggle switch component using component-specific action from within any event handler. | Employ a RunJS query (e.g., `await components.toggleswitch1.setChecked(true)`) or trigger it using an event. | +| setValue | Sets the value of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setValue(true)`) or trigger it using an event. | +| setLoading | Toggles the loading state of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setLoading(true)`) or trigger it using an event. | +| setVisibility | Changes the visibility of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setVisibility(true)`) or trigger it using an event. | +| setDisable | Disables or enables the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setDisable(true)`) or trigger it using an event. | +| toggle | Toggles the current state of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.toggle()`) or trigger it using an event. | + + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:-------------|:------------------------------------|:-------------------------------------------------| +| value | Holds the boolean value `true` if the toggle switch is checked and `false` if unchecked. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.value}}`). | +| label | The text label of the toggle switch. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.label}}`). | +| isValid | Indicates if the toggle switch state is valid. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isValid}}`). | +| isMandatory | Indicates if the toggle switch is mandatory. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isMandatory}}`). | +| isLoading | Indicates if the toggle switch is in a loading state. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isLoading}}`). | +| isVisible | Indicates if the toggle switch is visible. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isVisible}}`). | +| isDisabled | Indicates if the toggle switch is disabled. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isDisabled}}`). | + +
    + +
    + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.toggleswitch1.value === false &&"Value needs to be checked"}}`). | + +To add regex inside `Custom Validation`, you can use the below format: + +**Format**: `{{(.test()) ? '' : 'Error message';}}` + +**Example**: `{{(/^\d{1,10}$/.test(components.textinput1.value)) ? '' : 'Error message';}}` + +## Additional Actions + +|
    Action
    |
    Description
    |
    Configuration Options
    | +|:------------------|:------------|:------------------------------| +| Loading state | Enables a loading spinner, often used with the isLoading property 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 (e.g., `Are you a registered user?` ). | + +## 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. | + +# Styles + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Text color | Sets the color of the component's label. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on **fx** to input code that programmatically returns an alignment value - `left` or `right`. | + +## Switch + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Border color | Sets the color of the toggle switch. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Checked color | Sets the color of the toggle switch when it is checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Unchecked color | Sets the color of the toggle switch when it is not checked. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Handle color | Sets the color of the checked symbol inside the toggle switch. | Select the color or click on **fx** and input code that programmatically returns a Hex color code. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using **fx**. | + +
    + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/toggle-switch.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/toggle-switch.md new file mode 100644 index 0000000000..67b7bd9674 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/toggle-switch.md @@ -0,0 +1,132 @@ +--- +id: toggle-switch +title: Toggle Switch +--- + +The **Toggle Switch** component can be used for binary choices, such as turning a feature on/off or enabling/disabling a setting. + +
    + +:::info +To get the configuration of legacy Toggle Switch component, please refer to **[this](/docs/widgets/toggle-switch)** document. +::: + +## Properties + +### Data + +| Property | Description | Expected Value | +|:---------------|:---------------|:-----------------------| +| Label | The text to be used as the label for the toggle switch. | String (e.g., `Enable notifications`). | +| Default status | Sets the default status when the app is loaded. | Toggle the on/off switch or click on `fx` and dynamically set the value. | + +
    + +
    + +## Events + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On change | On change event is triggered when toggle switch input is changed. | +| On check (deprecated) | On check event is triggered when toggle switch input is checked. | +| On uncheck (deprecated)| On uncheck event is triggered when toggle switch input is unchecked. | + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +
    + +
    + +## Component Specific Actions (CSA) + +Following actions of Toggle switch component can be controlled using the component specific actions(CSA): + +|
    Action
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:---------| +| setChecked | Changes the status of the toggle switch component using component-specific action from within any event handler. | Employ a RunJS query (e.g., `await components.toggleswitch1.setChecked(true)`) or trigger it using an event. | +| setValue | Sets the value of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setValue(true)`) or trigger it using an event. | +| setLoading | Toggles the loading state of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setLoading(true)`) or trigger it using an event. | +| setVisibility | Changes the visibility of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setVisibility(true)`) or trigger it using an event. | +| setDisable | Disables or enables the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.setDisable(true)`) or trigger it using an event. | +| toggle | Toggles the current state of the toggle switch. | Employ a RunJS query (e.g., `await components.toggleswitch1.toggle()`) or trigger it using an event. | + + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:-------------|:------------------------------------|:-------------------------------------------------| +| value | Holds the boolean value `true` if the toggle switch is checked and `false` if unchecked. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.value}}`). | +| label | The text label of the toggle switch. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.label}}`). | +| isValid | Indicates if the toggle switch state is valid. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isValid}}`). | +| isMandatory | Indicates if the toggle switch is mandatory. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isMandatory}}`). | +| isLoading | Indicates if the toggle switch is in a loading state. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isLoading}}`). | +| isVisible | Indicates if the toggle switch is visible. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isVisible}}`). | +| isDisabled | Indicates if the toggle switch is disabled. | Accessible dynamically with JS (e.g., `{{components.toggleswitch1.isDisabled}}`). | + +
    + +
    + +## Validation + +|
    Validation Option
    |
    Description
    |
    Expected Value
    | +|:---------------|:-------------------------------------------------|:-----------------------------| +| Make this field mandatory | Displays a 'Field cannot be empty' message if no value is entered. | Enable/disable the toggle button or dynamically configure the value by clicking on `fx` and entering a logical expression. | +| Custom validation | Specifies a validation error message for specific conditions. | Logical Expression (e.g., `{{components.toggleswitch1.value === false &&"Value needs to be checked"}}`). | + +To add regex inside `Custom Validation`, you can use the below format: + +**Format**: `{{(.test()) ? '' : 'Error message';}}` + +**Example**: `{{(/^\d{1,10}$/.test(components.textinput1.value)) ? '' : 'Error message';}}` + +## 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 (e.g., `Are you a registered user?` ). | + +## Devices + +**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 + +## Label + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Text color | Sets the color of the component's label. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Alignment | Sets the position of the label and input field. | Click on the toggle options or click on `fx` to input code that programmatically returns an alignment value - `left` or `right`. | + +## Switch + +|
    Label Property
    |
    Description
    |
    Configuration Options
    | +|:---------------|:------------|:---------------| +| Border color | Sets the color of the toggle switch. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Checked color | Sets the color of the toggle switch when it is checked. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Unchecked color | Sets the color of the toggle switch when it is not checked. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Handle color | Sets the color of the checked symbol inside the toggle switch. | Select the color or click on `fx` and input code that programmatically returns a Hex color code. | +| Box shadow | Sets the box shadow properties of the component. | Select the box shadow color and adjust the related properties or set it programmatically using `fx`. | + +
    + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/tree-select.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/tree-select.md new file mode 100644 index 0000000000..3ee6dfb550 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/tree-select.md @@ -0,0 +1,154 @@ +--- +id: tree-select +title: Tree Select +--- + +# Tree Select + +The **Tree Select** component is a group checkboxes in a TreeView which can be expanded or collapsed. + +
    + +## Properties + +### Title + +The text is to be used as the title for the tree select. This field expects a `String` input. + +### Structure + +**Data requirements:** The structure needs to be an array of objects and each object should have `label` and `value` keys. If you wish to have `children` under any of the checkbox, then `children` array needs to be passed with `label` and `value` keys. + +**Example:** + +```json +[ + { + "label": "Asia", + "value": "asia", + "children": [ + { + "label": "China", + "value": "china", + "children": [ + { "label": "Beijing", "value": "beijing" }, + { "label": "Shanghai", "value": "shanghai" } + ] + }, + { "label": "Japan", "value": "japan" }, + { + "label": "India", + "value": "india", + "children": [ + { "label": "Delhi", "value": "delhi" }, + { "label": "Mumbai", "value": "mumbai" }, + { "label": "Bengaluru", "value": "bengaluru" } + ] + } + ] + }, + { + "label": "Europe", + "value": "europe", + "children": [ + { "label": "France", "value": "france" }, + { "label": "Spain", "value": "spain" }, + { "label": "England", "value": "england" } + ] + }, + { "label": "Africa", "value": "africa" } +] +``` + +:::info +Note: The `value` should be unique throughout the structure array. +::: + +### Checked values + +Checked values is an array of values passed to select the checkboxes by default. + +**Example:** + +```json +["asia", "spain"] +``` + +### Expanded values + +Similar to checked values, expanded values is an array of values passed to expand the node by default. + +**Example:** + +```json +["asia"] +``` + +
    + +
    + +## Events + +:::info +Check [Action Reference](/docs/category/actions-reference) docs to get the detailed information about all the **Actions**. +::: + +|
    Event
    |
    Description
    | +|:----------- |:----------- | +| On change | On check event is triggered whenever the checkbox value is changed (checked or unchecked). | +| On check | On check event is triggered whenever the checkbox value is checked. | +| On uncheck | On uncheck event is triggered whenever the checkbox value is unchecked. | + +
    + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +|
    Variables
    |
    Description
    |
    How To Access
    | +|:----------- |:----------- |:-------| +| checked | This variable holds the value of all the checked items on the Tree Select component. | Access the value dynamically using JS: `{{components.treeselect1.checked[1]}}`| +| expanded | This variable holds the value of expanded items on the Tree Select component.| Access the value dynamically using JS: `{{components.treeselect1.expanded[0]}}`| +| checkedPathArray | This variable holds the path of the checked items in different arrays. | Access the value dynamically using JS: `{{components.treeselect1.checkedPathArray[1][1]}}`| +| checkedPathStrings | This variable holds the path of the checked items in strings separated by a dash(-).| Access the value dynamically using JS: `{{components.treeselect1.checkedPathStrings[2]}}`| + +
    + +
    + +## Layout + +|
    Layout
    |
    Description
    |
    Expected Value
    | +|:----- |:--------- |:------------- | +| Show on desktop | Toggle on or off to display desktop view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | +| Show on mobile | Toggle on or off to display mobile view. | You can programmatically determining the value by clicking on **fx** to set the value `{{true}}` or `{{false}}` | + +
    + +
    + +--- + +## Styles + +|
    Style
    |
    Description
    |
    Default Value
    | +|:----- |:--------- |:------------- | +| Text color | Change the color of the text in the component by providig the `Hex color code` or choosing a color from the picker. | | +| Checkbox color | Change the color of the toggle switch in the component by providig the `Hex color code` or choosing a color from the picker. | | +| Visibility | This is to control the visibility of the component. If `{{false}}` the component will not visible after the app is deployed. It can only have boolean values i.e. either `{{true}}` or `{{false}}`. | By default, it's set to `{{true}}`. | +| Disable | This property only accepts boolean values. If set to `{{true}}`, the component will be locked and becomes non-functional. | By default, its value is set to `{{false}}`.| + +:::info +Any property having **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/widgets/vertical-divider.md b/docs/versioned_docs/version-3.0.0-LTS/widgets/vertical-divider.md new file mode 100644 index 0000000000..65c1af69af --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/widgets/vertical-divider.md @@ -0,0 +1,62 @@ +--- +id: vertical-divider +title: Vertical Divider +--- +# Vertical Divider + +The **Vertical Divider** component creates a clear visual separation between two adjacent components by adding a vertical separator. It's commonly used to enhance layout structure, improve readability, and organize content by providing a distinct division between sections within a user interface. + +
    + +## Component Specific Actions (CSA) + +There are currently no CSA (Component-Specific Actions) implemented to regulate or control the component. + +
    + +
    + +## Exposed Variables + +There are currently no exposed variables for the component. + +
    + +
    + +## General +### Tooltip + +A Tooltip is often used to specify extra information about something when the user hovers the mouse pointer over the component. + +Under the **General** accordion, you can set the value in the string format. Now hovering over the component will display the string as the tooltip. + +
    + +
    + +## Devices + +|
    Devices
    |
    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 + +|
    Property
    |
    Description
    |
    Configuration Options
    | +| ----------- | ----------- | ----------- | +| Divider Color | Sets the color of the divider. | Accepts any valid color value like hex (`#000000`), RGB, or predefined color names. | +| Visibility | Controls whether the divider is visible. | You can set it as either `true` or `false` or dynamically configure the value by clicking on **fx** and entering a logical expression. | +| Box Shadow | Adds shadow around the divider to create depth. | Accepts box-shadow values like `none`, `2px 4px 6px rgba(0, 0, 0, 0.1)` | + +:::info +Any property having the **fx** button next to its field can be **programmatically configured**. +::: + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/how-to/trigger-from-app.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/how-to/trigger-from-app.md new file mode 100644 index 0000000000..1bb89563af --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/how-to/trigger-from-app.md @@ -0,0 +1,40 @@ +--- +id: trigger-workflow-from-app +title: Trigger Workflows Within ToolJet +--- + +This guide will show you how to set up a workflow and trigger it from a ToolJet application. +
    + +## Create Workflow + +To create a workflow follow the following steps: + +1. Navigate to the Workflows Section from the navigation bar on the dashboard. + +Navigate to Workflow Section + +2. Click on **Create new workflow**, enter a unique name for your workflow, and click on **+Create workflow** to create the workflow. + +Create a new workflow + +3. Configure your workflow. You can refer to the **[workflow overview documentation](/docs/workflows/overview)** to learn how you can configure a workflow. + +Configure workflow + +
    + +
    + +## Configure Workflow Query + +1. Within your ToolJet application, create a new query and select **Run Workflow**. +Create a workflow query + +2. Select your workflow from the dropdown and configure the parameters (if required). +Configure the Query + +3. Now, you can trigger this workflow by clicking on the **Run** button or by adding a new event handler on a Button component. +Add event handler + +
    \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/how-to/trigger-using-webhook.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/how-to/trigger-using-webhook.md new file mode 100644 index 0000000000..da668299db --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/how-to/trigger-using-webhook.md @@ -0,0 +1,74 @@ +--- +id: trigger-using-webhook +title: Trigger Workflows Using Webhooks +--- + +This guide demonstrates how to trigger workflows using webhooks. + +
    + +## Creating a Workflow + +To create a workflow follow the following steps: + +1. Navigate to the **Workflows** Section on the dashboard. + +Navigate to Workflow Section + +2. Click on **Create new workflow**, enter a unique name for your workflow and click on **+ Create workflow** to create the workflow. + +Create a new workflow + +3. Configure your workflow. You can refer to the **[workflow overview documentation](/docs/workflows/overview)** to learn how you can configure a workflow. + +Configure workflow + +4. Navigate to the Triggers section. + +Webhook option on the left panel + +5. Click on **Webhooks**. By default, the webhook trigger is disabled. Toggle the switch to **enable** the webhook trigger. Refer to the [trigger documentation](/docs/workflows/workflow-triggers#webhooks) for more information. + +Enable Webhook + +6. Add **Parameters** to the workflow by clicking the **+ Add parameter** button. + +Add parameters to your webhook + +7. Copy the **Endpoint URL** and **API token**. + +Copy URL and API Token + +
    + +
    + +## Triggering a Webhook + +Let's take a look at an example of triggering a webhook using Postman. + +1. Visit [Postman](https://www.postman.com/), and click **New Request**. + +Postman preview + +2. Select the **POST** Method and paste the **Endpoint URL** that was copied earlier. + +Paste URL in Postman + +3. Navigate to the **Authorization** tab, select **Bearer Token** as the **Auth Type**, and enter the **API token**. + +Enter the API Token + +4. Go to the **Body** tab, select **Raw**, and enter the required parameters in JSON format. + +Enter the parameters in postman + +5. Click on **Send** to trigger the webhook. It will fetch the response from the created workflow. + +Final Response + +
    + +This was a basic example of how you can trigger workflows using webhooks. You can use webhooks to connect ToolJet to external applications and services for advanced use-cases and event-driven automation. + +If you want to learn how to trigger workflows withing ToolJet, refer to **[this guide](/docs/workflows/trigger-workflow-from-app)**. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/logs.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/logs.md new file mode 100644 index 0000000000..b372b577fa --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/logs.md @@ -0,0 +1,12 @@ +--- +id: logs +title: Logs +--- + +Once you execute the workflow by clicking on the **Run** button, the logs panel will reflect the execution details of each node. Logs let you easily track the order of execution and check whether the execution of individual nodes is successful. You can click on the top bar of the logs panel to expand or minimize it. + +
    + Logs Preview +
    + +In the above screenshot, we can see the start time and end time for all the nodes along with their names and a message that highlights whether the node was successfully executed or failed. Additionally, logs can also highlight detailed messages to expand on any errors that may occur during execution. \ No newline at end of file diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/nodes.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/nodes.md new file mode 100644 index 0000000000..25e2f0b9f9 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/nodes.md @@ -0,0 +1,70 @@ +--- +id: nodes +title: Types of Nodes +--- + +Nodes are graphical representations of each process in a workflow. Each node can access the data from the nodes that were executed earlier. Every workflow contains key node types that help orchestrate the flow of data and logic. + +## Start Trigger Node +The **Start Trigger** node is the entry point of your workflow. It can be triggered: +- Manually through ToolJet applications similar to queries +- Via webhooks from external systems + +The data received by the Start Trigger through parameters is accessible throughout the workflow. + +Workflows Preview + +## Logic Nodes + +### JavaScript Node +The **JavaScript** node lets you write custom server-side code to: +- Transform data +- Perform complex calculations +- Create custom messages +- Handle business logic + +The code must include a **return** statement to pass results to subsequent nodes. + +JavaScript Node + +### If Condition Node +The **If condition** node enables branching logic with: +- One or two incoming flows +- Two outgoing flows (true/false paths) +- Logical expressions for decision making + +When the condition evaluates to true, the outgoing node connected to the green arrow will be executed. If it is false, the outgoing node connected to the red arrow will be executed. + +If Condition Node + +### Loop Node +The **Loop** node allows you to: +- Iterate over datasets +- Process items sequentially +- Apply operations to each item +- Aggregate results + +Loop Node + +## Data Source Nodes +Data source nodes connect to your configured data sources, enabling you to: +- Execute database queries +- Make API calls +- Send emails/messages +- Interact with external services + +Each data source node has specific configurations based on its type: +- **PostgreSQL**: SQL query fields +- **REST API**: HTTP method, endpoint, headers +- **Twilio**: SMS configuration fields +- And more based on your configured sources + +Data Sources Node + +## Response Node +The **Response** node defines the final output of your workflow. You can configure multiple response nodes to return multiple execution results. + +Response Node + +Each node type serves a specific purpose in the workflow. By combining these nodes, you can create powerful automation flows tailored to your business needs. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/overview.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/overview.md new file mode 100644 index 0000000000..3c893c5f6b --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/overview.md @@ -0,0 +1,117 @@ +--- +id: overview +title: Overview +--- + +
    Available on: Paid plans
    + +
    + +## Introduction + +ToolJet Workflows enable users to create complex, data-centric automations using a visual, node-based interface. It extends ToolJet's capabilities beyond building user interfaces, allowing developers and business users to automate processes, integrate data from various sources, and execute custom logic without writing extensive code. + +
    + Workflows Preview +
    + +Workflows complements the app-building features by providing a way to handle backend processes, data transformations, and integrations. This makes ToolJet a more comprehensive solution for creating internal tools and automations. + +## Create Your First Workflow + +This guide will walk you through creating your first workflow in ToolJet. You'll learn how to use the Workflow builder to create a simple automated process that fetches data from a database, filters it, and sends notifications based on certain conditions. + +### Accessing the Workflow Builder + +- Log in to your ToolJet account. +- From the main dashboard, click on the **Workflows** icon in the left sidebar. +- Click the **Create New Workflow** button to create a new workflow. Rename it to *sendEventNotification*. + +### Step 1: Add a Database Query Node + +You'll start by fetching employee data from a ToolJetDB table named *employees*. + +- You'll see a **Start** node already on the canvas. This is the entry point of your workflow. +- Create an outgoing node from the **Start** node, and select the **ToolJetDB** node. Rename the node to *getEmployees*. +- Select Table name as *employees* and Operation as List view. + +
    + Add a DB Query Node +
    + +### Step 2: Transform Data Using RunJS Node + +Next, you'll filter the employee data to include only those from California. + +- Create an outgoing node from the **Start** node, and select the **RunJS** node. Rename it to *filterEmployeeList*. +- Enter the code below to filter out employees who are from California. + +```js +return getEmployees.data.filter(employee => + employee.location === "California") + ``` + +
    + Transform Data Using RunJS +
    + + ### Step 3: Send Notifications + +Next, you'll implement a loop to send SMS notifications to the filtered employees. The Loop node allows you to iterate through an array and perform an operation on each element. + +- Create an outgoing node from the **filterEmployeeList** node, and select the **Loop** node. Rename it to *sendSMS*. +- Under Looped function, select **Twilio** as the data source. Configure the Operation as Send SMS, enter `{{value.number}}` in the To Number field. +- Under the Body field, enter the following message: + +```js +Hey {{value.name}}, +Here's the link with all the details for today's ToolJet +conference in California. +https://tooljet.com/events/{{value.location}} +``` + +
    + Send Notifications Through Twilio +
    + +### Step 4: Configure the Response Node + +Finally, you'll set up conditions to handle the success or failure of the SMS sending process. + +- Create a new outgoing **If condition** node from the *sendSMS* node. +- Enter the code below in the input field: +`sendSMS.status === "ok" ? true : false` +- Create an outgoing **Response** node from the green arrow to configure the response when the **If condition** node returns true. + Enter the following code to show the output as success when the SMS is successfully sent: +`return ({output: "success"})` +- Similarly, create an outgoing **Response** node from the red arrow to configure the response when the **If condition** node returns false. Enter the following code: +`return ({output: "failure"})` + +
    + Configure The Response Node +
    + +### Step 5: Executing the Workflow + +Click on the **Run** button on the top-right to execute the workflow. The logs panel will expand and provide an overview of all the nodes executed in this workflow. + +
    + Executing The Workflow +
    + +- The **Input** section of the log will display all the incoming data to a node. + +
    + Input Logs +
    + +- The **Output** section will display the data that is transferred to the next node while Logs will display the sequence of execution, and success and error messages. + +
    + Output Logs +
    + +Congratulations on creating your first workflow! This workflow fetches data, transforms the data, sends SMS notifications, and handles success or failure responses. + +As you saw in this example, ToolJet Workflows provides a streamlined way to extend the capabilities of your ToolJet applications and automate complex processes. + diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/permissions.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/permissions.md new file mode 100644 index 0000000000..9da32520f7 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/permissions.md @@ -0,0 +1,50 @@ +--- +id: permissions +title: Permissions +--- + +Permissions in **ToolJet Workflows** provide a structured approach to access control, ensuring precise management of who can view, edit, or execute workflows. The below table gives a detailed summary of permissions in context of ToolJet Workflows. + +| User Group | Workflows Dashboard Access | Create/Edit Workflows | Execute Workflows | Using Workflows in Tooljet App Builder | Enable/Disable Workflows | +|:------------------------------------:|:-----------------:|:--------:|:----------:|:------------:|:-------------:| +| **Admins** | ✅ | ✅ | ✅ | ✅ | ✅ | +| **Groups with App Editing Permissions** | ❌ | ❌ | ✅ | ✅ | ❌ | +| **End Users** | ❌ | ❌ | ✅ | ❌ | ❌ | + +
    + +## Admins +**Admins** can create, edit, and manage workflows, access the workflow dashboard and flow builder, and use them in ToolJet's **App Builder**. They also have the option to use the **Enable** toggle on the top-right to enable or disable the execution of workflows in ToolJet applications. + +
    + +
    + +## Groups with App Editing Permissions +**Groups with App Editing Permissions** can use the existing workflows in ToolJet's **App Builder**. + +Example: +Imagine a company using ToolJet to build internal applications. The HR department wants to integrate a new workflow that triggers an automated email when an employee's leave request is approved. A member of the **Groups with App Editing Permissions** can: + +- Add a button named *Approve Leave* in the app builder interface. +- Link this button to an existing workflow which sends an automated email. +- Design a chart that displays the number of leaves approved monthly using another workflow that provides the relevant data. + +While they can harness existing workflows and integrate them into app functionalities, Groups with App Editing Permissions can't create or modify the workflows themselves like **Admins**. + +
    + +
    + +## End Users + +**End Users** can only execute workflows in the application. + +Example: +Taking the same company scenario, an employee(end user) from the Sales department logs into the ToolJet-based internal application to request annual leave. Here's their interaction: + +- The employee fills in a *Leave Request* form. +- Upon submission, they click the *Request Leave* button (which is linked to a workflow that sends this request to the HR department). +- Once HR approves the leave using the *Approve Leave* button (created by the "Groups with App Editing Permissions"), the employee receives an automated email notification, which is triggered by another workflow. + +
    diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/results.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/results.md new file mode 100644 index 0000000000..11e9ccfc9e --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/results.md @@ -0,0 +1,59 @@ +--- +id: results +title: Configuring Response +--- + +Users have the flexibility to customize the response returned by workflows. The **Response** node enables configuration of your output through JavaScript code. Each workflow can have multiple response nodes. + +## Return Data from a Single Node +Consider a workflow that combines sales data (from the *getSalesData* node) with inventory data (from the *getInventory* node) via a JavaScript operation (in the *generateCSVData* node). + +
    + Response Node Preview +
    + +Within the **Response** node, specify the output by using a return statement that encapsulates an object within parentheses: + +```js +return ({generateCSVData}) +``` + +
    + Single Node Response +
    + + +## Returning Data From Multiple Nodes +You can also return data from other nodes. Either return the complete data set or specify only the required portions, as demonstrated below: + +```js +return + ({sales: getSalesData.data, + inventory: getInventory.data, + csv: generateCSVData.data}) +``` + +
    + Multi Node Response +
    + +## Fine Tuning Your Response Using JavaScript +Refine your response by manipulating the data using JavaScript functions. For example, the slice function can be used to select a subset of data: + +```js +return + ({sales: getSalesData.data.slice(0,5), + inventory: getInventory.data.slice(0,5), + csv: generateCSVData.data}) +``` + +
    + Transformed Response +
    + +## Workflow Execution + +When executing workflows with triggers, the configured data in the **Response** node will be included in the API response. When triggered inside a ToolJet app, the data will be returned in the same format as a regular query. + + + diff --git a/docs/versioned_docs/version-3.0.0-LTS/workflows/triggers.md b/docs/versioned_docs/version-3.0.0-LTS/workflows/triggers.md new file mode 100644 index 0000000000..6548eb6b33 --- /dev/null +++ b/docs/versioned_docs/version-3.0.0-LTS/workflows/triggers.md @@ -0,0 +1,154 @@ +--- +id: workflow-triggers +title: Triggers +--- + +Triggers can be used to execute a workflow. Currently, ToolJet supports two types of triggers: [Webhooks](#webhooks) and [Manual](#manual). + +
    + Triggers +
    + +
    + +## Webhooks + +A webhook trigger allows you to run the workflow when a webhook is received. You can configure the webhook trigger from the Triggers tab. The webhook URL is unique for each workflow. + +
    + +
    + +### Creating a Webhook Trigger +- Click on the **Triggers** option in the left panel to open the Triggers tab. + +
    + Triggers +
    + +- Click on the **Webhooks** option. + +
    + Triggers +
    + +- By default, the webhook trigger is disabled. Toggle the switch to **enable** the webhook trigger. + +
    + Triggers +
    + +- Once enabled, you can choose the **Environment** to modify the webhook endpoint URL to be copied for that specific environment. For example, if you choose the **Production** environment, you can `Copy URL` or `Copy as cURL` which can then be used to trigger for **Production** environment accordingly. + +
    + Triggers +
    + +- Find the API endpoint URL in the **Endpoint** field. You can use this URL to send a POST request to trigger the workflow. You can also click on the **Copy** button to copy the URL to the clipboard. You can either select `Copy URL` or `Copy as cURL` from the dropdown menu. The `Copy as cURL` option copies the URL as a cURL command which will include details such as the `API token` and `Environment`. An example of the Endpoint URL is as follows: + + ``` + http://{TOOLJET_HOST}/api/v2/webhooks/workflows/:id/trigger + ``` + +
    + Triggers +
    + +- The API token is used to authenticate the request. You can find the API token in the **API Token** field. You can also click on the **Copy** button to copy the API token to the clipboard. + +
    + Triggers +
    + + :::info + Currently, authentication is mandatory for webhooks. Use a bearer token in the `Authorization` header for authentication.
    + **Format:** + `Authorization: Bearer `
    + **Example:** + `Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...` + ::: + +- Parameters can be passed to the workflow using the **Parameters** field. The parameter `key` and their `type` can be specified in the **Parameters** field. For example, if you want to pass the `name` and `age` parameters to the workflow using the webhook triggers, you can set the **Parameters** field as follows: + + ```json + "name": "string", + "age": "number" + ``` + +
    + Triggers +
    + +- The **Test JSON parameters** field can be used to test the webhook trigger. You can enter the parameter values in the **Test JSON parameters** field and click on the **Run** button to test the webhook trigger. The workflow will be executed with the parameter values specified in the **Test JSON parameters** field. + + ```json + { + "name": "John Doe", + "age": 30 + } + ``` + + These parameters can be accessed in the workflow using the `startTrigger.params`. + +
    + Triggers +
    + +
    + +
    + +### Restrictions on Usage of Webhook Triggers + +There are certain restrictions on the usage of webhook triggers that are configurable, both at the instance level and at the workspace level depending on the license. The restrictions are as follows: + +- Number of executions per month +- Number of executions per day +- Number of parallel executions +- Execution time per workflow + +For limiting parallel executions, the following environment variables can be used: + +|
    Environment Variable
    |
    Value
    |
    Description
    | +| -------------------- | ----- | ----------- | +| WEBHOOK_THROTTLE_TTL | 60000 | Time in milliseconds for the webhook requests to live | +| WEBHOOK_THROTTLE_LIMIT | 100 | Maximum number of requests within the TTL that will be throttled | + +:::tip Whitelisting API endpoints +For Virtual Private Clouds (VPCs), restrict access only to the `{TOOLJET_HOST}/api/v2/workflows/*` endpoint. +::: + +
    + +
    + +## Manual + +Manual triggers can be used to run a workflow manually from the ToolJet apps. Manual triggers work similar to the queries of a data source. You can add a trigger to an application from the query panel. + +In the application, simply click on the `+ Add` button in the query panel and select **Run Workflow**. Then select the desired workflow from the dropdown. Rename the query if required and click on the **Run** button to trigger the workflow or add this query to a event handler to trigger the workflow on a specific event. + +
    + Triggers +
    + +
    + +
    + +### Passing Parameters + +Parameters can be passed to the workflow from the **Params** field in the query. The parameter `key` and their `value` can be specified in the **Params** field. For example, if you want to pass the `name` and `age` parameters to the workflow using the manual triggers, you can set the **Params** field as follows: + +```json +"name": "John Doe", +"age": 30 +``` + +Assume a scenario where teams manage multiple ToolJet apps, each requiring queries to the same database for specific data. Instead of duplicating these steps across various apps, a workflow can be created once and seamlessly integrated wherever needed. + +
    + Triggers +
    + +
    \ No newline at end of file diff --git a/docs/versioned_sidebars/version-2.50.0-LTS-sidebars.json b/docs/versioned_sidebars/version-2.50.0-LTS-sidebars.json index 0d006093ee..6277acd842 100644 --- a/docs/versioned_sidebars/version-2.50.0-LTS-sidebars.json +++ b/docs/versioned_sidebars/version-2.50.0-LTS-sidebars.json @@ -1,5 +1,6 @@ { "docs": [ + "doc-home-page", { "type": "category", "label": "Getting Started", @@ -53,7 +54,6 @@ "setup/kubernetes-eks", "setup/azure-container", "setup/google-cloud-run", - "setup/client", "setup/env-vars", "setup/http-proxy", "setup/tooljet-subpath", @@ -254,7 +254,7 @@ "data-sources/amazonses", "data-sources/appwrite", "data-sources/athena", - "data-sources/azureblob", + "data-sources/azureblobstorage", "data-sources/baserow", "data-sources/bigquery", "data-sources/firestore", @@ -265,7 +265,7 @@ "data-sources/dynamodb", "data-sources/elasticsearch", "data-sources/gcs", - "data-sources/google.sheets", + "data-sources/googlesheets", "data-sources/graphql", "data-sources/grpc", "data-sources/influxdb", @@ -410,7 +410,7 @@ "type": "category", "label": "Marketplace Plugins", "items": [ - "marketplace/plugins/marketplace-plugin-redshift", + "marketplace/plugins/marketplace-plugin-awsredshift", "marketplace/plugins/marketplace-plugin-textract", "marketplace/plugins/marketplace-plugin-aws-lambda", "marketplace/plugins/marketplace-plugin-engagespot", @@ -422,7 +422,8 @@ "marketplace/plugins/marketplace-plugin-supabase", "marketplace/plugins/marketplace-plugin-pocketbase", "marketplace/plugins/marketplace-plugin-portkey", - "marketplace/plugins/marketplace-plugin-prestodb" + "marketplace/plugins/marketplace-plugin-Presto", + "marketplace/plugins/marketplace-plugin-sharepoint" ] } ] diff --git a/docs/versioned_sidebars/version-3.0.0-LTS-sidebars.json b/docs/versioned_sidebars/version-3.0.0-LTS-sidebars.json new file mode 100644 index 0000000000..574623e956 --- /dev/null +++ b/docs/versioned_sidebars/version-3.0.0-LTS-sidebars.json @@ -0,0 +1,768 @@ +{ + "docs": [ + { + "type": "category", + "label": "Getting Started", + "className": "category-as-header getting-started-header", + "collapsed": false, + "collapsible": false, + "items": [ + "doc-home-page", + "getting-started/platform-overview", + "getting-started/quickstart-guide", + { + "type": "category", + "label": "ToolJet Concepts", + "items": [ + "tooljet-concepts/what-are-components", + "tooljet-concepts/what-are-datasources", + "tooljet-concepts/what-are-queries", + "tooljet-concepts/inspector", + "tooljet-concepts/what-are-events", + "tooljet-concepts/actions", + "tooljet-concepts/variables", + "tooljet-concepts/how-to-access-values", + "tooljet-concepts/component-specific-actions", + "tooljet-concepts/exposed-variables", + "tooljet-concepts/pages", + "tooljet-concepts/run-js", + "tooljet-concepts/styling-components", + "tooljet-concepts/workspace-constants", + "tooljet-concepts/permissions", + "tooljet-concepts/super-admin" + ] + }, + { + "type": "category", + "label": "How To", + "items": [ + "how-to/use-url-params-on-load", + "how-to/pass-query-params-in-custom-components", + "how-to/use-custom-parameters", + "how-to/pass-values-in-rest-api", + "how-to/build-dynamic-forms", + "how-to/setup-rsyslog", + "how-to/conditionally-display-components", + "how-to/use-inspector", + "how-to/use-form-component", + "how-to/access-cellvalue-rowdata", + "how-to/conditionally-format-table", + "how-to/bulk-update-multiple-rows", + "how-to/delete-multiple-rows", + "how-to/use-server-side-pagination", + "how-to/access-currentuser", + "how-to/use-axios-in-runjs", + "how-to/import-external-libraries-using-runpy", + "how-to/import-external-libraries-using-runjs", + "how-to/run-actions-from-runjs", + "how-to/intentionally-fail-js-query", + "how-to/run-query-at-specified-intervals", + "how-to/use-to-py-function-in-runpy", + "how-to/access-users-location", + "how-to/use-s3-signed-url-to-upload-docs", + "how-to/s3-custom-endpoints", + "how-to/upload-files-aws", + "how-to/upload-files-gcs", + "how-to/loading-image-pdf-from-db", + "how-to/use-events-on-chart", + "how-to/print-multi-tabs-report", + "how-to/display-listview-record-on-new-page" + ] + }, + { + "type": "category", + "label": "Deployment", + "link": { + "type": "doc", + "id": "setup/index" + }, + "items": [ + "setup/try-tooljet", + "setup/choose-your-tooljet", + "setup/system-requirements", + "setup/digitalocean", + "setup/docker", + "setup/ec2", + "setup/ecs", + "setup/openshift", + "setup/helm", + "setup/kubernetes", + "setup/kubernetes-gke", + "setup/kubernetes-aks", + "setup/kubernetes-eks", + "setup/azure-container", + "setup/google-cloud-run", + "setup/env-vars", + "setup/http-proxy", + "setup/tooljet-subpath", + "setup/v2-migration-guide", + "setup/upgrade-to-lts", + "setup/upgrade-to-v3", + "setup/cloud-v3-migration" + ] + } + ] + }, + { + "type": "category", + "label": "Build with AI", + "className": "category-as-header build-with-ai-header", + "collapsed": false, + "collapsible": false, + "items": [ + "build-with-ai/overview", + "build-with-ai/generate-applications", + "build-with-ai/ai-docs-assistant" + ] + }, + { + "type": "category", + "label": "App Builder", + "collapsed": false, + "collapsible": false, + "className": "category-as-header app-builder-header", + "items": [ + "app-builder/overview", + { + "type": "category", + "label": "Build Apps", + "items": [ + "app-builder/walkthrough/create-ui", + "app-builder/walkthrough/create-queries", + "app-builder/walkthrough/using-code", + "app-builder/walkthrough/accessing-values", + "app-builder/walkthrough/variables", + "app-builder/importing-exporting-applications" + ] + }, + { + "type": "category", + "label": "References", + "items": [ + { + "type": "category", + "label": "Layout Guide", + "items": [ + "app-builder/components-library", + "app-builder/query-panel", + "tutorial/pages", + "app-builder/topbar", + "app-builder/left-sidebar", + "app-builder/canvas", + "app-builder/preview", + "app-builder/share", + "app-builder/customstyles" + ] + }, + { + "type": "category", + "label": "Components Catalog", + "items": [ + "widgets/overview", + { + "type": "category", + "label": "Components", + "items": [ + "widgets/bounded-box", + "widgets/button", + "widgets/button-group", + "widgets/calendar", + { + "type": "category", + "label": "Chart", + "items": [ + "widgets/chart/chart-properties", + "widgets/chart/chart-examples", + "widgets/chart/transforming-data-for-charts" + ] + }, + { + "type": "category", + "label": "Chat", + "items": [ + "widgets/chat/overview", + "widgets/chat/properties", + "widgets/chat/csa", + "widgets/chat/markdown" + ] + }, + "widgets/checkbox", + "widgets/circular-progress-bar", + "widgets/code-editor", + "widgets/color-picker", + "widgets/container", + "widgets/custom-component", + "widgets/date-range-picker", + "widgets/datepicker", + "widgets/divider", + "widgets/dropdown", + "widgets/file-picker", + "widgets/form", + "widgets/html", + "widgets/icon", + "widgets/iframe", + "widgets/image", + "widgets/kanban", + "widgets/link", + "widgets/listview", + "widgets/map", + "widgets/modal", + "widgets/multiselect", + "widgets/number-input", + "widgets/password-input", + "widgets/pdf", + "widgets/pagination", + "widgets/qr-scanner", + "widgets/radio-button", + "widgets/range-slider", + "widgets/spinner", + "widgets/star-rating", + "widgets/statistics", + "widgets/steps", + "widgets/svg-image", + { + "type": "category", + "label": "Table", + "items": [ + "widgets/table/table-properties", + "widgets/table/table-columns", + "widgets/table/table-csa-and-variables", + { + "type": "category", + "label": "Serverside Operations", + "items": [ + "widgets/table/serverside-operations/overview", + "widgets/table/serverside-operations/search", + "widgets/table/serverside-operations/sort", + "widgets/table/serverside-operations/filter", + "widgets/table/serverside-operations/pagination" + ] + }, + "widgets/table/dynamic-column" + ] + }, + "widgets/tabs", + "widgets/tags", + "widgets/text-input", + "widgets/text", + "widgets/textarea", + "widgets/rich-text-editor", + "widgets/timeline", + "widgets/timer", + "widgets/toggle-switch-v2", + "widgets/tree-select", + "widgets/vertical-divider" + ] + }, + { + "type": "category", + "label": "Actions Reference", + "link": { + "type": "generated-index", + "title": "Actions Reference", + "description": "All the actions that can be performed through event handlers", + "keywords": [ + "actions", + "events" + ] + }, + "items": [ + "actions/show-alert", + "actions/logout", + "actions/run-query", + "actions/open-webpage", + "actions/go-to-app", + "actions/show-modal", + "actions/close-modal", + "actions/copy-to-clipboard", + "actions/set-localstorage", + "actions/generate-file", + "actions/set-table-page", + "actions/set-variable", + "actions/unset-variable", + "actions/switch-page", + "actions/set-page-variable", + "actions/unset-page-variable", + "actions/control-component" + ] + } + ] + } + ] + }, + "app-builder/anti-patterns", + "tutorial/keyboard-shortcuts" + ] + }, + { + "type": "category", + "label": "Data Sources", + "className": "category-as-header data-sources-header", + "collapsed": false, + "collapsible": false, + "items": [ + "data-sources/overview", + "data-sources/sample-data-sources", + { + "type": "category", + "label": "Data Sources library", + "items": [ + "data-sources/airtable", + "data-sources/s3", + "data-sources/amazonses", + "data-sources/appwrite", + "data-sources/athena", + "data-sources/azureblobstorage", + "data-sources/baserow", + "data-sources/bigquery", + "data-sources/firestore", + "data-sources/clickhouse", + "data-sources/cosmosdb", + "data-sources/couchdb", + "data-sources/databricks", + "data-sources/dynamodb", + "data-sources/elasticsearch", + "data-sources/gcs", + "data-sources/googlesheets", + "data-sources/graphql", + "data-sources/grpc", + "data-sources/influxdb", + "data-sources/mailgun", + "data-sources/mariadb", + "data-sources/minio", + "data-sources/mongodb", + "data-sources/mssql", + "data-sources/mysql", + "data-sources/n8n", + "data-sources/notion", + "data-sources/openapi", + "data-sources/oracledb", + "data-sources/postgresql", + "data-sources/redis", + { + "type": "category", + "label": "REST API", + "collapsed": true, + "items": [ + "data-sources/restapi/configuration", + "data-sources/restapi/authentication", + "data-sources/restapi/querying-rest-api", + "data-sources/restapi/metadata-and-cookies" + ] + }, + "data-sources/soap-api", + "data-sources/rethinkdb", + "data-sources/run-js", + "data-sources/run-py", + "data-sources/saphana", + "data-sources/sendgrid", + "data-sources/slack", + "data-sources/smtp", + "data-sources/snowflake", + "data-sources/stripe", + "data-sources/twilio", + "data-sources/typesense", + "data-sources/woocommerce", + "data-sources/zendesk" + ] + }, + "tutorial/transformations", + "data-sources/local-data-sources-migration", + { + "type": "category", + "label": "Marketplace", + "collapsed": true, + "items": [ + "marketplace/marketplace-overview", + { + "type": "category", + "label": "Marketplace Plugins", + "items": [ + "marketplace/plugins/marketplace-plugin-awsredshift", + "marketplace/plugins/marketplace-plugin-textract", + "marketplace/plugins/marketplace-plugin-aws-lambda", + "marketplace/plugins/marketplace-plugin-engagespot", + "marketplace/plugins/marketplace-plugin-github", + "marketplace/plugins/marketplace-plugin-harperdb", + "marketplace/plugins/marketplace-plugin-openai", + "marketplace/plugins/marketplace-plugin-plivo", + "marketplace/plugins/marketplace-plugin-salesforce", + "marketplace/plugins/marketplace-plugin-supabase", + "marketplace/plugins/marketplace-plugin-pocketbase", + "marketplace/plugins/marketplace-plugin-portkey", + "marketplace/plugins/marketplace-plugin-Presto", + "marketplace/plugins/marketplace-plugin-jira", + "marketplace/plugins/marketplace-plugin-sharepoint", + "marketplace/plugins/marketplace-plugin-pinecone", + "marketplace/plugins/marketplace-plugin-gemini", + "marketplace/plugins/marketplace-plugin-anthropic", + "marketplace/plugins/marketplace-plugin-mistral_ai", + "marketplace/plugins/marketplace-plugin-hugging_face", + "marketplace/plugins/marketplace-plugin-cohere", + "marketplace/plugins/marketplace-plugin-weaviate", + "marketplace/plugins/marketplace-plugin-qdrant" + ] + } + ] + } + ] + }, + { + "type": "category", + "label": "ToolJet Database", + "className": "category-as-header tjdb-header", + "collapsed": false, + "collapsible": false, + "items": [ + "tooljet-db/tooljet-database", + "tooljet-db/database-editor", + { + "type": "category", + "label": "Column Constraints", + "items": [ + "tooljet-db/constraints/primary-key", + "tooljet-db/constraints/foreign-key" + ] + }, + "tooljet-db/data-types", + "tooljet-db/table-operations", + "tooljet-db/querying-tooljet-db" + ] + }, + { + "type": "category", + "label": "Workflows", + "className": "category-as-header workflows-header", + "collapsed": false, + "collapsible": false, + "items": [ + "workflows/overview", + "workflows/nodes", + "workflows/workflow-triggers", + "workflows/results", + "workflows/permissions", + { + "type": "category", + "label": "How-to", + "items": [ + "workflows/how-to/trigger-using-webhook", + "workflows/how-to/trigger-workflow-from-app" + ] + } + ] + }, + { + "type": "category", + "label": "Setup ToolJet", + "className": "category-as-header setup-tj-header", + "collapsible": false, + "collapsed": false, + "items": [ + "tj-setup/overview", + "tj-setup/tj-deployment", + { + "type": "category", + "label": "Licensing", + "items": [ + "tj-setup/licensing/self-hosted", + "tj-setup/licensing/cloud" + ] + }, + "tj-setup/instances", + "tj-setup/workspaces", + { + "type": "category", + "label": "Branding", + "items": [ + "tj-setup/org-branding/white-labeling", + "tj-setup/org-branding/custom-domain" + ] + }, + { + "type": "category", + "label": "Setup SMTP Server", + "link": { + "type": "doc", + "id": "tj-setup/smtp-setup/configuration" + }, + "items": [ + "tj-setup/smtp-setup/configuration", + "tj-setup/smtp-setup/email-providers" + ] + } + ] + }, + { + "type": "category", + "collapsed": false, + "collapsible": false, + "className": "category-as-header user-management-header", + "label": "User Management and Access Control", + "items": [ + "user-management/overview", + { + "type": "category", + "label": "Onboard and Offboard Users", + "items": [ + "user-management/onboard-users/overview", + "user-management/onboard-users/invite-user", + "user-management/onboard-users/bulk-invite-users", + "user-management/onboard-users/self-signup-user", + "user-management/onboard-users/user-metadata", + "user-management/onboard-users/archive-user" + ] + }, + { + "type": "category", + "label": "Authentication", + "items": [ + { + "type": "category", + "label": "Self-hosted", + "items": [ + "user-management/authentication/self-hosted/overview", + "user-management/authentication/self-hosted/instance-login", + "user-management/authentication/self-hosted/workspace-login" + ] + }, + "user-management/authentication/cloud-login" + ] + }, + { + "type": "category", + "label": "Role Based Access Control", + "items": [ + "user-management/role-based-access/super-admin", + "user-management/role-based-access/user-roles", + "user-management/role-based-access/custom-groups", + "user-management/role-based-access/access-control" + ] + }, + { + "type": "category", + "label": "Single Sign-On (SSO)", + "link": { + "type": "doc", + "id": "user-management/sso/overview" + }, + "items": [ + "user-management/sso/overview", + "user-management/sso/github", + "user-management/sso/google", + { + "type": "category", + "label": "OpenID Connect", + "link": { + "type": "doc", + "id": "user-management/sso/oidc/setup" + }, + "items": [ + "user-management/sso/oidc/setup", + "user-management/sso/oidc/azuread", + "user-management/sso/oidc/okta", + "user-management/sso/oidc/google" + ] + }, + "user-management/sso/ldap", + { + "type": "category", + "label": "SAML", + "link": { + "type": "doc", + "id": "user-management/sso/saml/setup" + }, + "items": [ + "user-management/sso/saml/setup", + "user-management/sso/saml/okta" + ] + } + ] + }, + { + "type": "category", + "label": "Group Sync", + "items": [ + "user-management/group-sync/oidc" + ] + }, + { + "type": "category", + "label": "Profile Management", + "items": [ + "user-management/profile-management/user-details", + "user-management/profile-management/reset-password", + "user-management/profile-management/user-profile" + ] + } + ] + }, + { + "type": "category", + "collapsed": false, + "collapsible": false, + "className": "category-as-header dev-cycle-header", + "label": "Development Lifecycle", + "items": [ + "development-lifecycle/overview", + { + "type": "category", + "label": "Release Management", + "items": [ + "development-lifecycle/release/version-control", + "development-lifecycle/release/release-rollback", + "development-lifecycle/release/share-app" + ] + }, + { + "type": "category", + "label": "GitSync", + "items": [ + "development-lifecycle/gitsync/overview", + "development-lifecycle/gitsync/gitsync-config", + "development-lifecycle/gitsync/ssh-config", + "development-lifecycle/gitsync/delete-gitsync", + "development-lifecycle/gitsync/push", + "development-lifecycle/gitsync/pull" + ] + }, + { + "type": "category", + "label": "Environment", + "items": [ + { + "type": "category", + "label": "Self-Hosted", + "items": [ + "development-lifecycle/environment/self-hosted/multi-environment", + "development-lifecycle/environment/self-hosted/example-configuration", + { + "type": "category", + "label": "Multi-Instance", + "items": [ + "development-lifecycle/environment/self-hosted/multi-instance/instance-as-environment", + "development-lifecycle/environment/self-hosted/multi-instance/example-configuration" + ] + } + ] + }, + { + "type": "category", + "label": "Cloud", + "items": [ + "development-lifecycle/environment/cloud/multi-environment", + "development-lifecycle/environment/cloud/example-configuration" + ] + } + ] + }, + { + "type": "category", + "label": "Backup", + "items": [ + "development-lifecycle/backup/gitsync-backup" + ] + } + ] + }, + { + "type": "category", + "label": "Security and Monitoring", + "collapsed": false, + "collapsible": false, + "className": "category-as-header security-header", + "items": [ + { + "type": "category", + "label": "Constants", + "items": [ + "security/constants/constants", + "security/constants/variables" + ] + }, + "security/audit-logs", + "security/compliance" + ] + }, + { + "type": "category", + "label": "ToolJet API", + "className": "category-as-header tj-api-header", + "collapsible": false, + "collapsed": true, + "items": [ + "tooljet-api" + ] + }, + { + "type": "category", + "label": "Resources", + "className": "category-as-header resources-header", + "collapsed": true, + "collapsible": false, + "items": [ + { + "type": "link", + "label": "Release Notes", + "href": "https://app.tooljet.ai/applications/release-notes" + }, + { + "type": "link", + "label": "Roadmap", + "href": "https://github.com/orgs/ToolJet/projects/15" + }, + "versions", + "tracking", + { + "type": "category", + "label": "Contributing Guide", + "collapsed": true, + "items": [ + "contributing-guide/setup/architecture", + { + "type": "category", + "label": "Setup", + "items": [ + "contributing-guide/setup/codespaces", + "contributing-guide/setup/macos", + "contributing-guide/setup/docker", + "contributing-guide/setup/ubuntu", + "contributing-guide/setup/windows", + "contributing-guide/setup/system-requirements-for-contributing" + ] + }, + { + "type": "category", + "label": "Marketplace", + "items": [ + "contributing-guide/marketplace/marketplace-setup", + "contributing-guide/marketplace/creating-a-plugin" + ] + }, + { + "type": "category", + "label": "Documentation", + "items": [ + "contributing-guide/documentation-guidelines/introduction", + "contributing-guide/documentation-guidelines/pr-checklist", + "contributing-guide/documentation-guidelines/style-guide" + ] + }, + "tooljet-cli", + "contributing-guide/testing", + "contributing-guide/l10n", + { + "type": "category", + "label": "Troubleshooting", + "items": [ + "contributing-guide/troubleshooting/eslint", + "contributing-guide/troubleshooting/runpy-limitations" + ] + }, + "contributing-guide/code-of-conduct", + "contributing-guide/slackcoc" + ] + } + ] + } + ] +} \ No newline at end of file diff --git a/docs/versions.json b/docs/versions.json index 7054084e48..4e996de967 100644 --- a/docs/versions.json +++ b/docs/versions.json @@ -1,4 +1,4 @@ [ - "2.50.0-LTS", - "1.x.x" + "3.0.0-LTS", + "2.50.0-LTS" ] diff --git a/frontend/.version b/frontend/.version index 7c69a55dbb..19811903a7 100644 --- a/frontend/.version +++ b/frontend/.version @@ -1 +1 @@ -3.7.0 +3.8.0 diff --git a/frontend/assets/images/Github.png b/frontend/assets/images/Github.png index c07781f526..37d367ca3a 100644 Binary files a/frontend/assets/images/Github.png and b/frontend/assets/images/Github.png differ diff --git a/frontend/assets/images/icons/widgets/divider.jsx b/frontend/assets/images/icons/widgets/divider.jsx index 893bdbc356..2444b30d61 100644 --- a/frontend/assets/images/icons/widgets/divider.jsx +++ b/frontend/assets/images/icons/widgets/divider.jsx @@ -2,20 +2,27 @@ import React from 'react'; const Divider = ({ fill = '#D7DBDF', width = 24, className = '', viewBox = '0 0 49 48' }) => ( - - + width={width} + height={width} + viewBox={viewBox} + fill="none" + xmlns="http://www.w3.org/2000/svg" + className={className} + style={{ transform: 'rotate(90deg)' }} +> + + ); diff --git a/frontend/assets/images/icons/widgets/index.jsx b/frontend/assets/images/icons/widgets/index.jsx index 7ecb678d1b..24705fdc6f 100644 --- a/frontend/assets/images/icons/widgets/index.jsx +++ b/frontend/assets/images/icons/widgets/index.jsx @@ -101,7 +101,7 @@ const WidgetIcon = (props) => { return ; case 'daterangepicker': return ; - case 'divider': + case 'horizontaldivider': return ; case 'divider-horizondal': return ; diff --git a/frontend/assets/images/logo.svg b/frontend/assets/images/logo.svg index d36ebd6423..123b5e596a 100644 --- a/frontend/assets/images/logo.svg +++ b/frontend/assets/images/logo.svg @@ -1,14 +1,5 @@ - - - - - - - - - - - - - + + + + diff --git a/frontend/assets/images/tj-logo.svg b/frontend/assets/images/tj-logo.svg new file mode 100644 index 0000000000..0d2de73215 --- /dev/null +++ b/frontend/assets/images/tj-logo.svg @@ -0,0 +1,4 @@ + + + + diff --git a/frontend/ce/white-label/whiteLabelling.js b/frontend/ce/white-label/whiteLabelling.js deleted file mode 100644 index 7d3283e242..0000000000 --- a/frontend/ce/white-label/whiteLabelling.js +++ /dev/null @@ -1,131 +0,0 @@ -import { decodeEntities } from '@/_helpers/utils'; - -export const defaultWhiteLabellingSettings = { - WHITE_LABEL_LOGO: 'assets/images/rocket.svg', - WHITE_LABEL_TEXT: 'ToolJet', - WHITE_LABEL_FAVICON: 'assets/images/logo.svg', -}; - -export const whiteLabellingOptions = { - WHITE_LABEL_LOGO: 'App Logo', - WHITE_LABEL_TEXT: 'Page Title', - WHITE_LABEL_FAVICON: 'Favicon', -}; - -export async function fetchWhiteLabelDetails() {} - -export async function checkWhiteLabelsDefaultState() { - return true; -} - -export async function resetToDefaultWhiteLabels() {} - -export function retrieveWhiteLabelText() { - return window.public_config?.WHITE_LABEL_TEXT || defaultWhiteLabellingSettings.WHITE_LABEL_TEXT; -} - -export function retrieveWhiteLabelLogo() { - return window.public_config?.WHITE_LABEL_LOGO || defaultWhiteLabellingSettings.WHITE_LABEL_LOGO; -} - -export function retrieveWhiteLabelFavicon() { - return window.public_config?.WHITE_LABEL_FAVICON || defaultWhiteLabellingSettings.WHITE_LABEL_FAVICON; -} - -export const pageTitles = { - INSTANCE_SETTINGS: 'Settings', - WORKSPACE_SETTINGS: 'Workspace settings', - INTEGRATIONS: 'Marketplace', - WORKFLOWS: 'Workflows', - DATABASE: 'Database', - DATA_SOURCES: 'Data sources', - AUDIT_LOGS: 'Audit logs', - ACCOUNT_SETTINGS: 'Profile settings', - SETTINGS: 'Profile settings', - EDITOR: 'Editor', - WORKFLOW_EDITOR: 'workflowEditor', - VIEWER: 'Viewer', - DASHBOARD: 'Dashboard', - WORKSPACE_CONSTANTS: 'Workspace constants', -}; - -// to set favicon and title from router for individual pages -export async function setFaviconAndTitle(whiteLabelFavicon, whiteLabelText, location) { - if (!whiteLabelFavicon || !whiteLabelText) { - whiteLabelFavicon = await retrieveWhiteLabelFavicon(); - whiteLabelText = await retrieveWhiteLabelText(); - } - // Set favicon - let links = document.querySelectorAll("link[rel='icon']"); - if (links.length === 0) { - const link = document.createElement('link'); - link.rel = 'icon'; - link.type = 'image/svg+xml'; - document.getElementsByTagName('head')[0].appendChild(link); - links = [link]; - } - links.forEach((link) => { - link.href = `${whiteLabelFavicon || defaultWhiteLabellingSettings.WHITE_LABEL_FAVICON}`; - }); - // Set title - const isEditorOrViewerGoingToRender = ['/apps/', '/applications/'].some((path) => location?.pathname.includes(path)); - if (isEditorOrViewerGoingToRender) { - return; - } - const pathToTitle = { - 'instance-settings': pageTitles.INSTANCE_SETTINGS, - 'workspace-settings': pageTitles.WORKSPACE_SETTINGS, - integrations: pageTitles.INTEGRATIONS, - workflows: pageTitles.WORKFLOWS, - 'data-sources': pageTitles.DATA_SOURCES, - 'audit-logs': pageTitles.AUDIT_LOGS, - 'account-settings': pageTitles.ACCOUNT_SETTINGS, - settings: pageTitles.INSTANCE_SETTINGS, - login: '', - signUp: '', - error: '', - signup: '', - 'organization-invitations': '', - invitation: '', - 'forgot-password': '', - 'reset-password': '', - 'workspace-constants': pageTitles.WORKSPACE_CONSTANTS, - setup: '', - }; - const pageTitleKey = Object.keys(pathToTitle).find((path) => location?.pathname.includes(path)); - const pageTitle = pathToTitle[pageTitleKey]; - - //For undefined routes - if (pageTitle === undefined) { - return; - } - - if (pageTitleKey && !isEditorOrViewerGoingToRender) { - document.title = pageTitle - ? `${decodeEntities(pageTitle)} | ${whiteLabelText || defaultWhiteLabellingSettings.WHITE_LABEL_TEXT}` - : `${decodeEntities(whiteLabelText) || defaultWhiteLabellingSettings.WHITE_LABEL_TEXT}`; - } -} - -export async function fetchAndSetWindowTitle(pageDetails) { - const whiteLabelText = retrieveWhiteLabelText(); - let pageTitleKey = pageDetails?.page || ''; - let pageTitle = ''; - switch (pageTitleKey) { - case pageTitles.VIEWER: { - const titlePrefix = pageDetails?.preview ? 'Preview - ' : ''; - pageTitle = `${titlePrefix}${pageDetails?.appName || 'My App'}`; - break; - } - case pageTitles.EDITOR: - case pageTitles.WORKFLOW_EDITOR: { - pageTitle = pageDetails?.appName || 'My App'; - break; - } - default: { - pageTitle = pageTitleKey; - break; - } - } - document.title = !(pageDetails?.preview === false) ? `${pageTitle} | ${whiteLabelText}` : `${pageTitle}`; -} diff --git a/frontend/ee b/frontend/ee index d93ee7e131..4b950ed3d0 160000 --- a/frontend/ee +++ b/frontend/ee @@ -1 +1 @@ -Subproject commit d93ee7e1318f044ef2327671b8b257648071453d +Subproject commit 4b950ed3d0ba15edddf217936e9c9ae1ca3cf11a diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 16e5c46737..a7b6357ad3 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -233,6 +233,7 @@ "@tooljet-plugins/mssql": "file:packages/mssql", "@tooljet-plugins/mysql": "file:packages/mysql", "@tooljet-plugins/n8n": "file:packages/n8n", + "@tooljet-plugins/nocodb": "file:packages/nocodb", "@tooljet-plugins/notion": "file:packages/notion", "@tooljet-plugins/openapi": "file:packages/openapi", "@tooljet-plugins/oracledb": "file:packages/oracledb", diff --git a/frontend/src/App/App.jsx b/frontend/src/App/App.jsx index 00fde7c9f2..0c06b4c513 100644 --- a/frontend/src/App/App.jsx +++ b/frontend/src/App/App.jsx @@ -4,7 +4,7 @@ import { BrowserRouter, Navigate, Route, Routes } from 'react-router-dom'; import { authorizeWorkspace, updateCurrentSession } from '@/_helpers/authorizeWorkspace'; import { authenticationService, tooljetService } from '@/_services'; import { withRouter } from '@/_hoc/withRouter'; -import { PrivateRoute, AdminRoute, AppsRoute, SwitchWorkspaceRoute, OrganizationInviteRoute } from '@/Routes'; +import { PrivateRoute, AdminRoute, AppsRoute, SwitchWorkspaceRoute } from '@/Routes'; import { HomePage } from '@/HomePage'; import { TooljetDatabase } from '@/TooljetDatabase'; import { Authorize } from '@/Oauth2'; @@ -17,7 +17,6 @@ import { MarketplacePlugins } from '@/MarketplacePage/MarketplacePlugins'; import SwitchWorkspacePage from '@/HomePage/SwitchWorkspacePage'; import { lt } from 'semver'; import Toast from '@/_ui/Toast'; -import { VerificationSuccessInfoScreen } from '@/SuccessInfoScreen'; import '@/_styles/theme.scss'; import AppLoader from '@/AppLoader'; export const BreadCrumbContext = React.createContext({}); @@ -51,6 +50,7 @@ const AppWrapper = (props) => { }), shallow ); + return ( @@ -93,7 +93,6 @@ class AppComponent extends React.Component { setFaviconAndTitle(); authorizeWorkspace(); this.fetchMetadata(); - setFaviconAndTitle(null, null, this.props.location); setInterval(this.fetchMetadata, 1000 * 60 * 60 * 1); } // check if its getting routed from editor @@ -196,14 +195,6 @@ class AppComponent extends React.Component { {auth(this.props)} } /> } /> - - - - } - /> {/* sticky element to position the preview box correctly on top without flowing out of container */}
    { useEffect(() => { if (selectedQuery) { - const selectedDS = [...dataSources, ...globalDataSources, ...(sampleDataSource?.length ? sampleDataSource : [])] + const selectedDS = [...dataSources, ...globalDataSources, !!sampleDataSource && sampleDataSource] .filter(Boolean) .find((datasource) => datasource.id === selectedQuery?.data_source_id); //TODO: currently type is not taken into account. May create issues in importing REST apis. to be revamped when import app is revamped diff --git a/frontend/src/AppBuilder/Viewer/PreviewSettings.jsx b/frontend/src/AppBuilder/Viewer/PreviewSettings.jsx index e17398afb2..633a6dcf0e 100644 --- a/frontend/src/AppBuilder/Viewer/PreviewSettings.jsx +++ b/frontend/src/AppBuilder/Viewer/PreviewSettings.jsx @@ -29,7 +29,9 @@ const PreviewSettings = ({ isMobileLayout, showHeader, darkMode }) => { const renderOverlay = () => (
    - Preview settings + + Preview settings + {editingVersion && ( <> @@ -59,10 +61,14 @@ const PreviewSettings = ({ isMobileLayout, showHeader, darkMode }) => { className="released-version-no-header-mbl-preview" style={{ backgroundColor: 'var(--slate5)', top: '7px', left: showHeader ? '61%' : '41%' }} > - + Preview - +
    @@ -108,11 +114,11 @@ const PreviewSettings = ({ isMobileLayout, showHeader, darkMode }) => { className="released-version-no-header-mbl-preview" style={{ backgroundColor: 'var(--slate5)', top: showHeader ? '' : '14px' }} > - + Preview - + diff --git a/frontend/src/AppBuilder/_hooks/useAppData.js b/frontend/src/AppBuilder/_hooks/useAppData.js index 1b664cfa21..8f1c350f99 100644 --- a/frontend/src/AppBuilder/_hooks/useAppData.js +++ b/frontend/src/AppBuilder/_hooks/useAppData.js @@ -20,7 +20,7 @@ import useRouter from '@/_hooks/use-router'; import { extractEnvironmentConstantsFromConstantsList, navigate } from '../_utils/misc'; import { getWorkspaceId } from '@/_helpers/utils'; import { shallow } from 'zustand/shallow'; -import { fetchAndSetWindowTitle, pageTitles, defaultWhiteLabellingSettings } from '@white-label/whiteLabelling'; +import { fetchAndSetWindowTitle, pageTitles, retrieveWhiteLabelText } from '@white-label/whiteLabelling'; import { initEditorWalkThrough } from '@/AppBuilder/_helpers/createWalkThrough'; import queryString from 'query-string'; import { distinctUntilChanged } from 'rxjs'; @@ -412,7 +412,7 @@ const useAppData = (appId, moduleId, darkMode, mode = 'edit', { environmentId, v if (showWalkthrough) initEditorWalkThrough(); checkAndSetTrueBuildSuggestionsFlag(); return () => { - document.title = defaultWhiteLabellingSettings.WHITE_LABEL_TEXT; + document.title = retrieveWhiteLabelText(); }; }); }, [setApp, setEditorLoading, currentSession]); diff --git a/frontend/src/AppBuilder/_stores/slices/whiteLabellingSlice.js b/frontend/src/AppBuilder/_stores/slices/whiteLabellingSlice.js new file mode 100644 index 0000000000..d1031fea65 --- /dev/null +++ b/frontend/src/AppBuilder/_stores/slices/whiteLabellingSlice.js @@ -0,0 +1,19 @@ +//this slice is only for the app builder +const initialState = { + activeOrganizationId: null, + whiteLabelText: 'ToolJet', + whiteLabelLogo: null, + whiteLabelFavicon: null, + loadingWhiteLabelDetails: true, + isWhiteLabelDetailsFetched: false, +}; + +export const createWhiteLabellingSlice = (set) => ({ + ...initialState, + resetWhiteLabellingState: () => { + set(initialState); + }, + updateWhiteLabelDetails: (details) => { + set(details); + }, +}); diff --git a/frontend/src/AppBuilder/_stores/store.js b/frontend/src/AppBuilder/_stores/store.js index 84bfa60084..4d1392fc7c 100644 --- a/frontend/src/AppBuilder/_stores/store.js +++ b/frontend/src/AppBuilder/_stores/store.js @@ -27,6 +27,7 @@ import { createCodeHinterSlice } from './slices/codeHinterSlice'; import { createDebuggerSlice } from './slices/debuggerSlice'; import { createGitSyncSlice } from './slices/gitSyncSlice'; import { createAiSlice } from './slices/aiSlice'; +import { createWhiteLabellingSlice } from './slices/whiteLabellingSlice'; export default create( zustandDevTools( @@ -58,6 +59,7 @@ export default create( ...createDebuggerSlice(...state), ...createGitSyncSlice(...state), ...createAiSlice(...state), + ...createWhiteLabellingSlice(...state), })), { name: 'App Builder Store', anonymousActionType: 'unknown' } ) diff --git a/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx b/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx index 6c161b7027..0b8df4872b 100644 --- a/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx +++ b/frontend/src/ConfirmationPage/OrganizationInvitationPage.jsx @@ -21,7 +21,7 @@ class OrganizationInvitationPageComponent extends React.Component { this.state = { isLoading: false, - defaultState: false, + defaultState: checkWhiteLabelsDefaultState(), }; this.formRef = React.createRef(null); this.organizationId = new URLSearchParams(props?.location?.search).get('oid'); @@ -33,14 +33,8 @@ class OrganizationInvitationPageComponent extends React.Component { componentDidMount() { authenticationService.deleteLoginOrganizationId(); - setFaviconAndTitle(this.whiteLabelText, this.whiteLabelFavicon, this.props?.location); - checkWhiteLabelsDefaultState(this.organizationId).then((res) => { - this.setState({ defaultState: res }); - this.whiteLabelText = retrieveWhiteLabelText(); - this.whiteLabelFavicon = retrieveWhiteLabelFavicon(); - }); + setFaviconAndTitle(this.props?.location); document.addEventListener('keydown', this.handleEnterKey); - this.setState({ defaultState: checkWhiteLabelsDefaultState() }); } handleEnterKey = (e) => { diff --git a/frontend/src/Editor/AppVersionsManager/EditVersionModal.jsx b/frontend/src/Editor/AppVersionsManager/EditVersionModal.jsx index a15184ff4e..e2ded2f008 100644 --- a/frontend/src/Editor/AppVersionsManager/EditVersionModal.jsx +++ b/frontend/src/Editor/AppVersionsManager/EditVersionModal.jsx @@ -1,9 +1,9 @@ -import React, { useState } from 'react'; +import { useEnvironmentsAndVersionsStore } from '@/_stores/environmentsAndVersionsStore'; import AlertDialog from '@/_ui/AlertDialog'; +import React, { useState } from 'react'; import { toast } from 'react-hot-toast'; import { useTranslation } from 'react-i18next'; import { shallow } from 'zustand/shallow'; -import { useEnvironmentsAndVersionsStore } from '@/_stores/environmentsAndVersionsStore'; export const EditVersion = ({ appId, setShowEditAppVersion, showEditAppVersion }) => { const [isEditingVersion, setIsEditingVersion] = useState(false); @@ -88,6 +88,7 @@ export const EditVersion = ({ appId, setShowEditAppVersion, showEditAppVersion } {t('globals.cancel', 'Cancel')}
    + + {getLayout(uiProperties[selector])} +
    + ); + }); + + const normalComponents = Object.keys(uiProperties).map((key) => { + const component = uiProperties[key]; + + if (component.type && component.type !== 'dropdown-component-flip') { + return
    {getLayout({ [key]: component })}
    ; + } + return null; + }); + + return ( + <> + {normalComponents} + {dropdownComponents} + + ); + }; + + const isFlipComponentDropdown = (uiProperties) => { + const checkFlipComponents = filter(uiProperties, ['widget', 'dropdown-component-flip']); + if (checkFlipComponents.length > 0) { + return FlipComponentDropdown(uiProperties); + } else { + return null; + } + }; + + const flipComponentDropdown = isFlipComponentDropdown(uiProperties); + if (flipComponentDropdown) return flipComponentDropdown; + return getLayout(uiProperties); +}; + +export default DynamicFormV2; diff --git a/frontend/src/_components/EncyrptedFieldWrapper.jsx b/frontend/src/_components/EncyrptedFieldWrapper.jsx index 72ab8cf5bc..4530183c33 100644 --- a/frontend/src/_components/EncyrptedFieldWrapper.jsx +++ b/frontend/src/_components/EncyrptedFieldWrapper.jsx @@ -29,7 +29,7 @@ export default function EncryptedFieldWrapper({ return ( <>
    - +
    handleEncryptedFieldsToggle(name)} + data-cy={`button-${(disabled ? 'Edit' : 'Cancel').toLowerCase().replace(/\s+/g, '-')}`} > {disabled ? 'Edit' : 'Cancel'} diff --git a/frontend/src/_components/PluginsListForAppModal.jsx b/frontend/src/_components/PluginsListForAppModal.jsx index 56d7e19504..074e3b9025 100644 --- a/frontend/src/_components/PluginsListForAppModal.jsx +++ b/frontend/src/_components/PluginsListForAppModal.jsx @@ -2,7 +2,7 @@ import React, { useState } from 'react'; import SolidIcon from '@/_ui/Icon/SolidIcons'; import config from 'config'; -export const PluginsListForAppModal = ({ dependentPluginsForTemplate, dependentPluginsDetail }) => { +export const PluginsListForAppModal = ({ dependentPlugins, dependentPluginsDetail }) => { const [isExpanded, setIsExpanded] = useState(false); const toggleExpanded = () => { @@ -29,7 +29,7 @@ export const PluginsListForAppModal = ({ dependentPluginsForTemplate, dependentP )} - {isExpanded && dependentPluginsForTemplate && dependentPluginsForTemplate.length > 0 && ( + {isExpanded && dependentPlugins && dependentPlugins.length > 0 && (
    - {dependentPluginsForTemplate.map((plugin, index) => { + {dependentPlugins.map((plugin, index) => { const pluginsName = dependentPluginsDetail[plugin].name || plugin; const iconSrc = `${config.TOOLJET_MARKETPLACE_URL}/marketplace-assets/${plugin}/lib/icon.svg`; return ( diff --git a/frontend/src/_helpers/authorizeWorkspace.js b/frontend/src/_helpers/authorizeWorkspace.js index a03d7b986d..ae9b657d68 100644 --- a/frontend/src/_helpers/authorizeWorkspace.js +++ b/frontend/src/_helpers/authorizeWorkspace.js @@ -10,7 +10,7 @@ import { import { ERROR_TYPES } from './constants'; import useStore from '@/AppBuilder/_stores/store'; import { safelyParseJSON } from './utils'; - +import { fetchWhiteLabelDetails } from '@/_helpers/white-label/whiteLabelling'; /* [* Be cautious: READ THE CASES BEFORE TOUCHING THE CODE. OTHERWISE YOU MAY SEE ENDLESS REDIRECTIONS (AKA ROUTES-BURMUDA-TRIANGLE) *] What is this function? - This function is used to authorize the workspace that the user is currently trying to open (for multi-workspace functionality across multiple tabs). @@ -23,105 +23,110 @@ import { safelyParseJSON } from './utils'; */ export const authorizeWorkspace = () => { - if (!isThisExistedRoute()) { - updateCurrentSession({ - triggeredOnce: true, - }); - const workspaceIdOrSlug = getWorkspaceIdOrSlugFromURL(); - const isApplicationsPath = getPathname(null, true).startsWith('/applications/'); - const appId = isApplicationsPath ? getPathname().split('/')[2] : null; - /* CASE-1 */ - sessionService - .validateSession(appId, workspaceIdOrSlug) - .then( - ({ - current_organization_id, - current_organization_slug, - no_workspace_attached_in_the_session: noWorkspaceAttachedInTheSession, - is_all_workspaces_archived: isAllWorkspacesArchived, - is_onboarding_completed: isOnboardingCompleted, - is_first_user_onboarding_completed: isFirstUserOnboardingCompleted, - consulation_banner_date, - }) => { - if (!isFirstUserOnboardingCompleted) { - const subpath = getSubpath(); - const path = subpath ? `${subpath}/setup` : '/setup'; - window.location.href = path; - } else if (!isOnboardingCompleted) { - // const subpath = getSubpath(); - // const path = subpath ? `${subpath}/confirm` : '/confirm'; - // window.location.href - } + /* Default APIs */ + const workspaceIdOrSlug = getWorkspaceIdOrSlugFromURL(); + fetchWhiteLabelDetails(workspaceIdOrSlug).finally(() => { + if (!isThisExistedRoute()) { + updateCurrentSession({ + triggeredOnce: true, + }); + const isApplicationsPath = getPathname(null, true).startsWith('/applications/'); + const appId = isApplicationsPath ? getPathname().split('/')[2] : null; + /* CASE-1 */ + sessionService + .validateSession(appId, workspaceIdOrSlug) + .then( + ({ + current_organization_id, + current_organization_slug, + no_workspace_attached_in_the_session: noWorkspaceAttachedInTheSession, + is_all_workspaces_archived: isAllWorkspacesArchived, + is_onboarding_completed: isOnboardingCompleted, + is_first_user_onboarding_completed: isFirstUserOnboardingCompleted, + consulation_banner_date, + }) => { + if (!isFirstUserOnboardingCompleted) { + const subpath = getSubpath(); + const path = subpath ? `${subpath}/setup` : '/setup'; + window.location.href = path; + } else if (!isOnboardingCompleted) { + // const subpath = getSubpath(); + // const path = subpath ? `${subpath}/confirm` : '/confirm'; + // window.location.href + } - if (window.location.pathname !== `${getSubpath() ?? ''}/switch-workspace`) { - if (isAllWorkspacesArchived) { - /* All workspaces are archived by the super admin. lets logout the user */ - sessionService.logout(); + if (window.location.pathname !== `${getSubpath() ?? ''}/switch-workspace`) { + if (isAllWorkspacesArchived) { + /* All workspaces are archived by the super admin. lets logout the user */ + sessionService.logout(); + } else { + updateCurrentSession({ + noWorkspaceAttachedInTheSession, + authentication_status: true, + consulation_banner_date, + }); + if (noWorkspaceAttachedInTheSession) { + /* + User just signed up after the invite flow and doesn't have any active workspace. + - From useSessionManagement hook we will be redirecting the user to an error page. + */ + return; + } + /*CASE-2*/ + authorizeUserAndHandleErrors(current_organization_id, current_organization_slug); + } } else { updateCurrentSession({ - noWorkspaceAttachedInTheSession, - authentication_status: true, - consulation_banner_date, + current_organization_id, }); - if (noWorkspaceAttachedInTheSession) { - /* - User just signed up after the invite flow and doesn't have any active workspace. - - From useSessionManagement hook we will be redirecting the user to an error page. - */ - return; - } - /*CASE-2*/ - authorizeUserAndHandleErrors(current_organization_id, current_organization_slug); } - } else { + } + ) + .catch((error) => { + const isDesiredStatusCode = + (error && error?.data?.statusCode == 422) || + error?.data?.statusCode == 404 || + error?.data?.statusCode == 400; + if (isDesiredStatusCode) { + const isWorkspaceArchived = + error?.data?.statusCode == 400 && error?.data?.message == ERROR_TYPES.WORKSPACE_ARCHIVED; + if (isWorkspaceArchived) { + const subpath = getSubpath(); + let path = subpath ? `${subpath}/switch-workspace` : `/switch-workspace`; + if (appId) { + path = 'app-url-archived'; + } else { + path += '-archived'; + } + window.location = path; + } else if (appId) { + /* If the user is trying to load the app viewer and the app id / slug not found */ + redirectToErrorPage(ERROR_TYPES.INVALID); + } else if (error?.data?.statusCode == 422) { + if (isThisWorkspaceLoginPage()) { + return redirectToErrorPage(ERROR_TYPES.INVALID); + } + redirectToErrorPage(ERROR_TYPES.UNKNOWN); + } else { + const subpath = getSubpath(); + window.location = subpath ? `${subpath}${'/switch-workspace'}` : '/switch-workspace'; + } + } + if (!isApplicationsPath) { + /* CASE-3 */ updateCurrentSession({ - current_organization_id, + authentication_status: false, + }); + } else if (isApplicationsPath) { + /* CASE-4 */ + updateCurrentSession({ + authentication_failed: true, + load_app: true, }); } - } - ) - .catch((error) => { - const isDesiredStatusCode = - (error && error?.data?.statusCode == 422) || error?.data?.statusCode == 404 || error?.data?.statusCode == 400; - if (isDesiredStatusCode) { - const isWorkspaceArchived = - error?.data?.statusCode == 400 && error?.data?.message == ERROR_TYPES.WORKSPACE_ARCHIVED; - if (isWorkspaceArchived) { - const subpath = getSubpath(); - let path = subpath ? `${subpath}/switch-workspace` : `/switch-workspace`; - if (appId) { - path = 'app-url-archived'; - } else { - path += '-archived'; - } - window.location = path; - } else if (appId) { - /* If the user is trying to load the app viewer and the app id / slug not found */ - redirectToErrorPage(ERROR_TYPES.INVALID); - } else if (error?.data?.statusCode == 422) { - if (isThisWorkspaceLoginPage()) { - return redirectToErrorPage(ERROR_TYPES.INVALID); - } - redirectToErrorPage(ERROR_TYPES.UNKNOWN); - } else { - const subpath = getSubpath(); - window.location = subpath ? `${subpath}${'/switch-workspace'}` : '/switch-workspace'; - } - } - if (!isApplicationsPath) { - /* CASE-3 */ - updateCurrentSession({ - authentication_status: false, - }); - } else if (isApplicationsPath) { - /* CASE-4 */ - updateCurrentSession({ - authentication_failed: true, - load_app: true, - }); - } - }); - } + }); + } + }); }; const isThisExistedRoute = () => { diff --git a/frontend/src/_helpers/dataSourceSchemaManager.js b/frontend/src/_helpers/dataSourceSchemaManager.js new file mode 100644 index 0000000000..abf2f3c9bb --- /dev/null +++ b/frontend/src/_helpers/dataSourceSchemaManager.js @@ -0,0 +1,119 @@ +import Ajv2020 from 'ajv'; + +const ajvOptions = { + strict: false, + allErrors: true, + removeAdditional: false, + // We disable meta-schema validation to avoid the schema being validated + // against the official 2020-12 standard in ways that conflict with custom keywords. + validateSchema: false, + coerceTypes: true, + errorDataPath: 'property', +}; + +export default class DataSourceSchemaManager { + constructor(schema) { + this.schema = schema; + this.ajv = new Ajv2020(ajvOptions); + this.validate = this.ajv.compile(this.schema); + } + + validateData(options) { + const data = this._convertDataSourceOptionsToData(options); + const valid = this.validate(data); + if (!valid) { + return { valid: false, errors: this.validate.errors }; + } + return { valid: true, errors: [] }; + } + + getDefaults(options = {}) { + const dataWithDefaults = { ...this._convertDataSourceOptionsToData(options) }; + + // AJV does not support defaults with conditional schemas + // https://ajv.js.org/guide/modifying-data.html#assigning-defaults + // Create a schema without conditional properties for default value assignment + const schemaWithoutConditionals = { + type: this.schema.type, + properties: { ...this.schema.properties }, + }; + + // Compile the schema without conditionals to fill in default values + const ajvForDefaults = new Ajv2020({ + ...ajvOptions, + useDefaults: true, + }); + const applyDefaults = ajvForDefaults.compile(schemaWithoutConditionals); + applyDefaults(dataWithDefaults); + + const encryptedProperties = this.getEncryptedProperties(); + + // Combine the data with defaults and set encrypted fields to null + const combinedData = { + ...dataWithDefaults, + ...Object.fromEntries(encryptedProperties.map((key) => [key, null])), + }; + + return Object.entries(combinedData).reduce((result, [key, value]) => { + result[key] = { + value: value, + encrypted: encryptedProperties.includes(key), + }; + return result; + }, {}); + } + + getEncryptedProperties() { + return this.schema['tj:encrypted'] || []; + } + + getSourceMetadata() { + const { name, kind, type } = this.schema['tj:source']; + + if (!name || !kind || !type) { + throw new Error('Schema is missing required source metadata'); + } + + return { + name, + kind, + type, + options: this._getOptionsMetadata(), + // Can remove exposed variables? + exposedVariables: { + isLoading: false, + data: {}, + rawData: {}, + }, + }; + } + + _convertDataSourceOptionsToData(options) { + return Object.entries(options).reduce((result, [key, { value }]) => { + // Skip empty string values + if (value !== '' && value !== null && value !== undefined) { + result[key] = value; + } + + // Add a dummy value to pass validation for encrypted keys + if (this.getEncryptedProperties().includes(key)) { + result[key] = 'REDACTED'; + } + return result; + }, {}); + } + + _getOptionsMetadata() { + const options = {}; + const properties = this.schema.properties || {}; + + for (const [key, value] of Object.entries(properties)) { + options[key] = { type: value.type }; + if (value.encrypted) { + options[key].encrypted = true; + } + } + + return options; + } +} diff --git a/frontend/src/_helpers/routes.js b/frontend/src/_helpers/routes.js index c355b0d350..9e60d522fa 100644 --- a/frontend/src/_helpers/routes.js +++ b/frontend/src/_helpers/routes.js @@ -103,7 +103,7 @@ export const appendWorkspaceId = (slug, path, replaceId = false) => { path = getPathname(path); let newPath = path; - if (path === '/:workspaceId' || path.split('/').length === 2 || path.includes('instance-settings')) { + if (path === '/:workspaceId' || path.split('/').length === 2 || path.includes('settings')) { newPath = `/${slug}`; } else { const paths = path.split('/').filter((path) => path !== ''); diff --git a/frontend/src/_helpers/utils.js b/frontend/src/_helpers/utils.js index 07f0b6dccb..834667942e 100644 --- a/frontend/src/_helpers/utils.js +++ b/frontend/src/_helpers/utils.js @@ -12,7 +12,6 @@ import { useAppDataStore } from '@/_stores/appDataStore'; import { getCurrentState, useCurrentStateStore } from '@/_stores/currentStateStore'; import { getWorkspaceIdOrSlugFromURL, getSubpath, returnWorkspaceIdIfNeed, eraseRedirectUrl } from './routes'; import { staticDataSources } from '@/Editor/QueryManager/constants'; -import { defaultWhiteLabellingSettings } from '@/_stores/utils'; import { getDateTimeFormat } from '@/Editor/Components/Table/Datepicker'; import { useKeyboardShortcutStore } from '@/_stores/keyboardShortcutStore'; import { validateMultilineCode } from './utility'; @@ -72,17 +71,6 @@ export function findProp(obj, prop, defval) { return obj; } -export function checkWhiteLabelsDefaultState() { - const text = window.public_config?.WHITE_LABEL_TEXT; - const logo = window.public_config?.WHITE_LABEL_LOGO; - const favicon = window.public_config?.WHITE_LABEL_FAVICON; - return ( - (!text || text === defaultWhiteLabellingSettings.WHITE_LABEL_TEXT) && - (!logo || logo === defaultWhiteLabellingSettings.WHITE_LABEL_LOGO) && - (!favicon || favicon === defaultWhiteLabellingSettings.WHITE_LABEL_FAVICON) - ); -} - export function stripTrailingSlash(str) { return str.replace(/[/]+$/, ''); } diff --git a/frontend/src/_helpers/white-label/whiteLabelling.js b/frontend/src/_helpers/white-label/whiteLabelling.js index 5f110a9072..cfbbcbfc0c 100644 --- a/frontend/src/_helpers/white-label/whiteLabelling.js +++ b/frontend/src/_helpers/white-label/whiteLabelling.js @@ -1,59 +1,163 @@ -import { getEditionSpecificHelper } from '@/modules/common/helpers/getEditionSpecificHelper'; +import { useWhiteLabellingStore } from '@/_stores/whiteLabellingStore'; +import { decodeEntities } from '@/_helpers/utils'; -let whiteLabellingHelper = null; +// White-label options mapping +export const whiteLabellingOptions = { + WHITE_LABEL_TEXT: 'white_label_text', + WHITE_LABEL_LOGO: 'white_label_logo', + WHITE_LABEL_FAVICON: 'white_label_favicon', +}; -// Create async getters for each function -export const getWhiteLabellingHelper = async () => { - if (!whiteLabellingHelper) { - whiteLabellingHelper = await getEditionSpecificHelper('whiteLabelling'); +export function retrieveWhiteLabelFavicon() { + const { whiteLabelFavicon } = useWhiteLabellingStore.getState(); + return whiteLabelFavicon; +} + +export function retrieveWhiteLabelText() { + const { whiteLabelText } = useWhiteLabellingStore.getState(); + return whiteLabelText; +} + +export function retrieveWhiteLabelLogo() { + const { whiteLabelLogo } = useWhiteLabellingStore.getState(); + return whiteLabelLogo; +} + +// Set favicon and title dynamically +export async function setFaviconAndTitle(location) { + // TODO:Uncomment-if-needed + // await fetchWhiteLabelDetails(organizationId); + const { whiteLabelFavicon, whiteLabelText } = useWhiteLabellingStore.getState(); + + // Set favicon + let links = document.querySelectorAll("link[rel='icon']"); + if (links.length === 0) { + const link = document.createElement('link'); + link.rel = 'icon'; + link.type = 'image/svg+xml'; + document.getElementsByTagName('head')[0].appendChild(link); + links = [link]; } - return whiteLabellingHelper; + links.forEach((link) => { + link.href = whiteLabelFavicon; + }); + + // Set page title based on route + const isEditorOrViewer = ['/apps/', '/applications/'].some((path) => location?.pathname.includes(path)); + if (isEditorOrViewer) return; + + const pageTitles = { + 'instance-settings': 'Settings', + 'workspace-settings': 'Workspace settings', + integrations: 'Marketplace', + workflows: 'Workflows', + 'data-sources': 'Data sources', + 'audit-logs': 'Audit logs', + 'account-settings': 'Profile settings', + settings: 'Profile settings', + login: '', + signUp: '', + error: '', + signup: '', + 'organization-invitations': '', + invitation: '', + 'forgot-password': '', + 'reset-password': '', + 'workspace-constants': 'Workspace constants', + setup: '', + }; + + const pageTitleKey = Object.keys(pageTitles).find((path) => location?.pathname.includes(path)); + const pageTitle = pageTitles[pageTitleKey] || ''; + + document.title = pageTitle ? `${decodeEntities(pageTitle)} | ${whiteLabelText}` : `${decodeEntities(whiteLabelText)}`; +} + +export async function fetchAndSetWindowTitle(pageDetails) { + const whiteLabelText = retrieveWhiteLabelText(); + let pageTitleKey = pageDetails?.page || ''; + let pageTitle = ''; + switch (pageTitleKey) { + case pageTitles.VIEWER: { + const titlePrefix = pageDetails?.preview ? 'Preview - ' : ''; + pageTitle = `${titlePrefix}${pageDetails?.appName || 'My App'}`; + break; + } + case pageTitles.EDITOR: + case pageTitles.WORKFLOW_EDITOR: { + pageTitle = pageDetails?.appName || 'My App'; + break; + } + default: { + pageTitle = pageTitleKey; + break; + } + } + document.title = !(pageDetails?.preview === false) ? `${pageTitle} | ${whiteLabelText}` : `${pageTitle}`; +} + +// Fetch and update white label settings +export async function fetchWhiteLabelDetails(organizationId = null) { + const { isWhiteLabelDetailsFetched, actions, activeOrganizationId } = useWhiteLabellingStore.getState(); + // Check if data should be fetched + const shouldFetch = + !isWhiteLabelDetailsFetched || !activeOrganizationId || (organizationId && activeOrganizationId !== organizationId); + + if (shouldFetch) { + try { + await actions.fetchWhiteLabelDetails(organizationId); + applyWhiteLabelling(); + } catch (error) { + console.error('Error fetching white label settings:', error); + } + } +} + +// Reset white label settings to default +export async function resetToDefaultWhiteLabels() { + const { actions } = useWhiteLabellingStore.getState(); + actions.resetWhiteLabellingStoreBackToInitialState(); + applyWhiteLabelling(); +} + +// Check if current settings match the default values +export function checkWhiteLabelsDefaultState() { + const { isDefaultWhiteLabel } = useWhiteLabellingStore.getState(); + return isDefaultWhiteLabel; +} + +export const pageTitles = { + INSTANCE_SETTINGS: 'Settings', + WORKSPACE_SETTINGS: 'Workspace settings', + INTEGRATIONS: 'Marketplace', + WORKFLOWS: 'Workflows', + DATABASE: 'Database', + DATA_SOURCES: 'Data sources', + AUDIT_LOGS: 'Audit logs', + ACCOUNT_SETTINGS: 'Profile settings', + SETTINGS: 'Profile settings', + EDITOR: 'Editor', + WORKFLOW_EDITOR: 'workflowEditor', + VIEWER: 'Viewer', + DASHBOARD: 'Dashboard', + WORKSPACE_CONSTANTS: 'Workspace constants', }; -export const retrieveWhiteLabelFavicon = async () => { - const helper = await getWhiteLabellingHelper(); - return helper.retrieveWhiteLabelFavicon(); -}; +// Apply the white label settings from the store +function applyWhiteLabelling() { + const { whiteLabelText, whiteLabelFavicon } = useWhiteLabellingStore.getState(); -export const retrieveWhiteLabelText = async () => { - const helper = await getWhiteLabellingHelper(); - return helper.retrieveWhiteLabelText(); -}; + document.title = whiteLabelText; -export const retrieveWhiteLabelLogo = async () => { - const helper = await getWhiteLabellingHelper(); - return helper.retrieveWhiteLabelLogo(); -}; - -// Add other functions as needed following the same pattern -export const setFaviconAndTitle = async (...args) => { - const helper = await getWhiteLabellingHelper(); - return helper.setFaviconAndTitle(...args); -}; - -export const fetchAndSetWindowTitle = async (...args) => { - const helper = await getWhiteLabellingHelper(); - return helper.fetchAndSetWindowTitle(...args); -}; - -export const fetchWhiteLabelDetails = async () => { - const helper = await getWhiteLabellingHelper(); - return helper.fetchWhiteLabelDetails(); -}; - -export const resetToDefaultWhiteLabels = async () => { - const helper = await getWhiteLabellingHelper(); - return helper.resetToDefaultWhiteLabels(); -}; - -export const checkWhiteLabelsDefaultState = async () => { - const helper = await getWhiteLabellingHelper(); - return helper.checkWhiteLabelsDefaultState(); -}; - -// For constants, you might want to export them directly from the common helper -export { - defaultWhiteLabellingSettings, - whiteLabellingOptions, - pageTitles, -} from '@/modules/common/helpers/whiteLabelling'; + let links = document.querySelectorAll("link[rel='icon']"); + if (links.length === 0) { + const link = document.createElement('link'); + link.rel = 'icon'; + link.type = 'image/svg+xml'; + document.getElementsByTagName('head')[0].appendChild(link); + links = [link]; + } + links.forEach((link) => { + link.href = whiteLabelFavicon; + }); +} diff --git a/frontend/src/_hoc/withRouter.jsx b/frontend/src/_hoc/withRouter.jsx index d323a7a5ef..20cb2d1cda 100644 --- a/frontend/src/_hoc/withRouter.jsx +++ b/frontend/src/_hoc/withRouter.jsx @@ -10,7 +10,7 @@ export const withRouter = (WrappedComponent) => (props) => { const whiteLabelText = retrieveWhiteLabelText(); useEffect(() => { - setFaviconAndTitle(whiteLabelFavicon, whiteLabelText, location); + setFaviconAndTitle(location); }, [whiteLabelFavicon, whiteLabelText, location]); return ; diff --git a/frontend/src/_hooks/useSessionManagement.js b/frontend/src/_hooks/useSessionManagement.js index 0b95cde4a2..71fce2c91b 100644 --- a/frontend/src/_hooks/useSessionManagement.js +++ b/frontend/src/_hooks/useSessionManagement.js @@ -44,7 +44,7 @@ export const useSessionManagement = (initialState = defaultState) => { }, []); useEffect(() => { - setFaviconAndTitle(whiteLabelFavicon, whiteLabelText, location); + setFaviconAndTitle(location); // eslint-disable-next-line react-hooks/exhaustive-deps }, [pathname]); diff --git a/frontend/src/_services/datasource.service.js b/frontend/src/_services/datasource.service.js index 9f192e5c4a..ef1a878db7 100644 --- a/frontend/src/_services/datasource.service.js +++ b/frontend/src/_services/datasource.service.js @@ -63,7 +63,7 @@ function test(body) { function testSampleDb(body) { const requestOptions = { method: 'POST', headers: authHeader(), credentials: 'include', body: JSON.stringify(body) }; - return fetch(`${config.apiUrl}/data-sources/test-connection/sample-db`, requestOptions).then(handleResponse); + return fetch(`${config.apiUrl}/data-sources/sample-db/test-connection`, requestOptions).then(handleResponse); } function setOauth2Token(dataSourceId, body, current_organization_id) { diff --git a/frontend/src/_services/library-app.service.js b/frontend/src/_services/library-app.service.js index ed8b464c71..815fa560c0 100644 --- a/frontend/src/_services/library-app.service.js +++ b/frontend/src/_services/library-app.service.js @@ -8,11 +8,11 @@ export const libraryAppService = { findDependentPluginsInTemplate, }; -function deploy(identifier, appName, dependentPluginsForTemplate = [], shouldAutoImportPlugin = false) { +function deploy(identifier, appName, dependentPlugins = [], shouldAutoImportPlugin = false) { const body = { identifier, appName, - dependentPluginsForTemplate, + dependentPlugins, shouldAutoImportPlugin, }; diff --git a/frontend/src/_services/plugins.service.js b/frontend/src/_services/plugins.service.js index 14437b1c97..e66cdd759c 100644 --- a/frontend/src/_services/plugins.service.js +++ b/frontend/src/_services/plugins.service.js @@ -1,4 +1,6 @@ import HttpClient from '@/_helpers/http-client'; +import config from 'config'; +import { authHeader, handleResponse } from '@/_helpers'; const adapter = new HttpClient(); @@ -22,10 +24,47 @@ function reloadPlugin(id) { return adapter.post(`/plugins/${id}/reload`); } +function findDependentPlugins(dataSources) { + return adapter.post(`/plugins/findDependentPlugins`, dataSources); +} + +function installDependentPlugins(dependentPlugins, shouldAutoImportPlugin) { + const body = { + dependentPlugins, + shouldAutoImportPlugin, + }; + + const requestOptions = { + method: 'POST', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify(body), + }; + return fetch(`${config.apiUrl}/plugins/installDependentPlugins`, requestOptions).then(handleResponse); +} + +function uninstallPlugins(pluginsId) { + const body = { + pluginsId: pluginsId, + }; + + const requestOptions = { + method: 'POST', + headers: authHeader(), + credentials: 'include', + body: JSON.stringify(body), + }; + + return fetch(`${config.apiUrl}/plugins/uninstallPlugins`, requestOptions).then(handleResponse); +} + export const pluginsService = { findAll, installPlugin, updatePlugin, deletePlugin, reloadPlugin, + findDependentPlugins, + installDependentPlugins, + uninstallPlugins, }; diff --git a/frontend/src/_services/white-labelling.service.js b/frontend/src/_services/white-labelling.service.js index acae6b572c..8a4e52e75e 100644 --- a/frontend/src/_services/white-labelling.service.js +++ b/frontend/src/_services/white-labelling.service.js @@ -6,9 +6,11 @@ export const whiteLabellingService = { update, }; -function get() { +function get(organizationId = null) { const requestOptions = { method: 'GET', headers: authHeader(), credentials: 'include' }; - return fetch(`${config.apiUrl}/white-labelling`, requestOptions).then(handleResponseWithoutValidation); + return fetch(`${config.apiUrl}/white-labelling?organizationId=${organizationId}`, requestOptions).then( + handleResponseWithoutValidation + ); } function update(settings) { diff --git a/frontend/src/_stores/utils.js b/frontend/src/_stores/utils.js index c36f5c5f78..e84db7275c 100644 --- a/frontend/src/_stores/utils.js +++ b/frontend/src/_stores/utils.js @@ -13,12 +13,6 @@ export const zustandDevTools = (fn, options = {}) => const resetters = []; -export const defaultWhiteLabellingSettings = { - WHITE_LABEL_LOGO: 'https://app.tooljet.com/logo.svg', - WHITE_LABEL_TEXT: 'ToolJet', - WHITE_LABEL_FAVICON: 'assets/images/logo.svg', -}; - export const create = (fn) => { if (fn === undefined) return create; const store = _create(fn); diff --git a/frontend/src/_stores/whiteLabellingStore.js b/frontend/src/_stores/whiteLabellingStore.js index 3390a53382..f345b47729 100644 --- a/frontend/src/_stores/whiteLabellingStore.js +++ b/frontend/src/_stores/whiteLabellingStore.js @@ -2,6 +2,7 @@ import { create, zustandDevTools } from './utils'; import { whiteLabellingService } from '@/_services'; import { authHeader } from '@/_helpers'; +import useStore from '@/AppBuilder/_stores/store'; // Define constants locally to avoid import issues const DEFAULT_WHITE_LABEL_SETTINGS = { WHITE_LABEL_TEXT: 'ToolJet', @@ -30,51 +31,40 @@ export const useWhiteLabellingStore = create( ...initialState, actions: { fetchWhiteLabelDetails: (organizationId) => { - if (organizationId) { - return new Promise((resolve, reject) => { - const headers = authHeader(); - const workspaceId = headers['tj-workspace-id']; - set({ - loadingWhiteLabelDetails: true, - activeOrganizationId: organizationId || workspaceId, - isWhiteLabelDetailsFetched: false, - }); - whiteLabellingService - .get(null, organizationId) - .then((settings) => { - set({ - whiteLabelText: - settings[WHITE_LABEL_OPTIONS.WHITE_LABEL_TEXT] || DEFAULT_WHITE_LABEL_SETTINGS.WHITE_LABEL_TEXT, - whiteLabelLogo: - settings[WHITE_LABEL_OPTIONS.WHITE_LABEL_LOGO] || DEFAULT_WHITE_LABEL_SETTINGS.WHITE_LABEL_LOGO, - whiteLabelFavicon: - settings[WHITE_LABEL_OPTIONS.WHITE_LABEL_FAVICON] || - DEFAULT_WHITE_LABEL_SETTINGS.WHITE_LABEL_FAVICON, - loadingWhiteLabelDetails: false, - isWhiteLabelDetailsFetched: true, - }); - resolve(); - }) - .catch((error) => { - console.error('Error in fetchWhiteLabelDetails:', error); - set({ - loadingWhiteLabelDetails: false, - activeOrganizationId: null, - isWhiteLabelDetailsFetched: false, - }); - reject(error); - }); - }); - } else { + return new Promise((resolve, reject) => { + const headers = authHeader(); + const workspaceId = headers['tj-workspace-id']; set({ - whiteLabelText: window.public_config?.WHITE_LABEL_TEXT || DEFAULT_WHITE_LABEL_SETTINGS.WHITE_LABEL_TEXT, - whiteLabelLogo: window.public_config?.WHITE_LABEL_LOGO || DEFAULT_WHITE_LABEL_SETTINGS.WHITE_LABEL_LOGO, - whiteLabelFavicon: - window.public_config?.WHITE_LABEL_FAVICON || DEFAULT_WHITE_LABEL_SETTINGS.WHITE_LABEL_FAVICON, - loadingWhiteLabelDetails: false, - isWhiteLabelDetailsFetched: true, + loadingWhiteLabelDetails: true, + activeOrganizationId: organizationId || workspaceId, + isWhiteLabelDetailsFetched: false, }); - } + whiteLabellingService + .get(organizationId) + .then((settings) => { + const updatedSettings = { + whiteLabelText: settings[WHITE_LABEL_OPTIONS.WHITE_LABEL_TEXT], + whiteLabelLogo: settings[WHITE_LABEL_OPTIONS.WHITE_LABEL_LOGO], + whiteLabelFavicon: settings[WHITE_LABEL_OPTIONS.WHITE_LABEL_FAVICON], + loadingWhiteLabelDetails: false, + isWhiteLabelDetailsFetched: true, + isDefaultWhiteLabel: settings.is_default, + }; + set(updatedSettings); + //update the white-label slice from here. somehow when we open the builder the actual store values goes back to default state. need to investigte more + useStore.getState().updateWhiteLabelDetails(updatedSettings); + resolve(); + }) + .catch((error) => { + console.error('Error in fetchWhiteLabelDetails:', error); + set({ + loadingWhiteLabelDetails: false, + activeOrganizationId: null, + isWhiteLabelDetailsFetched: false, + }); + reject(error); + }); + }); }, resetWhiteLabellingStoreBackToInitialState: () => { set({ ...initialState }); diff --git a/frontend/src/_styles/global-datasources.scss b/frontend/src/_styles/global-datasources.scss index 636f79c503..d365b1ac0c 100644 --- a/frontend/src/_styles/global-datasources.scss +++ b/frontend/src/_styles/global-datasources.scss @@ -215,6 +215,10 @@ } } +.datasources-search-box { + margin-left: 8px; +} + .datasources-info { display: contents; font-weight: 500 !important; diff --git a/frontend/src/_styles/mixins.scss b/frontend/src/_styles/mixins.scss index 2e34ce0a3f..295597fa99 100644 --- a/frontend/src/_styles/mixins.scss +++ b/frontend/src/_styles/mixins.scss @@ -35,3 +35,28 @@ } } } + +@mixin scrollable($max-height: 50vh) { + display: block; + max-height: $max-height; + overflow-y: scroll; + scrollbar-width: thin; + scrollbar-color: #888 #f1f1f1; + + &::-webkit-scrollbar { + width: 8px; + height: 8px; + } + + &::-webkit-scrollbar-thumb { + background-color: #888; + border-radius: 4px; + &:hover { + background-color: #555; + } + } + + &::-webkit-scrollbar-track { + background: #f1f1f1; + } +} diff --git a/frontend/src/_styles/tabler.scss b/frontend/src/_styles/tabler.scss index 6ea0021701..34afb6bd0e 100644 --- a/frontend/src/_styles/tabler.scss +++ b/frontend/src/_styles/tabler.scss @@ -7,6 +7,7 @@ * Licensed under MIT (https://github.com/tabler/tabler/blob/master/LICENSE) */ @charset "UTF-8"; +@import "./mixins.scss"; @font-face { font-display: swap; @@ -3836,6 +3837,10 @@ fieldset:disabled .btn { display: none } +.user-group-scrollable { + @include scrollable(60vh); /* Adjust the max-height if necessary */ +} + .tab-content>.active { display: block } diff --git a/frontend/src/_styles/theme.scss b/frontend/src/_styles/theme.scss index 262bfc748e..c423bf5a85 100644 --- a/frontend/src/_styles/theme.scss +++ b/frontend/src/_styles/theme.scss @@ -2362,6 +2362,7 @@ body { font-family: "Inconsolata", "Menlo", "Consolas", monospace; font-size: 16px; padding: 20px; + color: #0000009c; } .RichEditor-controls { @@ -4746,7 +4747,21 @@ input[type="text"] { * Folder List */ .folder-list { - overflow-y: auto; + overflow-y: scroll; + scrollbar-width: thin; + scrollbar-color: #888 transparent; + &:hover { + &::-webkit-scrollbar { + display: block; + width: 5px; + } + &::-webkit-scrollbar-thumb { + background-color: #888; + } + &::-webkit-scrollbar-track { + background-color: transparent; + } + } .list-group-transparent .list-group-item.active { color: $primary; @@ -5354,7 +5369,7 @@ div#driver-page-overlay { padding: 10px 5px 0 0; float: left; font-size: 14px; - color: $light-gray; + color: var(--slate-12); } .dynamic-form-element { @@ -9844,6 +9859,25 @@ tbody { .workspace-settings-table-wrap { max-width: 880px; margin: 0 auto; + .tj-user-table-wrapper{ + padding-right: 4px; + } + &:hover{ + .tj-user-table-wrapper{ + padding-right: 0px; + } + ::-webkit-scrollbar{ + display: block; + width: 4px; + } + ::-webkit-scrollbar-track{ + background: var(--base); + } + ::-webkit-scrollbar-thumb{ + background: var(--slate7); + border-radius: 6px; + } + } } diff --git a/frontend/src/_ui/Accordion/AccordionItem.js b/frontend/src/_ui/Accordion/AccordionItem.js index 22fe54512d..79fd86a41f 100644 --- a/frontend/src/_ui/Accordion/AccordionItem.js +++ b/frontend/src/_ui/Accordion/AccordionItem.js @@ -1,5 +1,5 @@ -import React, { useEffect } from 'react'; -import cx from 'classnames'; +import React, { useEffect } from "react"; +import cx from "classnames"; const AccordionItem = ({ open = true, index, title, children }) => { const [show, setShow] = React.useState(open); @@ -13,7 +13,7 @@ const AccordionItem = ({ open = true, index, title, children }) => { function isNotEmpty(item) { if (Array.isArray(item)) { return item.some(isNotEmpty); // Check if any element in the array is not empty - } else if (typeof item === 'object') { + } else if (typeof item === "object") { return Object.keys(item).some((key) => isNotEmpty(item[key])); // Check if any key in the object is not empty } else { return Boolean(item); // Check if the item itself is truthy @@ -23,7 +23,7 @@ const AccordionItem = ({ open = true, index, title, children }) => { function removeEmptyItems(input) { if (Array.isArray(input)) { return input.filter(isNotEmpty); - } else if (typeof input === 'object') { + } else if (typeof input === "object") { return isNotEmpty(input) ? input : null; } else { return input; @@ -31,22 +31,38 @@ const AccordionItem = ({ open = true, index, title, children }) => { } return (
    -

    -
    - {title} +

    +
    + + {title} +

    {newChildren}
    diff --git a/frontend/src/_ui/HttpHeaders/SourceEditor.jsx b/frontend/src/_ui/HttpHeaders/SourceEditor.jsx index a7ebbd368c..04df343740 100644 --- a/frontend/src/_ui/HttpHeaders/SourceEditor.jsx +++ b/frontend/src/_ui/HttpHeaders/SourceEditor.jsx @@ -14,13 +14,15 @@ export default ({ workspaceConstants, isDisabled, width, + dataCy, }) => { const darkMode = localStorage.getItem('darkMode') === 'true'; return (
    {options.length === 0 && ( -
    +
    There are no key value pairs added
    @@ -29,6 +31,7 @@ export default ({ {options.map((option, index) => (
    keyValuePairValueChanged(e.target.value, 0, index)} @@ -39,7 +42,7 @@ export default ({ disabled={isDisabled} style={{ flex: 1, - width: width ? width : '300px', + width: '316px', borderTopRightRadius: '0', borderBottomRightRadius: '0', borderRight: 'none', @@ -47,6 +50,7 @@ export default ({ />
    @@ -325,7 +333,7 @@ function InviteUsersForm({ className="invite-email-body" id="inviteByEmail" > -