diff --git a/.github/actions/cached-ui-deps/action.yml b/.github/actions/cached-ui-deps/action.yml index e399cc7ad5..4f19a27c17 100644 --- a/.github/actions/cached-ui-deps/action.yml +++ b/.github/actions/cached-ui-deps/action.yml @@ -4,7 +4,7 @@ description: "Get & Cache Yarn Dependencies" runs: using: composite steps: - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: cache: 'yarn' cache-dependency-path: 'ui/yarn.lock' diff --git a/.github/workflows/automatic_doc_generation.yml b/.github/workflows/automatic_doc_generation.yml index 45444cd5eb..0650113f04 100644 --- a/.github/workflows/automatic_doc_generation.yml +++ b/.github/workflows/automatic_doc_generation.yml @@ -8,15 +8,15 @@ on: jobs: generate-docs: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest env: isPR: ${{ github.event.pull_request.base.ref == 'develop' || github.event.pull_request.base.ref == 'main' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: lfs: true ref: ${{ github.event.pull_request.head.ref }} - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: ${{ inputs.python-version }} diff --git a/.github/workflows/build-test-release.yml b/.github/workflows/build-test-release.yml index 8ac0e9eba5..ee0d603e54 100644 --- a/.github/workflows/build-test-release.yml +++ b/.github/workflows/build-test-release.yml @@ -15,30 +15,29 @@ concurrency: cancel-in-progress: true env: POETRY_VERSION: "2.1.4" - POETRY_EXPORT_PLUGIN_VERSION: "1.9.0" jobs: meta: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest outputs: matrix_supportedSplunk: ${{ steps.matrix.outputs.supportedSplunk }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - id: matrix - uses: splunk/addonfactory-test-matrix-action@v3.0 + uses: splunk/addonfactory-test-matrix-action@v3.1 fossa-scan: continue-on-error: true - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - run: | curl -H 'Cache-Control: no-cache' https://raw.githubusercontent.com/fossas/fossa-cli/master/install-latest.sh | bash fossa analyze --debug fossa report attribution --format text > /tmp/THIRDPARTY env: FOSSA_API_KEY: ${{ secrets.FOSSA_API_KEY }} - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: THIRDPARTY path: /tmp/THIRDPARTY @@ -57,10 +56,10 @@ jobs: failed: ${{ env.failed }} pre-commit: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: "3.9" - uses: pre-commit/action@v3.0.1 @@ -73,10 +72,10 @@ jobs: block_mode: "policy" compliance-copyrights: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: apache/skywalking-eyes@v0.7.0 + - uses: actions/checkout@v5 + - uses: apache/skywalking-eyes@v0.8.0 build-ui: name: Build UCC UI @@ -101,36 +100,36 @@ jobs: needs: - fossa-scan - build-ui - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: "3.9" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v6 with: name: UCC-UI-build path: built-ui/ - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v6 if: "! github.event.pull_request.head.repo.fork " with: name: THIRDPARTY - run: cp -f THIRDPARTY NOTICE if: "! github.event.pull_request.head.repo.fork " - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} + - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} - run: poetry install - name: Build UCC run: | cp -R built-ui/. splunk_add_on_ucc_framework/package/appserver/static/js/build poetry build - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: UCC-build path: dist/ test-unit: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest continue-on-error: true strategy: matrix: @@ -140,12 +139,13 @@ jobs: - "3.11" - "3.12" - "3.13" + - "3.14" steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} + - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} - run: | poetry install poetry run pytest --cov=splunk_add_on_ucc_framework --cov-report=xml tests/unit @@ -163,7 +163,7 @@ jobs: name: test-smoke ${{ matrix.python-version }} needs: - build-ui - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest continue-on-error: true strategy: matrix: @@ -173,18 +173,19 @@ jobs: - "3.11" - "3.12" - "3.13" + - "3.14" steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 + - uses: actions/checkout@v5 + - uses: actions/download-artifact@v6 with: name: UCC-UI-build path: built-ui/ - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - run: | cp -R built-ui/. splunk_add_on_ucc_framework/package/appserver/static/js/build - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} + - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} - run: | poetry install poetry run pytest tests/smoke @@ -199,39 +200,40 @@ jobs: failed: ${{ env.failed }} build-test-addon: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: - build-ui steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: "3.9" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v6 with: name: UCC-UI-build path: built-ui/ - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} + - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} - run: | cp -R built-ui/. splunk_add_on_ucc_framework/package/appserver/static/js/build - poetry install --only main + poetry install --only main --extras validate - run: poetry run ucc-gen build --source tests/testdata/test_addons/package_global_config_everything/package - run: ./scripts/include-rum.sh output/Splunk_TA_UCCExample/appserver/templates/base.html scripts/rum-script.html "$RUM_ACCESS_TOKEN" env: RUM_ACCESS_TOKEN: ${{ secrets.RUM_ACCESS_TOKEN}} - run: poetry run ucc-gen package --path output/Splunk_TA_UCCExample - - uses: actions/upload-artifact@v4 + - run: poetry run ucc-gen validate --addon-path output/Splunk_TA_UCCExample + - uses: actions/upload-artifact@v5 with: name: Splunk_TA_UCCExample-raw-output path: output/* - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 with: name: Splunk_TA_UCCExample-packaged path: Splunk_TA_UCCExample*.tar.gz test-ui: name: test-ui Splunk ${{ matrix.splunk.version }} -group ${{ matrix.test-group }} - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: id-token: write contents: read @@ -257,16 +259,16 @@ jobs: - "9" - "10" steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: "3.9" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v6 with: name: Splunk_TA_UCCExample-raw-output path: output/ - run: | - curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} + curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} poetry install --only dev - name: Link chromedriver # Use installed chromedriver https://github.com/actions/runner-images/blob/main/images/linux/Ubuntu2204-Readme.md @@ -279,7 +281,7 @@ jobs: until curl -k -s -u admin:Chang3d! https://localhost:8089/services/server/info\?output_mode\=json | jq '.entry[0].content.kvStoreStatus' | grep -o "ready" ; do echo -n "Waiting for KVStore to become ready-" && sleep 5 ; done timeout-minutes: 5 - run: poetry run pytest tests/ui --test-group-count 10 --test-group ${{ matrix.test-group }} --test-group-random-seed 123456 --headless --junitxml=test-results/junit.xml - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 if: success() || failure() with: name: test-results-ui-${{ matrix.splunk.version }}-${{ matrix.test-group }} @@ -289,7 +291,7 @@ jobs: run: | docker cp splunk:/opt/splunk/var/log/splunk/splunkd.log ./splunkd.log - name: Upload splunkd.log to GitHub Check - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 if: failure() with: name: test-ui-splunkd-splunkd-${{ matrix.splunk.version }}-${{ matrix.test-group }}.log @@ -303,7 +305,7 @@ jobs: appinspect-for-expected-outputs: name: splunk-appinspect ${{ matrix.tags }} tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest continue-on-error: true strategy: matrix: @@ -316,17 +318,17 @@ jobs: - "self-service" - "splunk_appinspect" steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: "3.9" - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} + - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} - name: Package tests/expected_output_global_config_everything/Splunk_TA_UCCExample run: | poetry install mkdir tests/packaged poetry run ucc-gen package --path tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample -o tests/packaged - - uses: splunk/appinspect-cli-action@v2.9 + - uses: splunk/appinspect-cli-action@v2.11 with: app_path: tests/packaged included_tags: ${{ matrix.tags }} @@ -346,8 +348,8 @@ jobs: tags: - "cloud" steps: - - uses: actions/checkout@v4 - - uses: actions/download-artifact@v4 + - uses: actions/checkout@v5 + - uses: actions/download-artifact@v6 with: name: Splunk_TA_UCCExample-packaged path: build/package @@ -360,51 +362,15 @@ jobs: password: ${{secrets.SPL_COM_PASSWORD}} app_path: build/package included_tags: ${{ matrix.tags }} - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 if: always() with: name: appinspect-api-html-report-${{ matrix.tags }} path: AppInspect_response.html - init-build-run-appinspect-cli: - runs-on: ubuntu-22.04 - needs: - - build - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - with: - python-version: "3.9" - - uses: actions/download-artifact@v4 - with: - name: UCC-UI-build - path: built-ui/ - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} - - run: | - cp -R built-ui/. splunk_add_on_ucc_framework/package/appserver/static/js/build - poetry install --only main - - run: | - poetry run ucc-gen init \ - --addon-name "demo_addon_for_splunk" \ - --addon-display-name "Demo Add-on for Splunk" \ - --addon-input-name demo_input \ - --add-license "Apache License 2.0" \ - --include-author Splunk - - run: | - echo "# Binary File Declaration\n\nIgnoring lib/charset_normalizer/md.cpython-37m-x86_64-linux-gnu.so" > demo_addon_for_splunk/package/README.txt - - run: | - poetry run ucc-gen build --source demo_addon_for_splunk/package --ta-version 0.0.1 - - run: | - mkdir packaged - poetry run ucc-gen package --path output/demo_addon_for_splunk -o packaged - - run: | - python3 -m pip install splunk-appinspect - - run: | - splunk-appinspect inspect packaged/demo_addon_for_splunk-0.0.1.tar.gz --mode test --included-tags cloud - build-test-addon-openapi-client: name: build-test-addon-openapi-client Splunk ${{ matrix.splunk.version }} - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest needs: - meta - build-test-addon @@ -415,15 +381,15 @@ jobs: matrix: splunk: ${{ fromJson(needs.meta.outputs.matrix_supportedSplunk) }} steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: "3.11" - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v6 with: name: UCC-UI-build path: built-ui/ - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} + - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} - run: | cp -R built-ui/. splunk_add_on_ucc_framework/package/appserver/static/js/build poetry install --only main @@ -450,7 +416,7 @@ jobs: - build-test-addon-openapi-client - storybook-screenshots - bot-updates - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest env: NEEDS: ${{ toJson(needs) }} steps: @@ -483,28 +449,28 @@ jobs: - semgrep - pre-commit - all-checks - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: id-token: write contents: read if: "! github.event.pull_request.head.repo.fork " steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: # Very important: semantic-release won't trigger a tagged # build if this is not set false persist-credentials: false - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.9" - name: install UI deps uses: ./.github/actions/cached-ui-deps - - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} - - uses: actions/download-artifact@v4 + - run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} + - uses: actions/download-artifact@v6 with: name: UCC-UI-build path: built-ui/ - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@v6 with: name: THIRDPARTY - run: cp -f THIRDPARTY NOTICE diff --git a/.github/workflows/build-ui.yml b/.github/workflows/build-ui.yml index f938efc38a..57e07b6319 100644 --- a/.github/workflows/build-ui.yml +++ b/.github/workflows/build-ui.yml @@ -4,13 +4,13 @@ on: jobs: ui-code-check: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest defaults: run: working-directory: ui shell: bash steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: install deps uses: ./.github/actions/cached-ui-deps - name: Code linting @@ -22,19 +22,19 @@ jobs: - name: Pack tarball run: npm pack - name: Upload tarball as artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: UCC-UI-lib-tarball path: "ui/*.tgz" build-ui: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest defaults: run: working-directory: ui shell: bash steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 - name: install deps uses: ./.github/actions/cached-ui-deps - name: Build UCC library @@ -44,7 +44,7 @@ jobs: - name: List deps into dependencies.txt run: yarn list --prod --depth 0 | python ../.github/scripts/format_yarn_deps.py --output-file=dist/dependencies.txt - name: Upload dist with name UCC-UI-build - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: UCC-UI-build path: ui/dist/build diff --git a/.github/workflows/code-cov.yml b/.github/workflows/code-cov.yml index 60ebe3aca5..43a3f73735 100644 --- a/.github/workflows/code-cov.yml +++ b/.github/workflows/code-cov.yml @@ -11,22 +11,22 @@ on: jobs: compare-coverage: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: pull-requests: write contents: read steps: - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.9" - name: Install Poetry run: | - curl -sSL https://install.python-poetry.org | python3 - --version 2.1.4 && poetry self add poetry-plugin-export@1.9.0 + curl -sSL https://install.python-poetry.org | python3 - --version 2.1.4 - name: Checkout develop branch - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: ref: develop @@ -39,7 +39,7 @@ jobs: poetry run pytest --cov=splunk_add_on_ucc_framework --cov-report=json:/tmp/coverage/develop-coverage.json tests/unit - name: Checkout PR branch - uses: actions/checkout@v4 + uses: actions/checkout@v5 - name: Install dependencies run: | @@ -50,7 +50,7 @@ jobs: poetry run pytest --cov=splunk_add_on_ucc_framework --cov-report=json:/tmp/coverage/pr-coverage.json tests/unit - name: Process coverage data and comment on PR - uses: actions/github-script@v7 + uses: actions/github-script@v8 with: script: | const { default: compareDiff } = await import('${{ github.workspace }}/.github/scripts/code-coverage.mjs') diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 642310bf1c..c6962a2346 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -12,13 +12,13 @@ on: - "release/**" jobs: deploy: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: contents: write pages: write steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 + - uses: actions/checkout@v5 + - uses: actions/setup-python@v6 with: python-version: 3.9 - name: install deps @@ -29,7 +29,7 @@ jobs: yarn run build-storybook --quiet --output-dir ../docs/storybook/ cd ../ - run: | - curl -sSL https://install.python-poetry.org | python3 - --version 2.1.4 && poetry self add poetry-plugin-export@1.9.0 + curl -sSL https://install.python-poetry.org | python3 - --version 2.1.4 poetry install - name: Deploy to GitHub Pages if: github.ref_name == 'main' diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index e23b0b569b..780b4b8559 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -31,7 +31,7 @@ jobs: shell: bash steps: - name: Checkout code - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: ref: ${{ github.event.inputs.branch }} diff --git a/.github/workflows/storybook-visual.yml b/.github/workflows/storybook-visual.yml index 59acaaf993..e104547065 100644 --- a/.github/workflows/storybook-visual.yml +++ b/.github/workflows/storybook-visual.yml @@ -8,11 +8,11 @@ jobs: run: working-directory: ui shell: bash - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest env: isPR: ${{ github.event.pull_request.base.ref == 'develop' || github.event.pull_request.base.ref == 'main' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v5 with: lfs: true ref: ${{ github.event.pull_request.head.ref }} @@ -43,7 +43,7 @@ jobs: run: | git add \*.png git diff --staged --exit-code || (git commit -S -m "update screenshots" && git push) - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@v5 name: "Upload test report" if: ${{ failure() }} with: diff --git a/.github/workflows/ta-tests.yml b/.github/workflows/ta-tests.yml index 0a92651079..8091a8eced 100644 --- a/.github/workflows/ta-tests.yml +++ b/.github/workflows/ta-tests.yml @@ -22,20 +22,24 @@ on: description: "Branch of splunk/addonfactory-ucc-library to use (leave empty to use latest from PyPI)" required: false default: "" + run_pipelines: + description: "Trigger TA pipelines (true/false)" + required: false + default: "false" env: POETRY_VERSION: "2.1.4" POETRY_EXPORT_PLUGIN_VERSION: "1.9.0" jobs: build-ucc: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Checkout UCC Framework Repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: path: UCC - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.9" @@ -51,14 +55,14 @@ jobs: run: poetry build - name: Upload UCC Artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v5 with: name: ucc-package-whl path: UCC/dist/*.whl determine-repos: # This job determines the repositories to run tests on based on the event type and inputs - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest outputs: repos: ${{ steps.set-repos.outputs.repos }} steps: @@ -89,10 +93,10 @@ jobs: matrix: target_repo: ${{ fromJSON(needs.determine-repos.outputs.repos) }} continue-on-error: true - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest steps: - name: Checkout Target Add-on Repository - uses: actions/checkout@v4 + uses: actions/checkout@v5 with: repository: ${{ matrix.target_repo }} path: TA @@ -100,7 +104,7 @@ jobs: ref: ${{ github.event.inputs.target_branch }} - name: Set up Python - uses: actions/setup-python@v5 + uses: actions/setup-python@v6 with: python-version: "3.9" @@ -108,32 +112,76 @@ jobs: run: curl -sSL https://install.python-poetry.org | python3 - --version ${{env.POETRY_VERSION}} && poetry self add poetry-plugin-export@${{env.POETRY_EXPORT_PLUGIN_VERSION}} - name: Download UCC Artifact - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v6 with: name: ucc-package-whl path: UCC - - - name: Install Dependencies in Target Add-on + - name: Importing GPG key + if: success() && github.event.inputs.run_pipelines == 'true' + uses: crazy-max/ghaction-import-gpg@v6 + with: + git_committer_name: ${{ secrets.SA_GH_USER_NAME }} + git_committer_email: ${{ secrets.SA_GH_USER_EMAIL }} + gpg_private_key: ${{ secrets.SA_GPG_PRIVATE_KEY }} + passphrase: ${{ secrets.SA_GPG_PASSPHRASE }} + git_user_signingkey: true + git_commit_gpgsign: true + workdir: TA + - name: Prepare the Target Add-on + id: prepare working-directory: TA run: | - UCC_WHL=$(ls ../UCC/*.whl) + set -x + # https://github.com/python-poetry/poetry/issues/7491#issuecomment-1423763839 git config --global --add url."https://${{ secrets.GH_TOKEN_ADMIN }}@github.com".insteadOf https://github.com git config --global --add url."https://${{ secrets.GH_TOKEN_ADMIN }}@github.com".insteadOf ssh://git@github.com - # Retry logic for poetry install - MAX_RETRIES=3 - RETRY_COUNT=0 + # Use the special branch + if [[ "${{ github.event.inputs.run_pipelines }}" == "true" ]]; then + GIT_BRANCH="ucc/ci_tests_trigger_pipeline" - until [ $RETRY_COUNT -ge $MAX_RETRIES ] - do - poetry add ../UCC/$UCC_WHL --group dev && break - RETRY_COUNT=$((RETRY_COUNT+1)) - echo "Poetry install failed, retry attempt $RETRY_COUNT of $MAX_RETRIES" - sleep 5 - done + git fetch origin + + if git ls-remote --exit-code --heads origin "$GIT_BRANCH"; then + echo "Branch $GIT_BRANCH already exists, checking it out" + git checkout "$GIT_BRANCH" + git reset --hard "origin/${{ github.event.inputs.target_branch }}" # Reset to main branch + git rebase ${{ github.event.inputs.target_branch }} $GIT_BRANCH # Rebase the branch onto main + else + echo "Branch $GIT_BRANCH does not exist, creating it" + git checkout -b "$GIT_BRANCH" "origin/${{ github.event.inputs.target_branch }}" + fi + + echo "GIT_BRANCH=$GIT_BRANCH" >> "$GITHUB_ENV" + fi + + rm splunk_add_on_ucc_framework-*.whl || true + cp ../UCC/*.whl ./ + UCC_WHL=$(ls *.whl) + echo "UCC_WHL=$UCC_WHL" >> "$GITHUB_ENV" + + echo "Adding UCC package $UCC_WHL" + + # Remove existing splunk_add_on_ucc_framework if present + poetry remove splunk_add_on_ucc_framework || true + + if [[ -f requirements_ucc.txt ]]; then + echo "Modifying existing requirements_ucc.txt" + cat requirements_ucc.txt | grep -v "splunk-add-on-ucc-framework" > requirements_ucc.txt.new || true + mv requirements_ucc.txt.new requirements_ucc.txt + fi + + echo "./$UCC_WHL" >> requirements_ucc.txt + + # Adding "package-mode = false" to pyproject.toml if not present + if ! grep -q "package-mode = false" pyproject.toml; then + echo "Adding 'package-mode = false' to pyproject.toml" + sed -i '/name = .*/ s:$:\npackage-mode = false:' pyproject.toml + fi # Install splunktaucclib with retries + MAX_RETRIES=3 RETRY_COUNT=0 until [ $RETRY_COUNT -ge $MAX_RETRIES ] do @@ -145,16 +193,33 @@ jobs: poetry add splunktaucclib@latest && break fi RETRY_COUNT=$((RETRY_COUNT+1)) + + if [[ $RETRY_COUNT -eq $MAX_RETRIES ]]; then + echo "splunktaucclib install failed after $MAX_RETRIES attempts, exiting" + exit 1 + fi + echo "splunktaucclib install failed, retry attempt $RETRY_COUNT of $MAX_RETRIES" sleep 5 done mkdir -p package/lib poetry export --without-hashes -o package/lib/requirements.txt + + # Add to commit + if [[ "${{ github.event.inputs.run_pipelines }}" == "true" ]]; then + echo "Adding UCC, requirements_ucc.txt, pyproject.toml and poetry.lock to commit" + git add pyproject.toml requirements_ucc.txt poetry.lock *.whl + fi - name: Run ucc-gen build in Target Add-on working-directory: TA run: | - poetry run ucc-gen build > build_output.log 2>&1 + set -x + + python3 -m venv .ucc_venv + ./.ucc_venv/bin/python3 -m pip install ./$UCC_WHL + + ./.ucc_venv/bin/ucc-gen build 2>&1 | tee build_output.log if tail -n 1 build_output.log | grep -q "^INFO: File creation summary: created: "; then echo "✓ Build completed successfully with expected output" cat build_output.log @@ -165,3 +230,120 @@ jobs: cat build_output.log exit 1 fi + - name: Upgrade the release pipeline in Github Actions + if: success() && github.event.inputs.run_pipelines == 'true' + working-directory: TA + run: | + set -x + + VERSION="$(cat .github/workflows/build-test-release.yml | grep reusable-build-test-release.yml | cut -d '@' -f 2)" + + # Version is in format e.g. "v1.2.3". We need at least "v5.1.0" + MAJOR_VERSION="$(echo $VERSION | cut -d '.' -f 1 | sed 's/^v//')" + MINOR_VERSION="$(echo $VERSION | cut -d '.' -f 2)" + + # If major and minor are not integers, exit + if ! [[ "$MAJOR_VERSION" =~ ^[0-9]+$ ]] || ! [[ "$MINOR_VERSION" =~ ^[0-9]+$ ]]; then + echo "✗ The reusable workflow version $VERSION is not in the expected format. No update performed." + exit 0 + fi + + if (( MAJOR_VERSION < 5 )) || { (( MAJOR_VERSION == 5 )) && (( MINOR_VERSION < 1 )); }; then + echo "✗ The reusable workflow version $VERSION is too old. Upgrading to v5.1.0" + sed -i 's/reusable-build-test-release.yml@.*/reusable-build-test-release.yml@v5.1.0/' .github/workflows/build-test-release.yml + git add .github/workflows/build-test-release.yml + echo "Upgraded the reusable workflow version to v5.1.0" + else + echo "✓ The reusable workflow version $VERSION is up to date" + fi + - name: Push changes to a temporary branch in order to trigger the pipeline + if: success() && github.event.inputs.run_pipelines == 'true' + working-directory: TA + run: | + git config --global user.name "${{ secrets.SA_GH_USER_NAME }}" + git config --global user.email "${{ secrets.SA_GH_USER_EMAIL }}" + git commit -S -m "CI: UCC build for ${{ github.event_name }} event" + git push --force origin $GIT_BRANCH + - name: Create a PR if it does not exist yet + if: success() && github.event.inputs.run_pipelines == 'true' + working-directory: TA + env: + GH_TOKEN: ${{ secrets.GH_TOKEN_ADMIN }} + run: | + echo "Creating a new draft PR from branch $GIT_BRANCH to ${{ github.event.inputs.target_branch }}" + gh pr create -R ${{ matrix.target_repo }} --title "CI: UCC build for ${{ github.event_name }} event" \ + --body "This PR was created automatically to trigger the build-test-release pipeline." \ + --base ${{ github.event.inputs.target_branch }} --head $GIT_BRANCH --draft || true + - name: Obtain the workflow run ID + if: success() && github.event.inputs.run_pipelines == 'true' + id: get-workflow-run-id + env: + GH_TOKEN: ${{ secrets.GH_TOKEN_ADMIN }} + run: | + echo "Waiting for the workflow run to be created..." + sleep 30 # Wait for a while to ensure the workflow run is created + + for i in {1..30}; do + echo "Attempt $i to get workflow run ID" + WORKFLOW_RUN_ID=$(gh run -R ${{ matrix.target_repo }} list -b ucc/ci_tests_trigger_pipeline \ + --json databaseId --limit 1 --status in_progress --workflow build-test-release \ + -q '.[0].databaseId | select( . != null )') + + if [[ -n "$WORKFLOW_RUN_ID" ]]; then + echo "Found workflow run ID: $WORKFLOW_RUN_ID" + break + fi + + echo "Workflow run ID not found, retrying in 10 seconds..." + sleep 10 + done + + if [[ -z "$WORKFLOW_RUN_ID" ]]; then + echo "Failed to obtain workflow run ID after multiple attempts, exiting" + exit 1 + fi + + echo "WORKFLOW_RUN_ID=$WORKFLOW_RUN_ID" >> $GITHUB_ENV + echo "workflow_run_id=$WORKFLOW_RUN_ID" >> $GITHUB_OUTPUT + + - name: Wait for the workflow run to complete + if: success() + id: wait-for-workflow + env: + GH_TOKEN: ${{ secrets.GH_TOKEN_ADMIN }} + run: | + if [[ -z "$WORKFLOW_RUN_ID" ]]; then + echo "No workflow run ID found, skipping wait" + exit 0 + fi + + WORKFLOW_URL="https://github.com/${{ matrix.target_repo }}/actions/runs/$WORKFLOW_RUN_ID" + echo "Workflow URL: $WORKFLOW_URL" + + echo "Workflow run ID: $WORKFLOW_RUN_ID" + echo "Waiting for workflow run $WORKFLOW_RUN_ID to start..." + sleep 300 # Initial wait to allow the workflow to start properly + + echo "Waiting for workflow run $WORKFLOW_RUN_ID to complete..." + gh run watch -R ${{ matrix.target_repo }} "$WORKFLOW_RUN_ID" -i 120 2>&1 | tee watch_output.log + + RESULTS_JSON="$(gh run view -R ${{ matrix.target_repo }} "$WORKFLOW_RUN_ID" --json jobs)" + + echo "Checking results of not-skipped jobs 'build' and 'spl2'" + RESULTS="$(echo $RESULTS_JSON | jq -r '.jobs[] | select(.conclusion != "skipped") + | select(.name | test("build|spl2")) + | "\(.name): \(.conclusion)"')" + + [[ $(printf '%s\n' "$RESULTS" | cut -d ':' -f 2 | cut -d ' ' -f 2 | sort | uniq) == "success" ]] && exit 0 + + echo "One or more jobs failed. Details:" + echo "$WORKFLOW_URL" + exit 1 + - name: Cleanup temporary branch + if: always() && github.event.inputs.run_pipelines == 'true' + working-directory: TA + env: + GH_TOKEN: ${{ secrets.GH_TOKEN_ADMIN }} + run: | + echo "Deleting temporary branch $GIT_BRANCH" + gh api -X DELETE repos/${{ matrix.target_repo }}/git/refs/heads/$GIT_BRANCH || true diff --git a/docs/advanced/requirements.md b/docs/advanced/requirements.md index 55f216c4ab..dba5e32790 100644 --- a/docs/advanced/requirements.md +++ b/docs/advanced/requirements.md @@ -79,8 +79,8 @@ The above example will exclude the `urllib3`, `certifi`, and `setuptools` packag During the build process, UCC will: 1. Install all packages listed in `requirements.txt` using pip -1.Remove any packages listed in `exclude.txt` from the installed libraries -1.Copy the remaining packages to the add-on's `lib` directory +1. Remove any packages listed in `exclude.txt` from the installed libraries +1. Copy the remaining packages to the add-on's `lib` directory ## Usage Notes diff --git a/docs/alert_actions/alert_scripts.md b/docs/alert_actions/alert_scripts.md index 66bbc4b8ae..4f90888952 100644 --- a/docs/alert_actions/alert_scripts.md +++ b/docs/alert_actions/alert_scripts.md @@ -25,57 +25,7 @@ security reasons.
Note: This method must be overwritten. An example of a script with validations: ```python -import import_declare_test -import sys - -from splunktaucclib.alert_actions_base import ModularAlertBase -from splunk_ta_uccexample import modalert_test_alert_helper - -class AlertActionWorkertest_alert(ModularAlertBase): - - def __init__(self, ta_name, alert_name): - super(AlertActionWorkertest_alert, self).__init__(ta_name, alert_name) - - def validate_params(self): - - - if not self.get_param("name"): - self.log_error('name is a mandatory parameter, but its value is None.') - return False - - if not self.get_param("action"): - self.log_error('action is a mandatory parameter, but its value is None.') - return False - - if not self.get_param("account"): - self.log_error('account is a mandatory parameter, but its value is None.') - return False - return True - - def process_event(self, *args, **kwargs): - status = 0 - try: - if not self.validate_params(): - return 3 - status = modalert_test_alert_helper.process_event(self, *args, **kwargs) - except (AttributeError, TypeError) as ae: - self.log_error("Error: {}. Please double check spelling and also verify that a " - "compatible version of Splunk_SA_CIM is installed.".format(str(ae))) - return 4 - except Exception as e: - msg = "Unexpected error: {}." - if str(e): - self.log_error(msg.format(str(e))) - else: - import traceback - self.log_error(msg.format(traceback.format_exc())) - return 5 - return status - -if __name__ == "__main__": - exitcode = AlertActionWorkertest_alert("Splunk_TA_UCCExample", "test_alert").run(sys.argv) - sys.exit(exitcode) - +--8<-- "tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert.py:3:55" ``` In this example, `modalert_test_alert_helper`'s `process_event()` method contains the logic of the actions to be diff --git a/docs/commands.md b/docs/commands.md index aa286b79a1..2efbe9751b 100644 --- a/docs/commands.md +++ b/docs/commands.md @@ -38,6 +38,7 @@ It takes the following parameters: Example: `--pip-custom-flag="--no-compile --prefer-binary --ignore-installed --report path/to/report.json --progress-bar on"` * `--build-custom-ui` - [optional] Additional flag that will trigger build of custom UI repo (execute build script from `./ui` repository). +* `--overwrite` - [optional] overwrites the already existing add-on directory. By default, you can't build an add-on to an already existing directory. ### Verbose mode diff --git a/docs/entity/components.md b/docs/entity/components.md index 06b2e4e8c7..c9e5cca20c 100644 --- a/docs/entity/components.md +++ b/docs/entity/components.md @@ -415,6 +415,25 @@ This is how it looks in the UI: The component maps and unmaps values into a single field in the format `fieldName1,fieldName2,fieldName3`, but only for checked rows. For the given example, it emits the following value: `rowWithoutGroup,rowUnderGroup1,firstRowUnderGroup3`. +## `Date` + +See the underlying `@splunk/react-ui` component: [`Date`](https://splunkui.splunk.com/Packages/react-ui/Date). + +See the following example usage: + +```json +{ + "type": "date", + "field": "example_date", + "label": "Date", + "required": true +} +``` + +This is how it looks in the UI: + +![image](../images/components/datepicker_component.png) + ## `Multiple Select` See the underlying `@splunk/react-ui` component: [`Multiselect`](https://splunkui.splunk.com/Packages/react-ui/Multiselect). diff --git a/docs/images/components/datepicker_component.png b/docs/images/components/datepicker_component.png new file mode 100644 index 0000000000..7a61aa2325 Binary files /dev/null and b/docs/images/components/datepicker_component.png differ diff --git a/docs/metadata.md b/docs/metadata.md index 9adbc06aa1..799ea993ee 100644 --- a/docs/metadata.md +++ b/docs/metadata.md @@ -22,5 +22,6 @@ Metadata contains general information about add-on build. | defaultView | string | Define which view should be loaded on TA load. One of `"inputs"`, `"configuration"`, `"dashboard"` or `"search"`. Default `configuration`. | | [os-dependentLibraries](./advanced/os-dependent_libraries.md) | array | This feature allows you to download and unpack libraries with appropriate binaries for the indicated operating system during the build process. | | supported_themes | array | This feature is allows you provide the themes supported by your add-on. Supported values: `light`, `dark`. No default. | +| supportedPythonVersion | array | This feature allows you to specify which python version your app would use (for Splunk v10.1 and above). No default. | | isVisible | boolean | This option allows you to create apps which are not visible by default by setting isVisible=false. Default: true if globalConfig file exists in the repository, else false. | | showFooter | boolean | This option allows you to display the footer component on every page of add-on. Default: true if globalConfig file exists in the repository, else false. | diff --git a/poetry.lock b/poetry.lock index cd1a336942..2f3be84643 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,15 @@ -# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "addonfactory-splunk-conf-parser-lib" -version = "0.4.3" +version = "1.0.0" description = "Splunk .conf files parser" optional = false -python-versions = "<4.0,>=3.7" +python-versions = "<4.0,>=3.9" +groups = ["main", "dev"] files = [ - {file = "addonfactory_splunk_conf_parser_lib-0.4.3-py3-none-any.whl", hash = "sha256:16a66c1829eec876c21b2d2ee2b2ef305bc23516837fc0e63d5e7512c06d357d"}, - {file = "addonfactory_splunk_conf_parser_lib-0.4.3.tar.gz", hash = "sha256:847e2eb34b3be35d1e5d3d5a2cdaec1ccd33cc687b7bbd1f3f746184f16b1479"}, + {file = "addonfactory_splunk_conf_parser_lib-1.0.0-py3-none-any.whl", hash = "sha256:a118f266ca9f6e79c8b0f344dc288a43de7c7a38c705d0c89d79324c33580677"}, + {file = "addonfactory_splunk_conf_parser_lib-1.0.0.tar.gz", hash = "sha256:8254b5ea6fc8233da7527dc80461aa5b0555dfa3af73b8b937af26129f32323d"}, ] [[package]] @@ -17,18 +18,19 @@ version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] -benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] -tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] +tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\"", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.9\" and python_version < \"3.13\""] [[package]] name = "babel" @@ -36,6 +38,7 @@ version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, @@ -50,6 +53,7 @@ version = "5.9" description = "A wrapper around re and regex that adds additional back references." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "backrefs-5.9-py310-none-any.whl", hash = "sha256:db8e8ba0e9de81fcd635f440deab5ae5f2591b54ac1ebe0550a2ca063488cd9f"}, {file = "backrefs-5.9-py311-none-any.whl", hash = "sha256:6907635edebbe9b2dc3de3a2befff44d74f30a4562adbb8b36f21252ea19c5cf"}, @@ -69,6 +73,8 @@ version = "4.10.0" description = "Screen-scraping library" optional = true python-versions = ">3.0.0" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "beautifulsoup4-4.10.0-py3-none-any.whl", hash = "sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf"}, {file = "beautifulsoup4-4.10.0.tar.gz", hash = "sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"}, @@ -87,6 +93,7 @@ version = "2025.6.15" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "certifi-2025.6.15-py3-none-any.whl", hash = "sha256:2e0c7ce7cb5d8f8634ca55d2ba7e6ec2689a2fd6537d8dec1296a477a4910057"}, {file = "certifi-2025.6.15.tar.gz", hash = "sha256:d747aa5a8b9bbbb1bb8c22bb13e22bd1f18e9796defa16bab421f7f7a317323b"}, @@ -98,6 +105,8 @@ version = "3.0.4" description = "Universal encoding detector for Python 2 and 3" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, @@ -109,6 +118,7 @@ version = "3.4.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, @@ -210,10 +220,12 @@ version = "8.1.8" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"}, {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"}, ] +markers = {main = "extra == \"validate\""} [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} @@ -224,6 +236,7 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -235,6 +248,7 @@ version = "2.3.0" description = "A coverage plugin to provide sensible default settings" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "covdefaults-2.3.0-py2.py3-none-any.whl", hash = "sha256:2832961f6ffcfe4b57c338bc3418a3526f495c26fb9c54565409c5532f7c41be"}, {file = "covdefaults-2.3.0.tar.gz", hash = "sha256:4e99f679f12d792bc62e5510fa3eb59546ed47bd569e36e4fddc4081c9c3ebf7"}, @@ -249,6 +263,7 @@ version = "7.10.2" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "coverage-7.10.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:79f0283ab5e6499fd5fe382ca3d62afa40fb50ff227676a3125d18af70eabf65"}, {file = "coverage-7.10.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4545e906f595ee8ab8e03e21be20d899bfc06647925bc5b224ad7e8c40e08b8"}, @@ -344,7 +359,7 @@ files = [ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "croniter" @@ -352,6 +367,8 @@ version = "1.4.1" description = "croniter provides iteration for datetime object with cron like format" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128"}, {file = "croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361"}, @@ -366,6 +383,7 @@ version = "1.2.0" description = "cssselect parses CSS3 Selectors and translates them to XPath 1.0" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "cssselect-1.2.0-py2.py3-none-any.whl", hash = "sha256:da1885f0c10b60c03ed5eccbb6b68d6eff248d91976fcde348f395d54c9fd35e"}, {file = "cssselect-1.2.0.tar.gz", hash = "sha256:666b19839cfaddb9ce9d36bfe4c969132c647b92fc9088c4e23f786b30f1b3dc"}, @@ -377,6 +395,7 @@ version = "0.7.1" description = "XML bomb protection for Python stdlib modules" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main", "dev"] files = [ {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, @@ -388,6 +407,7 @@ version = "2.1.0" description = "A library to handle automated deprecations" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "deprecation-2.1.0-py2.py3-none-any.whl", hash = "sha256:a10811591210e1fb0e768a8c25517cabeabcba6f0bf96564f8ff45189f90b14a"}, {file = "deprecation-2.1.0.tar.gz", hash = "sha256:72b3bde64e5d778694b0cf68178aed03d15e15477116add3fb773e581f9518ff"}, @@ -402,6 +422,7 @@ version = "1.25.0" description = "Dynamic version generation" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "dunamai-1.25.0-py3-none-any.whl", hash = "sha256:7f9dc687dd3256e613b6cc978d9daabfd2bb5deb8adc541fc135ee423ffa98ab"}, {file = "dunamai-1.25.0.tar.gz", hash = "sha256:a7f8360ea286d3dbaf0b6a1473f9253280ac93d619836ad4514facb70c0719d1"}, @@ -416,6 +437,7 @@ version = "4.1.5" description = "XPath 1.0/2.0/3.0/3.1 parsers and selectors for ElementTree and lxml" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "elementpath-4.1.5-py3-none-any.whl", hash = "sha256:2ac1a2fb31eb22bbbf817f8cf6752f844513216263f0e3892c8e79782fe4bb55"}, {file = "elementpath-4.1.5.tar.gz", hash = "sha256:c2d6dc524b29ef751ecfc416b0627668119d8812441c555d7471da41d4bacb8d"}, @@ -430,6 +452,8 @@ version = "1.3.0" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_version < \"3.11\"" files = [ {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, @@ -447,6 +471,7 @@ version = "2.0.2" description = "execnet: rapid multi-Python deployment" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, @@ -461,6 +486,7 @@ version = "18.13.0" description = "Faker is a Python package that generates fake data for you." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "Faker-18.13.0-py3-none-any.whl", hash = "sha256:801d1a2d71f1fc54d332de2ab19de7452454309937233ea2f7485402882d67b3"}, {file = "Faker-18.13.0.tar.gz", hash = "sha256:84bcf92bb725dd7341336eea4685df9a364f16f2470c4d29c1d7e6c5fd5a457d"}, @@ -475,6 +501,7 @@ version = "3.12.2" description = "A platform independent file lock." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, @@ -490,6 +517,7 @@ version = "1.0.0" description = "Clean single-source support for Python 3 and 2" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["dev"] files = [ {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, @@ -501,6 +529,7 @@ version = "2.1.0" description = "Copy your docs directly to the gh-pages branch." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, @@ -518,6 +547,7 @@ version = "0.30.1" description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "griffe-0.30.1-py3-none-any.whl", hash = "sha256:b2f3df6952995a6bebe19f797189d67aba7c860755d3d21cc80f64d076d0154c"}, {file = "griffe-0.30.1.tar.gz", hash = "sha256:007cc11acd20becf1bb8f826419a52b9d403bbad9d8c8535699f5440ddc0a109"}, @@ -532,6 +562,7 @@ version = "0.22.0" description = "A comprehensive HTTP client library." optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +groups = ["dev"] files = [ {file = "httplib2-0.22.0-py3-none-any.whl", hash = "sha256:14ae0a53c1ba8f3d37e9e27cf37eabb0fb9980f435ba405d546948b009dd64dc"}, {file = "httplib2-0.22.0.tar.gz", hash = "sha256:d7a10bc5ef5ab08322488bde8c726eeee5c8618723fdb399597ec58f3d82df81"}, @@ -546,6 +577,7 @@ version = "3.10" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, @@ -560,10 +592,12 @@ version = "6.7.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5"}, {file = "importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4"}, ] +markers = {main = "extra == \"validate\" and python_version == \"3.9\"", dev = "python_version == \"3.9\""} [package.dependencies] zipp = ">=0.5" @@ -571,7 +605,7 @@ zipp = ">=0.5" [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3) ; python_version < \"3.9\"", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf (>=0.9.2)", "pytest-ruff"] [[package]] name = "iniconfig" @@ -579,6 +613,7 @@ version = "2.0.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, @@ -590,6 +625,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -607,6 +643,7 @@ version = "4.25.0" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, @@ -628,6 +665,7 @@ version = "2025.4.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, @@ -642,6 +680,7 @@ version = "2.8.0" description = "Manipulates JUnit/xUnit Result XML files" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "junitparser-2.8.0-py2.py3-none-any.whl", hash = "sha256:e1a7d41e0c92ca032c46eed07a6268c478f90ec1f411ea8a76b69f245e57cfb6"}, {file = "junitparser-2.8.0.tar.gz", hash = "sha256:a8d4290ab9fb93f2015e0dbef61ef93b7ea110e99099087a453f55c8e1481adf"}, @@ -656,6 +695,7 @@ version = "5.4.0" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c"}, {file = "lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7"}, @@ -790,6 +830,7 @@ files = [ {file = "lxml-5.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987"}, {file = "lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd"}, ] +markers = {main = "extra == \"validate\""} [package.extras] cssselect = ["cssselect (>=0.7)"] @@ -804,6 +845,8 @@ version = "1.2.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "Mako-1.2.4-py3-none-any.whl", hash = "sha256:c97c79c018b9165ac9922ae4f32da095ffd3c4e6872b45eded42926deea46818"}, {file = "Mako-1.2.4.tar.gz", hash = "sha256:d60a3903dc3bb01a18ad6a89cdbe2e4eadc69c0bc8ef1e3773ba53d44c3f7a34"}, @@ -823,10 +866,12 @@ version = "3.4.4" description = "Python implementation of John Gruber's Markdown." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "Markdown-3.4.4-py3-none-any.whl", hash = "sha256:a4c1b65c0957b4bd9e7d86ddc7b3c9868fb9670660f6f99f6d1bca8954d5a941"}, {file = "Markdown-3.4.4.tar.gz", hash = "sha256:225c6123522495d4119a90b3a3ba31a1e87a70369e03f14799ea9c0d7183a3d6"}, ] +markers = {main = "extra == \"validate\""} [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} @@ -841,6 +886,7 @@ version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, @@ -910,6 +956,7 @@ version = "1.3.4" description = "A deep merge function for 🐍." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, @@ -921,6 +968,7 @@ version = "1.6.1" description = "Project documentation with Markdown." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, @@ -944,7 +992,7 @@ watchdog = ">=2.0" [package.extras] i18n = ["babel (>=2.9.0)"] -min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4) ; platform_system == \"Windows\"", "ghp-import (==1.0)", "importlib-metadata (==4.4) ; python_version < \"3.10\"", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] [[package]] name = "mkdocs-autorefs" @@ -952,6 +1000,7 @@ version = "0.4.1" description = "Automatically link across pages in MkDocs." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "mkdocs-autorefs-0.4.1.tar.gz", hash = "sha256:70748a7bd025f9ecd6d6feeba8ba63f8e891a1af55f48e366d6d6e78493aba84"}, {file = "mkdocs_autorefs-0.4.1-py3-none-any.whl", hash = "sha256:a2248a9501b29dc0cc8ba4c09f4f47ff121945f6ce33d760f145d6f89d313f5b"}, @@ -967,6 +1016,7 @@ version = "0.2.0" description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, @@ -984,6 +1034,7 @@ version = "9.6.16" description = "Documentation that simply works" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material-9.6.16-py3-none-any.whl", hash = "sha256:8d1a1282b892fe1fdf77bfeb08c485ba3909dd743c9ba69a19a40f637c6ec18c"}, {file = "mkdocs_material-9.6.16.tar.gz", hash = "sha256:d07011df4a5c02ee0877496d9f1bfc986cfb93d964799b032dd99fe34c0e9d19"}, @@ -1013,6 +1064,7 @@ version = "1.3.1" description = "Extension pack for Python Markdown and MkDocs Material." optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, @@ -1024,6 +1076,7 @@ version = "2.3.6" description = "MkDocs plugin that combines all pages into one, allowing for easy export to PDF and standalone HTML." optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "mkdocs-print-site-plugin-2.3.6.tar.gz", hash = "sha256:82e5cabcfb7fe3074daecea018f28ccb4bff086f965e3103fe91019a76752f22"}, {file = "mkdocs_print_site_plugin-2.3.6-py3-none-any.whl", hash = "sha256:01ccb1ceccc87f29e1612bebb77c3bf9980809fbce750fc2113f9d6acea589d4"}, @@ -1038,6 +1091,7 @@ version = "0.22.0" description = "Automatic documentation from sources, for MkDocs." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "mkdocstrings-0.22.0-py3-none-any.whl", hash = "sha256:2d4095d461554ff6a778fdabdca3c00c468c2f1459d469f7a7f622a2b23212ba"}, {file = "mkdocstrings-0.22.0.tar.gz", hash = "sha256:82a33b94150ebb3d4b5c73bab4598c3e21468c79ec072eff6931c8f3bfc38256"}, @@ -1065,6 +1119,7 @@ version = "1.1.2" description = "A Python handler for mkdocstrings." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "mkdocstrings_python-1.1.2-py3-none-any.whl", hash = "sha256:c2b652a850fec8e85034a9cdb3b45f8ad1a558686edc20ed1f40b4e17e62070f"}, {file = "mkdocstrings_python-1.1.2.tar.gz", hash = "sha256:f28bdcacb9bcdb44b6942a5642c1ea8b36870614d33e29e3c923e204a8d8ed61"}, @@ -1080,6 +1135,7 @@ version = "3.141.4" description = "An updated EdgeDriver implementation for Selenium 3 with newly-added support for Microsoft Edge (Chromium)." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "msedge-selenium-tools-3.141.4.tar.gz", hash = "sha256:e1d397b2830c6c6f282cc0da2c6745631ab039c9dcd92dcf51b30f135c96caf2"}, {file = "msedge_selenium_tools-3.141.4-py3-none-any.whl", hash = "sha256:92583d2b14cedc557ac72fba5b47c71582f852e65c80352bfa47ea41b0cef6a0"}, @@ -1094,6 +1150,7 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" +groups = ["main", "dev"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, @@ -1105,6 +1162,8 @@ version = "23.0" description = "Core utilities for legacy Python packages" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "packaging_legacy-23.0-py3-none-any.whl", hash = "sha256:7013a4aec35163f76c1d7b55340b0602b2fbe6628b4bb0948ac71c607f454260"}, {file = "packaging_legacy-23.0.tar.gz", hash = "sha256:e1a20ece340845c11d384c27e456eaf76be05dbdb4073469019aabcbbd7b99de"}, @@ -1119,6 +1178,7 @@ version = "0.5.7" description = "Divides large result sets into pages for easier browsing" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, @@ -1134,6 +1194,8 @@ version = "0.3.1" description = "Your own expressive painter who colors text in your terminal." optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "painter-0.3.1.tar.gz", hash = "sha256:3373463d584ba9bbbb23d570c37893e7930b93704fe1149df88e9d2ef906fc88"}, ] @@ -1144,6 +1206,7 @@ version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, @@ -1155,6 +1218,7 @@ version = "4.0.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "platformdirs-4.0.0-py3-none-any.whl", hash = "sha256:118c954d7e949b35437270383a3f2531e99dd93cf7ce4dc8340d3356d30f173b"}, {file = "platformdirs-4.0.0.tar.gz", hash = "sha256:cb633b2bcf10c51af60beb0ab06d2f1d69064b43abf4c185ca6b28865f3f9731"}, @@ -1170,6 +1234,7 @@ version = "1.2.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, @@ -1185,6 +1250,7 @@ version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["dev"] files = [ {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, @@ -1196,13 +1262,14 @@ version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] -plugins = ["importlib-metadata"] +plugins = ["importlib-metadata ; python_version < \"3.8\""] windows-terminal = ["colorama (>=0.4.6)"] [[package]] @@ -1211,6 +1278,7 @@ version = "10.2.1" description = "Extension pack for Python Markdown." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pymdown_extensions-10.2.1-py3-none-any.whl", hash = "sha256:bded105eb8d93f88f2f821f00108cb70cef1269db6a40128c09c5f48bfc60ea4"}, {file = "pymdown_extensions-10.2.1.tar.gz", hash = "sha256:d0c534b4a5725a4be7ccef25d65a4c97dba58b54ad7c813babf0eb5ba9c81591"}, @@ -1229,6 +1297,7 @@ version = "3.1.4" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" +groups = ["dev"] files = [ {file = "pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c"}, {file = "pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032"}, @@ -1243,6 +1312,7 @@ version = "7.4.4" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, @@ -1265,6 +1335,7 @@ version = "6.2.1" description = "Pytest plugin for measuring coverage." optional = false python-versions = ">=3.9" +groups = ["dev"] files = [ {file = "pytest_cov-6.2.1-py3-none-any.whl", hash = "sha256:f5bc4c23f42f1cdd23c70b1dab1bbaef4fc505ba950d53e0081d0730dd7e86d5"}, {file = "pytest_cov-6.2.1.tar.gz", hash = "sha256:25cc6cc0a5358204b8108ecedc51a9b57b34cc6b8c967cc2c01a4e00d8a67da2"}, @@ -1284,6 +1355,7 @@ version = "3.2.0" description = "pytest plugin for generating HTML reports" optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "pytest-html-3.2.0.tar.gz", hash = "sha256:c4e2f4bb0bffc437f51ad2174a8a3e71df81bbc2f6894604e604af18fbe687c3"}, {file = "pytest_html-3.2.0-py3-none-any.whl", hash = "sha256:868c08564a68d8b2c26866f1e33178419bb35b1e127c33784a28622eb827f3f3"}, @@ -1300,6 +1372,7 @@ version = "3.0.0" description = "pytest plugin for test session metadata" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest_metadata-3.0.0-py3-none-any.whl", hash = "sha256:a17b1e40080401dc23177599208c52228df463db191c1a573ccdffacd885e190"}, {file = "pytest_metadata-3.0.0.tar.gz", hash = "sha256:769a9c65d2884bd583bc626b0ace77ad15dbe02dd91a9106d47fd46d9c2569ca"}, @@ -1317,6 +1390,7 @@ version = "0.6" description = "pytest plugin to run your tests in a specific order" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pytest-ordering-0.6.tar.gz", hash = "sha256:561ad653626bb171da78e682f6d39ac33bb13b3e272d406cd555adb6b006bda6"}, {file = "pytest_ordering-0.6-py2-none-any.whl", hash = "sha256:27fba3fc265f5d0f8597e7557885662c1bdc1969497cd58aff6ed21c3b617de2"}, @@ -1332,6 +1406,7 @@ version = "11.1.2" description = "pytest plugin to re-run tests to eliminate flaky failures" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-rerunfailures-11.1.2.tar.gz", hash = "sha256:55611661e873f1cafa384c82f08d07883954f4b76435f4b8a5b470c1954573de"}, {file = "pytest_rerunfailures-11.1.2-py3-none-any.whl", hash = "sha256:d21fe2e46d9774f8ad95f1aa799544ae95cac3a223477af94aa985adfae92b7e"}, @@ -1347,6 +1422,7 @@ version = "1.1.0" description = "A Pytest plugin for running a subset of your tests by splitting them in to equally sized groups. Forked from Mark Adams' original project pytest-test-groups." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "pytest-split-tests-1.1.0.tar.gz", hash = "sha256:e55bbf127d94ff913a248f32e64f07cd3201e8a82397e8152694e4ffe456e21c"}, {file = "pytest_split_tests-1.1.0-py2.py3-none-any.whl", hash = "sha256:21be7d6f95291002790fe24e28faa950059694e7abc430d4993d99a4c773bde4"}, @@ -1361,6 +1437,7 @@ version = "6.0.0" description = "A Dynamic test tool for Splunk Apps and Add-ons" optional = false python-versions = "<4.0,>=3.7" +groups = ["dev"] files = [ {file = "pytest_splunk_addon-6.0.0-py3-none-any.whl", hash = "sha256:599912bbb61e76219a8dc3267d8609f6dc4d8923babb6733e142442d3d2a1ff5"}, {file = "pytest_splunk_addon-6.0.0.tar.gz", hash = "sha256:1b478491e7d9eef689a93538a59428a5bed2471f11c71dc46a6df76be3a5e42e"}, @@ -1389,6 +1466,7 @@ version = "5.4.0" description = "Library to support testing Splunk Add-on UX" optional = false python-versions = "<4.0,>=3.7" +groups = ["dev"] files = [ {file = "pytest_splunk_addon_ui_smartx-5.4.0-py3-none-any.whl", hash = "sha256:3ee28ed654b6944548e71e5aa229f94efb472644f0022fb051a68978999a7152"}, {file = "pytest_splunk_addon_ui_smartx-5.4.0.tar.gz", hash = "sha256:583d4072b813affedd6752ce3a62cfe22a8f1b14f60b3b1c117e02d32b340188"}, @@ -1410,6 +1488,7 @@ version = "3.5.0" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, @@ -1430,10 +1509,12 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] +markers = {main = "extra == \"validate\""} [package.dependencies] six = ">=1.5" @@ -1444,6 +1525,7 @@ version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, @@ -1458,6 +1540,8 @@ version = "0.4.24" description = "File type identification using libmagic" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +groups = ["main"] +markers = "extra == \"validate\" and sys_platform != \"win32\"" files = [ {file = "python-magic-0.4.24.tar.gz", hash = "sha256:de800df9fb50f8ec5974761054a708af6e4246b03b4bdaee993f948947b0ebcf"}, {file = "python_magic-0.4.24-py2.py3-none-any.whl", hash = "sha256:4fec8ee805fea30c07afccd1592c0f17977089895bdfaae5fec870a84e997626"}, @@ -1469,6 +1553,8 @@ version = "0.4.14" description = "File type identification using libmagic binary package" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validate\" and sys_platform == \"win32\"" files = [ {file = "python_magic_bin-0.4.14-py2.py3-none-macosx_10_6_intel.whl", hash = "sha256:7b1743b3dbf16601d6eedf4e7c2c9a637901b0faaf24ad4df4d4527e7d8f66a4"}, {file = "python_magic_bin-0.4.14-py2.py3-none-win32.whl", hash = "sha256:34a788c03adde7608028203e2dbb208f1f62225ad91518787ae26d603ae68892"}, @@ -1481,6 +1567,8 @@ version = "310" description = "Python for Window Extensions" optional = true python-versions = "*" +groups = ["main"] +markers = "extra == \"validate\" and sys_platform == \"win32\"" files = [ {file = "pywin32-310-cp310-cp310-win32.whl", hash = "sha256:6dd97011efc8bf51d6793a82292419eba2c71cf8e7250cfac03bba284454abc1"}, {file = "pywin32-310-cp310-cp310-win_amd64.whl", hash = "sha256:c3e78706e4229b915a0821941a84e7ef420bf2b77e08c9dae3c76fd03fd2ae3d"}, @@ -1506,6 +1594,7 @@ version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" +groups = ["main", "dev"] files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, @@ -1566,6 +1655,7 @@ version = "0.1" description = "A custom YAML tag for referencing environment variables in YAML files. " optional = false python-versions = ">=3.6" +groups = ["dev"] files = [ {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, @@ -1580,6 +1670,7 @@ version = "0.36.2" description = "JSON Referencing + Python" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, @@ -1596,6 +1687,7 @@ version = "2.31.0" description = "Python HTTP for Humans." optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, @@ -1617,6 +1709,7 @@ version = "0.26.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false python-versions = ">=3.9" +groups = ["main", "dev"] files = [ {file = "rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37"}, {file = "rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0"}, @@ -1770,6 +1863,7 @@ version = "3.141.0" description = "Python bindings for Selenium" optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "selenium-3.141.0-py2.py3-none-any.whl", hash = "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c"}, {file = "selenium-3.141.0.tar.gz", hash = "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d"}, @@ -1784,6 +1878,8 @@ version = "3.0.4" description = "Python helper for Semantic Versioning (https://semver.org)" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"}, {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"}, @@ -1795,6 +1891,7 @@ version = "68.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f"}, {file = "setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235"}, @@ -1802,7 +1899,7 @@ files = [ [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov ; platform_python_implementation != \"PyPy\"", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\"", "pytest-perf", "pytest-ruff ; sys_platform != \"cygwin\"", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] @@ -1811,10 +1908,12 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main", "dev"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] +markers = {main = "extra == \"validate\""} [[package]] name = "soupsieve" @@ -1822,6 +1921,8 @@ version = "2.4.1" description = "A modern CSS selector implementation for Beautiful Soup." optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, @@ -1829,13 +1930,15 @@ files = [ [[package]] name = "splunk-appinspect" -version = "3.10.3" +version = "4.0.2" description = "Automatic validation checks for Splunk Apps" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"validate\"" files = [ - {file = "splunk_appinspect-3.10.3-py3-none-any.whl", hash = "sha256:2f44a59755564cf08de89844d9eca00d4ddd03026900da8b4a49430ccdb0605a"}, - {file = "splunk_appinspect-3.10.3.tar.gz", hash = "sha256:dc8d985cb0f11d2b6c7ce731a8d309644c081493bb026dc2ed28d9a3460c8861"}, + {file = "splunk_appinspect-4.0.2-py3-none-any.whl", hash = "sha256:669c36e822ac9b78cb3bd16d3c6d68317877d704907b0d1f31d90e0b2703441d"}, + {file = "splunk_appinspect-4.0.2.tar.gz", hash = "sha256:cdc0dfb123bb9bde2d85aecd5196ee48afa13dc030f13bd525a7656f97dc2f69"}, ] [package.dependencies] @@ -1844,7 +1947,7 @@ chardet = "3.0.4" click = ">=8.0.0" croniter = ">=0.3.34,<2.0.0" defusedxml = "0.7.1" -jinja2 = ">=2.11.3,<4.0.0" +jinja2 = ">=3.1.6,<4.0.0" lxml = ">=5.3.0,<6.0.0" mako = ">=1.0.12,<2.0.0" markdown = ">=3.1.1,<4.0.0" @@ -1863,6 +1966,7 @@ version = "2.1.0" description = "The Splunk Software Development Kit for Python." optional = false python-versions = "*" +groups = ["dev"] files = [ {file = "splunk-sdk-2.1.0.tar.gz", hash = "sha256:63f9a259a7c84d0c3b0b32cae652365b03f0f926acdb894b51456005df74ae21"}, ] @@ -1876,6 +1980,7 @@ version = "1.1.4" description = "Package to interact with Splunk" optional = false python-versions = ">=3.7,<4.0" +groups = ["dev"] files = [ {file = "splunksplwrapper-1.1.4-py3-none-any.whl", hash = "sha256:65d62fe00a89b0f0ef849f37b15db068d293ed2fc430a1b74ca8c9bc34436f67"}, {file = "splunksplwrapper-1.1.4.tar.gz", hash = "sha256:d8b319080b0260cc47723fe95afeddbdda35f6cb43fdb6249bbcb3c20c03aa77"}, @@ -1892,6 +1997,8 @@ version = "23.1.0" description = "Structured Logging for Python" optional = true python-versions = ">=3.7" +groups = ["main"] +markers = "extra == \"validate\"" files = [ {file = "structlog-23.1.0-py3-none-any.whl", hash = "sha256:79b9e68e48b54e373441e130fa447944e6f87a05b35de23138e475c05d0f7e0e"}, {file = "structlog-23.1.0.tar.gz", hash = "sha256:270d681dd7d163c11ba500bc914b2472d2b50a8ef00faa999ded5ff83a2f906b"}, @@ -1909,6 +2016,8 @@ version = "2.0.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.7" +groups = ["dev"] +markers = "python_full_version <= \"3.11.0a6\"" files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, @@ -1920,6 +2029,8 @@ version = "4.7.1" description = "Backported and Experimental Type Hints for Python 3.7+" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] +markers = "python_version < \"3.13\"" files = [ {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, @@ -1931,14 +2042,15 @@ version = "1.26.20" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +groups = ["dev"] files = [ {file = "urllib3-1.26.20-py2.py3-none-any.whl", hash = "sha256:0ed14ccfbf1c30a9072c7ca157e4319b70d65f623e91e7b32fadb2853431016e"}, {file = "urllib3-1.26.20.tar.gz", hash = "sha256:40c2dc0c681e47eb8f90e7e27bf6ff7df2e677421fd46756da1161c39ca70d32"}, ] [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +brotli = ["brotli (==1.0.9) ; os_name != \"nt\" and python_version < \"3\" and platform_python_implementation == \"CPython\"", "brotli (>=1.0.9) ; python_version >= \"3\" and platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; (os_name != \"nt\" or python_version >= \"3\") and platform_python_implementation != \"CPython\"", "brotlipy (>=0.6.0) ; os_name == \"nt\" and python_version < \"3\""] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress ; python_version == \"2.7\"", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] @@ -1947,6 +2059,7 @@ version = "3.0.0" description = "Filesystem events monitoring" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, @@ -1986,6 +2099,7 @@ version = "4.0.2" description = "Library provides the way to automatically manage drivers for different browsers" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "webdriver_manager-4.0.2-py2.py3-none-any.whl", hash = "sha256:75908d92ecc45ff2b9953614459c633db8f9aa1ff30181cefe8696e312908129"}, {file = "webdriver_manager-4.0.2.tar.gz", hash = "sha256:efedf428f92fd6d5c924a0d054e6d1322dd77aab790e834ee767af392b35590f"}, @@ -2002,6 +2116,7 @@ version = "2.7.0" description = "Creates diffs of XML files" optional = false python-versions = ">=3.8" +groups = ["dev"] files = [ {file = "xmldiff-2.7.0-py3-none-any.whl", hash = "sha256:c8020e6aa4aa9fa13c72e5bf0eeafd0be998b0ab55d78b008abc75fbfebaca27"}, {file = "xmldiff-2.7.0.tar.gz", hash = "sha256:c0910b1f800366dd7ec62923e5d06e8b06a1bd9120569a1c27f4f2446b9c68a2"}, @@ -2020,6 +2135,7 @@ version = "2.5.1" description = "An XML Schema validator and decoder" optional = false python-versions = ">=3.7" +groups = ["dev"] files = [ {file = "xmlschema-2.5.1-py3-none-any.whl", hash = "sha256:ec2b2a15c8896c1fcd14dcee34ca30032b99456c3c43ce793fdb9dca2fb4b869"}, {file = "xmlschema-2.5.1.tar.gz", hash = "sha256:4f7497de6c8b6dc2c28ad7b9ed6e21d186f4afe248a5bea4f54eedab4da44083"}, @@ -2039,6 +2155,7 @@ version = "0.13.0" description = "Makes working with XML feel like you are working with JSON" optional = false python-versions = ">=3.4" +groups = ["dev"] files = [ {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, @@ -2050,19 +2167,21 @@ version = "3.15.0" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.7" +groups = ["main", "dev"] files = [ {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] +markers = {main = "extra == \"validate\" and python_version == \"3.9\"", dev = "python_version == \"3.9\""} [package.extras] docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7) ; platform_python_implementation != \"PyPy\"", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8 ; python_version < \"3.12\"", "pytest-mypy (>=0.9.1) ; platform_python_implementation != \"PyPy\""] [extras] validate = ["splunk-appinspect"] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = ">=3.9,<3.14" -content-hash = "d4245077e2168fb46c22347d280c107a7a1a8987a7e73c37cb14ab19628839b9" +content-hash = "cc997d9a53e3fa73e7c8cee9c3d7a76b5d34c82d84756f94b3b8839cabd3d500" diff --git a/pyproject.toml b/pyproject.toml index 62a24f20b9..8c70e0e8e3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,6 +41,7 @@ classifiers = [ "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: 3.14", ] [tool.poetry.urls] @@ -49,14 +50,14 @@ classifiers = [ [tool.poetry.dependencies] python = ">=3.9,<3.14" jinja2 = ">=3.1.6,<4" -addonfactory-splunk-conf-parser-lib = "^0.4.3" +addonfactory-splunk-conf-parser-lib = "^1.0.0" dunamai = "^1.22.0" jsonschema = "^4.25.0" PyYAML = "^6.0" defusedxml = "^0.7.1" colorama = "^0.4.6" packaging = ">=25.0" -splunk-appinspect = { version = "^3.10.3", extras = ["validate"], optional = true } +splunk-appinspect = { version = "^4.0.0", extras = ["validate"], optional = true } certifi = "^2025.6.15" [tool.poetry.extras] diff --git a/renovate.json b/renovate.json index 6aa0e58ca0..556ff96ec1 100644 --- a/renovate.json +++ b/renovate.json @@ -115,6 +115,12 @@ "matchManagers": ["github-actions"], "enabled": false }, + { + "description": "Ignore updates for Python in GitHub Actions", + "matchPackageNames": ["python"], + "matchManagers": ["github-actions"], + "enabled": false + }, { "description": "react-router-dom throws not-dismissible warnings", "matchPackageNames": ["react-router-dom"], diff --git a/scripts/run_splunk.sh b/scripts/run_splunk.sh index c11fff2895..cbd38d4aea 100755 --- a/scripts/run_splunk.sh +++ b/scripts/run_splunk.sh @@ -33,6 +33,7 @@ docker run \ -e "SPLUNK_PASSWORD=Chang3d!" \ -e "SPLUNK_HEC_TOKEN=4a8a737d-5452-426c-a6f7-106dca4e813f" \ -e "SPLUNK_DISABLE_POPUPS=true" \ + -e "SPLUNK_GENERAL_TERMS=--accept-sgt-current-at-splunk-com" \ -d \ --pull=always \ --name splunk splunk/splunk:${1:-"latest"} diff --git a/splunk_add_on_ucc_framework/commands/build.py b/splunk_add_on_ucc_framework/commands/build.py index abd6010b9f..a8e87d18fd 100644 --- a/splunk_add_on_ucc_framework/commands/build.py +++ b/splunk_add_on_ucc_framework/commands/build.py @@ -248,13 +248,18 @@ def _get_addon_version(addon_version: Optional[str]) -> str: return addon_version.strip() -def _get_build_output_path(output_directory: Optional[str] = None) -> str: +def _get_build_output_path( + output_directory: Optional[str] = None, overwrite: bool = False +) -> tuple[str, bool]: if output_directory is None: - return os.path.join(os.getcwd(), "output") + # To preserve the previous behaviour where we used to clean output dir + # when output_directory was set to None + overwrite = True + return os.path.join(os.getcwd(), "output"), overwrite else: if not os.path.isabs(output_directory): - return os.path.join(os.getcwd(), output_directory) - return output_directory + return os.path.join(os.getcwd(), output_directory), overwrite + return os.path.join(output_directory), overwrite def _get_python_version_from_executable(python_binary_name: str) -> str: @@ -484,6 +489,7 @@ def generate( pip_legacy_resolver: bool = False, pip_custom_flag: Optional[str] = None, build_custom_ui: bool = False, + overwrite: bool = False, ) -> None: logger.info(f"ucc-gen version {__version__} is used") logger.info(f"Python binary name to use: {python_binary_name}") @@ -495,9 +501,6 @@ def generate( f"Failed to identify Python version for library installation. Error: {e}" ) sys.exit(1) - - output_directory = _get_build_output_path(output_directory) - logger.info(f"Output folder is {output_directory}") addon_version = _get_addon_version(addon_version) logger.info(f"Add-on will be built with version '{addon_version}'") if not os.path.exists(source): @@ -505,11 +508,20 @@ def generate( f"Source directory: '{source}' does not exist. Please verify that given source exists." ) sys.exit(1) - shutil.rmtree(os.path.join(output_directory), ignore_errors=True) - os.makedirs(os.path.join(output_directory)) - logger.info(f"Cleaned out directory {output_directory}") app_manifest = get_app_manifest(source) ta_name = app_manifest.get_addon_name() + output_directory, overwrite = _get_build_output_path(output_directory, overwrite) + logger.info(f"Output folder is {output_directory}") + if not overwrite and os.path.exists(os.path.join(output_directory, ta_name)): + logger.error( + f"The location {os.path.join(output_directory,ta_name)} is already taken, use `--overwrite` " + "option to overwrite the content of existing directory." + ) + sys.exit(1) + if overwrite: + shutil.rmtree(os.path.join(output_directory, ta_name), ignore_errors=True) + os.makedirs(os.path.join(output_directory, ta_name)) + logger.info(f"Cleaned out directory {os.path.join(output_directory,ta_name)}") generated_files = [] gc_path = _get_and_check_global_config_path(source, config_path) diff --git a/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action.py.template b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action.py.template index 2875af77a3..9bbf5cf18b 100644 --- a/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action.py.template +++ b/splunk_add_on_ucc_framework/commands/modular_alert_builder/arf_template/alert_action.py.template @@ -37,13 +37,10 @@ class AlertActionWorker{{ mod_alert.short_name }}(ModularAlertBase): if not self.validate_params(): return 3 status = {{ custom_logic_handler or helper_name }}.process_event(self, *args, **kwargs) - except (AttributeError, TypeError) as ae: - self.log_error("Error: {}. Please double check spelling and also verify that a compatible version of Splunk_SA_CIM is installed.".format(str(ae)))#ae.message replaced with str(ae) - return 4 except Exception as e: msg = "Unexpected error: {}." if str(e): - self.log_error(msg.format(str(e)))#e.message replaced with str(ae) + self.log_error(msg.format(str(e))) else: import traceback self.log_error(msg.format(traceback.format_exc())) diff --git a/splunk_add_on_ucc_framework/commands/validate.py b/splunk_add_on_ucc_framework/commands/validate.py index 999bdb39c2..4d04613dc3 100644 --- a/splunk_add_on_ucc_framework/commands/validate.py +++ b/splunk_add_on_ucc_framework/commands/validate.py @@ -19,6 +19,7 @@ logger = logging.getLogger("ucc_gen") +# Tested in the CI during the build process of test add-on. def validate(file_path: str) -> None: try: from splunk_appinspect import main diff --git a/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py b/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py index a37accde1c..b5723b3d3b 100644 --- a/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py +++ b/splunk_add_on_ucc_framework/generators/conf_files/create_alert_actions_conf.py @@ -69,6 +69,7 @@ def __init__( self.alerts: dict[str, Any] = {} self.alerts_spec: dict[str, Any] = {} + self.supportedPythonVersion = None for alert in self._alert_settings: alert_name = alert["short_name"] @@ -128,6 +129,11 @@ def __init__( elif k not in deny_list: value = f"{str(k).strip()} = {str(v).strip()}" self.alerts[alert_name].append(value) + if self.alerts or self.alerts_spec: + self.supportedPythonVersion = ( + ", ".join(self._global_config.meta.get("supportedPythonVersion", [])) + or None + ) def generate(self) -> Optional[list[dict[str, str]]]: conf_files: list[dict[str, str]] = [] @@ -147,7 +153,9 @@ def generate_conf(self) -> Optional[dict[str, str]]: self.set_template_and_render( template_file_path=["conf_files"], file_name="alert_actions_conf.template" ) - rendered_content = self._template.render(alerts=self.alerts) + rendered_content = self._template.render( + alerts=self.alerts, supportedPythonVersion=self.supportedPythonVersion + ) return { "file_name": self.conf_file, "file_path": file_path, @@ -163,7 +171,9 @@ def generate_conf_spec(self) -> Optional[dict[str, str]]: template_file_path=["README"], file_name="alert_actions_conf_spec.template", ) - rendered_content = self._template.render(alerts=self.alerts_spec) + rendered_content = self._template.render( + alerts=self.alerts_spec, supportedPythonVersion=self.supportedPythonVersion + ) return { "file_name": self.conf_spec_file, "file_path": file_path, diff --git a/splunk_add_on_ucc_framework/generators/conf_files/create_commands_conf.py b/splunk_add_on_ucc_framework/generators/conf_files/create_commands_conf.py index 5f307f00c2..8d4bfd9f86 100644 --- a/splunk_add_on_ucc_framework/generators/conf_files/create_commands_conf.py +++ b/splunk_add_on_ucc_framework/generators/conf_files/create_commands_conf.py @@ -29,26 +29,54 @@ def __init__( ) -> None: super().__init__(global_config, input_dir, output_dir) self.conf_file = "commands.conf" + self.conf_spec_file = "commands.conf.spec" + self.supportedPythonVersion = None if global_config.has_custom_search_commands(): self.command_names = [] for command in global_config.custom_search_commands: self.command_names.append(command["commandName"]) + supported_versions = self._global_config.meta.get("supportedPythonVersion") + if supported_versions: + self.supportedPythonVersion = ", ".join(supported_versions) - def generate(self) -> Optional[list[dict[str, str]]]: - if not self._global_config.has_custom_search_commands(): - return None - + def generate_conf(self) -> dict[str, str]: file_path = self.get_file_output_path(["default", self.conf_file]) self.set_template_and_render( template_file_path=["conf_files"], file_name="commands_conf.template" ) rendered_content = self._template.render( command_names=self.command_names, + supportedPythonVersion=self.supportedPythonVersion, ) - return [ - { - "file_name": self.conf_file, + return { + "file_name": self.conf_file, + "file_path": file_path, + "content": rendered_content, + } + + def generate_conf_spec(self) -> Optional[dict[str, str]]: + if self.supportedPythonVersion: + file_path = self.get_file_output_path(["README", self.conf_spec_file]) + self.set_template_and_render( + template_file_path=["README"], file_name="commands_conf_spec.template" + ) + rendered_content = self._template.render() + return { + "file_name": self.conf_spec_file, "file_path": file_path, "content": rendered_content, } - ] + return None + + def generate(self) -> Optional[list[dict[str, str]]]: + if not self._global_config.has_custom_search_commands(): + return None + + conf_files: list[dict[str, str]] = [] + conf = self.generate_conf() + conf_spec = self.generate_conf_spec() + if conf is not None: + conf_files.append(conf) + if conf_spec is not None: + conf_files.append(conf_spec) + return conf_files diff --git a/splunk_add_on_ucc_framework/generators/conf_files/create_inputs_conf.py b/splunk_add_on_ucc_framework/generators/conf_files/create_inputs_conf.py index a68bf12442..12af5e4195 100644 --- a/splunk_add_on_ucc_framework/generators/conf_files/create_inputs_conf.py +++ b/splunk_add_on_ucc_framework/generators/conf_files/create_inputs_conf.py @@ -97,6 +97,12 @@ def __init__( prop = f"{field_name} = {field_value}".rstrip() spec_properties.append(prop) + if self.inputs_conf_spec or self.inputs_conf_names: + self.supportedPythonVersion = ( + ", ".join(self._global_config.meta.get("supportedPythonVersion", [])) + or None + ) + def _conf_file_name(self, conf_name: str) -> str: return f"{conf_name}.conf" @@ -125,6 +131,7 @@ def generate_conf(self) -> Optional[dict[str, str]]: rendered_content = self._template.render( input_names=self.inputs_conf_names, default_values=self.inputs_conf_params, + supportedPythonVersion=self.supportedPythonVersion, ) return { "file_name": self.conf_file, @@ -146,6 +153,7 @@ def _generate_spec_inputs(self) -> Optional[dict[str, str]]: rendered_content = self._template.render( input_names=self.inputs_conf_names, input_stanzas=self.inputs_conf_spec, + supportedPythonVersion=self.supportedPythonVersion, ) return { "file_name": spec_file, diff --git a/splunk_add_on_ucc_framework/generators/conf_files/create_restmap_conf.py b/splunk_add_on_ucc_framework/generators/conf_files/create_restmap_conf.py index 794672ad26..1ea8180700 100644 --- a/splunk_add_on_ucc_framework/generators/conf_files/create_restmap_conf.py +++ b/splunk_add_on_ucc_framework/generators/conf_files/create_restmap_conf.py @@ -36,6 +36,9 @@ def __init__( ) -> None: super().__init__(global_config, input_dir, output_dir) self.conf_file = "restmap.conf" + self.conf_spec_file = "restmap.conf.spec" + self.supportedPythonVersion = None + supported_versions = self._global_config.meta.get("supportedPythonVersion") self.endpoints: list[Union[RestEndpointBuilder, EndpointRegistrationEntry]] = [] self.configuration_endpoints: list[ Union[RestEndpointBuilder, EndpointRegistrationEntry] @@ -64,11 +67,24 @@ def __init__( self.endpoints.extend(self.configuration_endpoints) self.endpoints.extend(self.inputs_endpoints) self.endpoints.extend(self.custom_endpoints) + if supported_versions: + self.supportedPythonVersion = ", ".join(supported_versions) - def generate(self) -> Optional[list[dict[str, str]]]: - if not self.endpoints: - return None + def generate_conf_spec(self) -> Optional[dict[str, str]]: + if self.supportedPythonVersion: + file_path = self.get_file_output_path(["README", self.conf_spec_file]) + self.set_template_and_render( + template_file_path=["README"], file_name="restmap_conf_spec.template" + ) + rendered_content = self._template.render() + return { + "file_name": self.conf_spec_file, + "file_path": file_path, + "content": rendered_content, + } + return None + def generate_conf(self) -> dict[str, str]: file_path = self.get_file_output_path(["default", self.conf_file]) self.set_template_and_render( template_file_path=["conf_files"], file_name="restmap_conf.template" @@ -83,11 +99,23 @@ def generate(self) -> Optional[list[dict[str, str]]]: configuration_capability=self._global_config.capabilities(config=True), input_capability=self._global_config.capabilities(inputs=True), custom_endpoints=self.custom_endpoints, + supportedPythonVersion=self.supportedPythonVersion, ) - return [ - { - "file_name": self.conf_file, - "file_path": file_path, - "content": rendered_content, - } - ] + return { + "file_name": self.conf_file, + "file_path": file_path, + "content": rendered_content, + } + + def generate(self) -> Optional[list[dict[str, str]]]: + if not self.endpoints: + return None + + conf_files: list[dict[str, str]] = [] + conf = self.generate_conf() + conf_spec = self.generate_conf_spec() + if conf is not None: + conf_files.append(conf) + if conf_spec is not None: + conf_files.append(conf_spec) + return conf_files diff --git a/splunk_add_on_ucc_framework/global_config_validator.py b/splunk_add_on_ucc_framework/global_config_validator.py index 6b5d8373ab..bbbee491f0 100644 --- a/splunk_add_on_ucc_framework/global_config_validator.py +++ b/splunk_add_on_ucc_framework/global_config_validator.py @@ -37,6 +37,7 @@ "index", "helpLink", "checkbox", + "date", "interval", "custom", } diff --git a/splunk_add_on_ucc_framework/main.py b/splunk_add_on_ucc_framework/main.py index 4018be446b..8d34ef1782 100644 --- a/splunk_add_on_ucc_framework/main.py +++ b/splunk_add_on_ucc_framework/main.py @@ -147,6 +147,12 @@ def main(argv: Optional[Sequence[str]] = None) -> int: default=False, required=False, ) + build_parser.add_argument( + "--overwrite", + action="store_true", + default=False, + help="overwrite already present output/add-on dir", + ) package_parser = subparsers.add_parser("package", description="Package an add-on") package_parser.add_argument( @@ -304,6 +310,7 @@ def main(argv: Optional[Sequence[str]] = None) -> int: pip_legacy_resolver=args.pip_legacy_resolver, pip_custom_flag=args.pip_custom_flag, build_custom_ui=args.build_custom_ui, + overwrite=args.overwrite, ) if args.command == "package": package.package(path_to_built_addon=args.path, output_directory=args.output) diff --git a/splunk_add_on_ucc_framework/package/appserver/templates/base.html b/splunk_add_on_ucc_framework/package/appserver/templates/base.html index c8f38948ac..9c0ba1d1d7 100644 --- a/splunk_add_on_ucc_framework/package/appserver/templates/base.html +++ b/splunk_add_on_ucc_framework/package/appserver/templates/base.html @@ -14,7 +14,11 @@ ~ limitations under the License. ~ --> -<%! app_name = cherrypy.request.path_info.split('/')[3] %>\ +<%! +from splunk.appserver.mrsparkle.lib import util + +app_name = cherrypy.request.path_info.split('/')[3] +%>\ @@ -22,6 +26,7 @@ ${_('Loading')} + diff --git a/splunk_add_on_ucc_framework/schema/schema.json b/splunk_add_on_ucc_framework/schema/schema.json index 4b71319e1a..6e17fa0893 100644 --- a/splunk_add_on_ucc_framework/schema/schema.json +++ b/splunk_add_on_ucc_framework/schema/schema.json @@ -1872,6 +1872,73 @@ ], "additionalProperties": false }, + "DateEntity": { + "type": "object", + "properties": { + "type": { + "const": "date", + "type": "string", + "description": "Exactly: date" + }, + "field": { + "$ref": "#/definitions/Field" + }, + "label": { + "$ref": "#/definitions/entityLabel" + }, + "defaultValue": { + "type": "string", + "description": "The initial input value." + }, + "help": { + "$ref": "#/definitions/help" + }, + "tooltip": { + "$ref": "#/definitions/tooltip" + }, + "required": { + "$ref": "#/definitions/required" + }, + "encrypted": { + "$ref": "#/definitions/encrypted" + }, + "options": { + "type": "object", + "description": "To specify an additional attribute for a particular type of entity, such as items for a radio bar.", + "properties": { + "display": { + "$ref": "#/definitions/display" + }, + "disableonEdit": { + "$ref": "#/definitions/disableonEdit" + }, + "enable": { + "$ref": "#/definitions/enable" + }, + "requiredWhenVisible": { + "$ref": "#/definitions/requiredWhenVisible" + }, + "hideForPlatform": { + "$ref": "#/definitions/HideForPlatform" + }, + "locale": { + "type": "string", + "description": "Locale set by language and localization specifiers. Default: 'en_US', some other examples 'en-GB', 'fr-FR', 'zh-CN', 'ja-JP', 'es-ES'" + } + }, + "additionalProperties": false + }, + "modifyFieldsOnValue": { + "$ref": "#/definitions/modifyFieldsOnValue" + } + }, + "required": [ + "field", + "label", + "type" + ], + "additionalProperties": false + }, "FileEntity": { "type": "object", "properties": { @@ -2290,6 +2357,9 @@ { "$ref": "#/definitions/CheckboxEntity" }, + { + "$ref": "#/definitions/DateEntity" + }, { "$ref": "#/definitions/RadioEntity" }, @@ -2606,6 +2676,13 @@ "type": "boolean", "default": true, "description": "Ability to show the footer component on every page of add-on" + }, + "supportedPythonVersion":{ + "description": "This feature allows you to specify which python version your app would use.", + "type": "array", + "items": { + "type": "string" + } } }, "required": [ @@ -2723,6 +2800,9 @@ { "$ref": "#/definitions/CheckboxEntity" }, + { + "$ref": "#/definitions/DateEntity" + }, { "$ref": "#/definitions/RadioEntity" }, diff --git a/splunk_add_on_ucc_framework/templates/README/alert_actions_conf_spec.template b/splunk_add_on_ucc_framework/templates/README/alert_actions_conf_spec.template index e2d64d50e8..753b29d3f7 100644 --- a/splunk_add_on_ucc_framework/templates/README/alert_actions_conf_spec.template +++ b/splunk_add_on_ucc_framework/templates/README/alert_actions_conf_spec.template @@ -3,4 +3,12 @@ {% for param in params %} {{ param }} {% endfor %} +{% if supportedPythonVersion %} +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set +{% endif %} {% endfor %} diff --git a/splunk_add_on_ucc_framework/templates/README/commands_conf_spec.template b/splunk_add_on_ucc_framework/templates/README/commands_conf_spec.template new file mode 100644 index 0000000000..814528a9c2 --- /dev/null +++ b/splunk_add_on_ucc_framework/templates/README/commands_conf_spec.template @@ -0,0 +1,7 @@ +[default] +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set \ No newline at end of file diff --git a/splunk_add_on_ucc_framework/templates/README/inputs_conf_spec.template b/splunk_add_on_ucc_framework/templates/README/inputs_conf_spec.template index a1d254a83d..b334256120 100644 --- a/splunk_add_on_ucc_framework/templates/README/inputs_conf_spec.template +++ b/splunk_add_on_ucc_framework/templates/README/inputs_conf_spec.template @@ -1,4 +1,12 @@ {% for name, properties in input_stanzas.items() %} {{ "[" ~ name | join("") ~ "://]" }} {{ properties | sort() | join("\n") }} +{% if supportedPythonVersion %} +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set +{% endif %} {% endfor %} diff --git a/splunk_add_on_ucc_framework/templates/README/restmap_conf_spec.template b/splunk_add_on_ucc_framework/templates/README/restmap_conf_spec.template new file mode 100644 index 0000000000..f621f436d3 --- /dev/null +++ b/splunk_add_on_ucc_framework/templates/README/restmap_conf_spec.template @@ -0,0 +1,7 @@ +[admin_external:] +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set \ No newline at end of file diff --git a/splunk_add_on_ucc_framework/templates/conf_files/alert_actions_conf.template b/splunk_add_on_ucc_framework/templates/conf_files/alert_actions_conf.template index fa5db5a83e..74eb745245 100644 --- a/splunk_add_on_ucc_framework/templates/conf_files/alert_actions_conf.template +++ b/splunk_add_on_ucc_framework/templates/conf_files/alert_actions_conf.template @@ -4,6 +4,9 @@ {{ param }} {% endfor %} python.version = python3 +{% if supportedPythonVersion %} +python.required = {{supportedPythonVersion}} +{% endif %} is_custom = 1 payload_format = json {% endfor %} diff --git a/splunk_add_on_ucc_framework/templates/conf_files/commands_conf.template b/splunk_add_on_ucc_framework/templates/conf_files/commands_conf.template index 1aa32b9aa1..1f6a1c4939 100644 --- a/splunk_add_on_ucc_framework/templates/conf_files/commands_conf.template +++ b/splunk_add_on_ucc_framework/templates/conf_files/commands_conf.template @@ -3,4 +3,7 @@ filename = {{name}}.py chunked = true python.version = python3 +{% if supportedPythonVersion %} +python.required = {{supportedPythonVersion}} +{% endif %} {% endfor -%} \ No newline at end of file diff --git a/splunk_add_on_ucc_framework/templates/conf_files/inputs_conf.template b/splunk_add_on_ucc_framework/templates/conf_files/inputs_conf.template index 671094e2f5..836b480df5 100644 --- a/splunk_add_on_ucc_framework/templates/conf_files/inputs_conf.template +++ b/splunk_add_on_ucc_framework/templates/conf_files/inputs_conf.template @@ -1,6 +1,9 @@ {% for input_name in input_names %} {{ "[" ~ input_name ~ "]"}} python.version = python3 +{% if supportedPythonVersion %} +python.required = {{supportedPythonVersion}} +{% endif %} {% for item, value in default_values.get(input_name, {}).items() %} {{item}} = {{value}} {% endfor %} diff --git a/splunk_add_on_ucc_framework/templates/conf_files/restmap_conf.template b/splunk_add_on_ucc_framework/templates/conf_files/restmap_conf.template index 9d999b2668..bd05a1ad5a 100644 --- a/splunk_add_on_ucc_framework/templates/conf_files/restmap_conf.template +++ b/splunk_add_on_ucc_framework/templates/conf_files/restmap_conf.template @@ -33,6 +33,9 @@ capability.{{key}} = {{value}} [admin_external:{{ endpoint.name }}] handlertype = python python.version = python3 +{% if supportedPythonVersion %} +python.required = {{supportedPythonVersion}} +{% endif %} handlerfile = {{ endpoint.rh_name }}.py handleractions = {{ endpoint.actions() | join(', ') }} handlerpersistentmode = true diff --git a/tests/smoke/test_ucc_build.py b/tests/smoke/test_ucc_build.py index 94d199ba61..0810fa18a6 100644 --- a/tests/smoke/test_ucc_build.py +++ b/tests/smoke/test_ucc_build.py @@ -8,6 +8,8 @@ from os import path from pathlib import Path from typing import Any +import subprocess +import shutil from splunk_add_on_ucc_framework.entity.interval_entity import CRON_REGEX from tests.smoke import helpers @@ -148,6 +150,7 @@ def test_ucc_generate_with_everything(caplog): ("appserver", "static", "test icon.png"), ("appserver", "static", "alerticon.png"), ("appserver", "static", "js", "build", "custom", "custom_tab.js"), + ("appserver", "templates", "base.html"), ("default", "alert_actions.conf"), ("default", "eventtypes.conf"), ("default", "inputs.conf"), @@ -197,6 +200,8 @@ def test_ucc_generate_with_everything(caplog): ("bin", "splunk_ta_uccexample", "modalert_test_alert_default_helper.py"), ("README", "alert_actions.conf.spec"), ("README", "inputs.conf.spec"), + ("README", "restmap.conf.spec"), + ("README", "commands.conf.spec"), ("README", "some_conf.conf.spec"), ("README", "splunk_ta_uccexample_account.conf.spec"), ("README", "splunk_ta_uccexample_settings.conf.spec"), @@ -740,6 +745,76 @@ def test_ucc_dashboard_js_copying(config, expected_file_count): ) +def test_check_ucc_ui_files(tmp_path): + if path.exists(path.join(os.getcwd(), "dist")): + shutil.rmtree(path.join(os.getcwd(), "dist")) + subprocess.run(["poetry", "build"], capture_output=True, text=True) + dist_folder = path.join(tmp_path, "dist") + + # Set the path to dist directory in current working directory + dist_dir = Path(path.join(os.getcwd(), "dist")) + + # Get .whl file in that directory + whl_file = next(dist_dir.glob("*.whl")) + whl_file_path = path.join(dist_folder, whl_file) + subprocess.run( + ["pip", "install", whl_file_path, "--target", dist_folder], + capture_output=True, + text=True, + ) + + # Run the command to store all UI files + result = subprocess.run( + [ + "ls", + "-a", + f"{dist_folder}/splunk_add_on_ucc_framework/package/appserver/static/js/build", + ], + capture_output=True, + text=True, + ) + file_list = result.stdout.strip().split("\n") + + # Remove '.' and '..' + cleaned_files = file_list[2:] + + def remove_hash(filename): + if filename.endswith(".js"): + return re.sub(r"\.[a-zA-Z0-9_-]+(?=\.js$)", "", filename) + return filename + + # Create new list with hash removed + normalized_files = [remove_hash(f) for f in cleaned_files] + + expected_js_files_list = [ + "ArrowBroadUnderbarDown.js", + "assets", + "ConfigurationPage.js", + "Dashboard.consts.js", + "Dashboard.Custom.js", + "Dashboard.DashboardPage.js", + "Dashboard.DataIngestion.js", + "Dashboard.EnterpriseViewOnlyPreset.js", + "Dashboard.Error.js", + "Dashboard.Overview.js", + "Dashboard.Resource.js", + "Dashboard.utils.js", + "entry_page.js", + "ErrorBoundary.js", + "html2canvas.esm.js", + "index.es.js", + "InputPage.js", + "licenses.txt", + "Menu.js", + "purify.es.js", + "redirect_page.js", + "Search.js", + "Search.js", + "usePlatform.js", + ] + assert sorted(normalized_files) == sorted(expected_js_files_list) + + def test_ucc_generate_with_all_alert_types(tmp_path, caplog): package_folder = path.join( path.dirname(path.realpath(__file__)), diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect.expect.yaml b/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect.expect.yaml index 39837449af..eda51bd325 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect.expect.yaml +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/.appinspect.expect.yaml @@ -1,4 +1,4 @@ check_that_extracted_splunk_app_does_not_contain_prohibited_directories_or_files: - comment: 'Y' + comment: 'ADDON-12345: Y' check_that_splunk_app_package_does_not_contain_files_outside_of_app: - comment: 'Y' + comment: 'ADDON-12345: Y' diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/alert_actions.conf.spec b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/alert_actions.conf.spec index f8c58c5cd8..04a5538951 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/alert_actions.conf.spec +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/alert_actions.conf.spec @@ -6,7 +6,19 @@ param.all_incidents = All Incidents. param.table_list = Table List. It's default value is problem. param.action = Action:. It's a required parameter. It's default value is update. param.account = Select Account. It's a required parameter. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [test_alert_default] param._cam = Adaptive Response parameters. param.name = Name. It's a required parameter. It's default value is xyz. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/commands.conf.spec b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/commands.conf.spec new file mode 100644 index 0000000000..814528a9c2 --- /dev/null +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/commands.conf.spec @@ -0,0 +1,7 @@ +[default] +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set \ No newline at end of file diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/inputs.conf.spec b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/inputs.conf.spec index 14b7550bee..a281fb3854 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/inputs.conf.spec +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/inputs.conf.spec @@ -17,11 +17,19 @@ order_by = The datetime field by which to query results in ascending order for i singleSelectTest = start_date = The datetime after which to query and index records, in this format: "YYYY-MM-DDThh:mm:ss.000z". Defaults to 90 days earlier from now. use_existing_checkpoint = Data input already exists. Select `No` if you want to reset the data collection. (Default: yes) +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [example_input_two://] account = apis = +example_date_field = This is an example date field (Default: 2025-05-20) example_help_link = +example_second_date_field = This is an example date field (Default: 2025-05-20) hard_disabled = hide_in_ui = index = An index is a type of data repository. Select the index in which you want to collect the events. (Default: default) @@ -33,29 +41,83 @@ input_two_text_hidden_for_enterprise = Should be hidden for enterprise interval = Time interval of the data input, in seconds. start_date = The date and time, in "YYYY-MM-DDThh:mm:ss.000z" format, after which to query and index records. The default is 90 days before today. use_existing_checkpoint = Data input already exists. Select `No` if you want to reset the data collection. (Default: yes) +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [example_input_three://] event_filters = interval = Time interval of the data input, in seconds. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [example_input_four://] interval = Time interval of the data input, in seconds. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [service_hidden_for_cloud://] interval = Time interval of the data input, in seconds. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [service_hidden_for_enterprise://] interval = Time interval of the data input, in seconds. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [service_inside_menu_one://] interval = Time interval of the data input, in seconds. text_with_validators = +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [service_inside_menu_two://] interval = Time interval of the data input, in seconds. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [service_inside_menu_three://] interval = Time interval of the data input, in seconds. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set [service_inside_menu_four://] interval = Time interval of the data input, in seconds. +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/restmap.conf.spec b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/restmap.conf.spec new file mode 100644 index 0000000000..f621f436d3 --- /dev/null +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/restmap.conf.spec @@ -0,0 +1,7 @@ +[admin_external:] +python.required = {3.7|3.9|3.13} +* For Python scripts only, selects which Python version to use. +* Set to "3.9" to use the Python 3.9 version. +* Set to "3.13" to use the Python 3.13 version. +* Optional. +* Default: not set \ No newline at end of file diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/templates/base.html b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/templates/base.html index 480c171fe4..9c0ba1d1d7 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/templates/base.html +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/templates/base.html @@ -1,5 +1,5 @@ -<%! app_name = cherrypy.request.path_info.split('/')[3] %>\ +<%! +from splunk.appserver.mrsparkle.lib import util + +app_name = cherrypy.request.path_info.split('/')[3] +%>\ @@ -22,7 +26,9 @@ ${_('Loading')} + + @@ -35,6 +41,6 @@ <% page_path = "/static/app/" + app_name + "/js/build/entry_page.js" %> - + diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/example_input_two.py b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/example_input_two.py index 503f51e85c..f3ba709972 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/example_input_two.py +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/example_input_two.py @@ -37,6 +37,18 @@ def get_scheme(self): required_on_create=False, ) ) + scheme.add_argument( + smi.Argument( + 'example_date_field', + required_on_create=True, + ) + ) + scheme.add_argument( + smi.Argument( + 'example_second_date_field', + required_on_create=True, + ) + ) scheme.add_argument( smi.Argument( 'input_two_text_hidden_for_enterprise', diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py index 80115f3948..2c0bed743a 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py @@ -71,6 +71,20 @@ default=None, validator=None ), + field.RestField( + 'example_date_field', + required=True, + encrypted=False, + default='2025-05-20', + validator=None + ), + field.RestField( + 'example_second_date_field', + required=True, + encrypted=False, + default='2025-05-20', + validator=None + ), field.RestField( 'input_two_text_hidden_for_enterprise', required=False, diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert.py b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert.py index a0db490eed..b228a62dde 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert.py +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert.py @@ -19,7 +19,7 @@ def validate_params(self): if not self.get_param("name"): self.log_error('name is a mandatory parameter, but its value is None.') return False - + if not self.get_param("description"): self.log_error('description is a mandatory parameter, but its value is None.') return False @@ -39,13 +39,10 @@ def process_event(self, *args, **kwargs): if not self.validate_params(): return 3 status = myAlertLogic.process_event(self, *args, **kwargs) - except (AttributeError, TypeError) as ae: - self.log_error("Error: {}. Please double check spelling and also verify that a compatible version of Splunk_SA_CIM is installed.".format(str(ae)))#ae.message replaced with str(ae) - return 4 except Exception as e: msg = "Unexpected error: {}." if str(e): - self.log_error(msg.format(str(e)))#e.message replaced with str(ae) + self.log_error(msg.format(str(e))) else: import traceback self.log_error(msg.format(traceback.format_exc())) diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert_default.py b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert_default.py index b79ad07e1b..0a8950d9dc 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert_default.py +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/test_alert_default.py @@ -27,13 +27,10 @@ def process_event(self, *args, **kwargs): if not self.validate_params(): return 3 status = modalert_test_alert_default_helper.process_event(self, *args, **kwargs) - except (AttributeError, TypeError) as ae: - self.log_error("Error: {}. Please double check spelling and also verify that a compatible version of Splunk_SA_CIM is installed.".format(str(ae)))#ae.message replaced with str(ae) - return 4 except Exception as e: msg = "Unexpected error: {}." if str(e): - self.log_error(msg.format(str(e)))#e.message replaced with str(ae) + self.log_error(msg.format(str(e))) else: import traceback self.log_error(msg.format(traceback.format_exc())) diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/alert_actions.conf b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/alert_actions.conf index 85e18068a5..16211a28e8 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/alert_actions.conf +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/alert_actions.conf @@ -10,6 +10,7 @@ param.table_list = problem param.action = update param.account = python.version = python3 +python.required = 3.7, 3.13 is_custom = 1 payload_format = json @@ -20,5 +21,6 @@ description = Description for test Alert Action param._cam = {"task": ["Create"], "subject": ["endpoint"], "category": ["Information Portrayal"], "technology": [{"version": ["1.0.0"], "product": "Test Incident Update", "vendor": "Splunk"}], "drilldown_uri": "search?q=search%20index%3D\"_internal\"&earliest=0&latest=", "supports_cloud": true} param.name = xyz python.version = python3 +python.required = 3.7, 3.13 is_custom = 1 payload_format = json diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/commands.conf b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/commands.conf index d2ee56fd17..1bc5af88ca 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/commands.conf +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/commands.conf @@ -2,23 +2,28 @@ filename = generatetextcommand.py chunked = true python.version = python3 +python.required = 3.7, 3.13 [filtercommand] filename = filtercommand.py chunked = true python.version = python3 +python.required = 3.7, 3.13 [sumcommand] filename = sumcommand.py chunked = true python.version = python3 +python.required = 3.7, 3.13 [sumtwocommand] filename = sumtwocommand.py chunked = true python.version = python3 +python.required = 3.7, 3.13 [countmatchescommand] filename = countmatchescommand.py chunked = true python.version = python3 +python.required = 3.7, 3.13 diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/inputs.conf b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/inputs.conf index 756ab9df22..889558fc85 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/inputs.conf +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/inputs.conf @@ -1,5 +1,6 @@ [example_input_one] python.version = python3 +python.required = 3.7, 3.13 input_one_checkbox = true input_one_radio = yes multipleSelectTest = a|b @@ -10,33 +11,45 @@ limit = 1000 [example_input_two] python.version = python3 +python.required = 3.7, 3.13 index = default +example_date_field = 2025-05-20 +example_second_date_field = 2025-05-20 use_existing_checkpoint = yes [example_input_three] python.version = python3 +python.required = 3.7, 3.13 [example_input_four] python.version = python3 +python.required = 3.7, 3.13 disabled = true [service_hidden_for_cloud] python.version = python3 +python.required = 3.7, 3.13 [service_hidden_for_enterprise] python.version = python3 +python.required = 3.7, 3.13 [service_with_conf_param] python.version = python3 +python.required = 3.7, 3.13 [service_inside_menu_one] python.version = python3 +python.required = 3.7, 3.13 [service_inside_menu_two] python.version = python3 +python.required = 3.7, 3.13 [service_inside_menu_three] python.version = python3 +python.required = 3.7, 3.13 [service_inside_menu_four] python.version = python3 +python.required = 3.7, 3.13 diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/restmap.conf b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/restmap.conf index 7fccb2e5d9..ca437f65f6 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/restmap.conf +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/restmap.conf @@ -21,6 +21,7 @@ members = dependent_dropdown [admin_external:splunk_ta_uccexample_oauth] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_oauth.py handleractions = edit handlerpersistentmode = true @@ -28,6 +29,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_account] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_account.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -35,6 +37,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_organization] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_organization.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -42,6 +45,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_custom_row_tab] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_custom_row_tab.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -49,6 +53,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_tab_hidden_for_cloud] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_tab_hidden_for_cloud.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -56,6 +61,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_tab_hidden_for_enterprise] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_tab_hidden_for_enterprise.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -63,6 +69,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_settings] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_settings.py handleractions = edit, list handlerpersistentmode = true @@ -70,6 +77,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_one] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_example_input_one.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -77,6 +85,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_two] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_example_input_two.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -84,6 +93,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_three] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_three_custom.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -91,6 +101,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_four] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_example_input_four.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -98,6 +109,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_hidden_for_cloud] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_hidden_for_cloud.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -105,6 +117,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_hidden_for_enterprise] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_hidden_for_enterprise.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -112,6 +125,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_with_conf_param] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_with_conf_param.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -119,6 +133,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_one] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_one.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -126,6 +141,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_two] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_two.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -133,6 +149,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_three] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_three.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -140,6 +157,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_four] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_four.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -147,6 +165,7 @@ handlerpersistentmode = true [admin_external:Splunk_TA_Example_buckets] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = storage_buckets.py handleractions = list, create, edit handlerpersistentmode = true @@ -154,6 +173,7 @@ handlerpersistentmode = true [admin_external:dependent_dropdown] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = dependent_dropdown.py handleractions = list handlerpersistentmode = true diff --git a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json index acae5c328f..051742e09d 100644 --- a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json +++ b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json @@ -1443,6 +1443,22 @@ "hideForPlatform": "cloud" } }, + { + "type": "date", + "field": "example_date_field", + "label": "Example field Date", + "help": "This is an example date field", + "required": true, + "defaultValue": "2025-05-20" + }, + { + "type": "date", + "field": "example_second_date_field", + "label": "Example Second field Date ", + "help": "This is an example date field", + "required": true, + "defaultValue": "2025-05-20" + }, { "type": "text", "label": "Text input hidden for enterprise", @@ -2381,6 +2397,9 @@ "light", "dark" ], + "supportedPythonVersion": [ + "3.7, 3.13" + ], "isVisible": true, "os-dependentLibraries": [ { diff --git a/tests/testdata/test_addons/package_global_config_everything/package/default/restmap.conf b/tests/testdata/test_addons/package_global_config_everything/package/default/restmap.conf index 7fccb2e5d9..ca437f65f6 100644 --- a/tests/testdata/test_addons/package_global_config_everything/package/default/restmap.conf +++ b/tests/testdata/test_addons/package_global_config_everything/package/default/restmap.conf @@ -21,6 +21,7 @@ members = dependent_dropdown [admin_external:splunk_ta_uccexample_oauth] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_oauth.py handleractions = edit handlerpersistentmode = true @@ -28,6 +29,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_account] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_account.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -35,6 +37,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_organization] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_organization.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -42,6 +45,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_custom_row_tab] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_custom_row_tab.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -49,6 +53,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_tab_hidden_for_cloud] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_tab_hidden_for_cloud.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -56,6 +61,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_tab_hidden_for_enterprise] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_tab_hidden_for_enterprise.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -63,6 +69,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_settings] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_settings.py handleractions = edit, list handlerpersistentmode = true @@ -70,6 +77,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_one] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_example_input_one.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -77,6 +85,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_two] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_example_input_two.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -84,6 +93,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_three] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_three_custom.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -91,6 +101,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_example_input_four] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_example_input_four.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -98,6 +109,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_hidden_for_cloud] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_hidden_for_cloud.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -105,6 +117,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_hidden_for_enterprise] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_hidden_for_enterprise.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -112,6 +125,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_with_conf_param] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_with_conf_param.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -119,6 +133,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_one] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_one.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -126,6 +141,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_two] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_two.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -133,6 +149,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_three] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_three.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -140,6 +157,7 @@ handlerpersistentmode = true [admin_external:splunk_ta_uccexample_service_inside_menu_four] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = splunk_ta_uccexample_rh_service_inside_menu_four.py handleractions = edit, list, remove, create handlerpersistentmode = true @@ -147,6 +165,7 @@ handlerpersistentmode = true [admin_external:Splunk_TA_Example_buckets] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = storage_buckets.py handleractions = list, create, edit handlerpersistentmode = true @@ -154,6 +173,7 @@ handlerpersistentmode = true [admin_external:dependent_dropdown] handlertype = python python.version = python3 +python.required = 3.7, 3.13 handlerfile = dependent_dropdown.py handleractions = list handlerpersistentmode = true diff --git a/tests/unit/commands/test_build.py b/tests/unit/commands/test_build.py index 2877446a73..adfd710b18 100644 --- a/tests/unit/commands/test_build.py +++ b/tests/unit/commands/test_build.py @@ -17,6 +17,7 @@ ) from splunk_add_on_ucc_framework import __version__ +from tests.unit.helpers import get_path_to_source_dir CURRENT_PATH = os.getcwd() @@ -74,7 +75,7 @@ ], ) def test_get_build_output_path(output_directory, expected_output_directory): - assert expected_output_directory == _get_build_output_path(output_directory) + assert expected_output_directory == _get_build_output_path(output_directory)[0] @patch("splunk_add_on_ucc_framework.commands.build.subprocess.run") @@ -222,8 +223,39 @@ def test_ta_name_mismatch( ) +@patch("os.path.exists") +@patch("splunk_add_on_ucc_framework.commands.build.get_app_manifest") +def test_existing_output_dir(mock_get_app_manifest, mock_os_path, caplog): + mock_os_path.return_value = True + + mock_app_manifest = MagicMock() + mock_app_manifest.get_addon_name.return_value = "ta_name_1" + mock_get_app_manifest.return_value = mock_app_manifest + + with pytest.raises(SystemExit): + generate( + source="source/path", + addon_version="1.0.0", + output_directory="dummy_path", + python_binary_name="python3", + verbose_file_summary_report=False, + pip_version="latest", + pip_legacy_resolver=False, + ) + output_dir = os.path.abspath( + os.path.join(get_path_to_source_dir(), os.pardir, "dummy_path", "ta_name_1") + ) + expected_msg = ( + f"The location {output_dir} is already taken, use `--overwrite` option to overwrite " + "the content of existing directory." + ) + assert expected_msg in caplog.text + + @patch("splunk_add_on_ucc_framework.commands.build._get_build_output_path") -def test_uncaught_exception(mock_get_build_output_path, caplog): +@patch("os.path.exists") +def test_uncaught_exception(mock_get_build_output_path, mock_os_path, caplog): + mock_os_path.return_value = True mock_get_build_output_path.side_effect = ValueError("Some exc msg") expected_msg_1 = "Uncaught exception occurred. Exception details:" diff --git a/tests/unit/commands/test_validate.py b/tests/unit/commands/test_validate.py deleted file mode 100644 index dab14d7f8e..0000000000 --- a/tests/unit/commands/test_validate.py +++ /dev/null @@ -1,58 +0,0 @@ -import pytest -import subprocess - - -def install_splunk_appinspect(): - """ - Function to actually imitate that the splunk-appinspect library is present - """ - subprocess.call("pip install splunk-appinspect", shell=True) - - -def uninstall_splunk_appinspect(): - """ - Function to actually imitate that the splunk-appinspect library is absent - """ - subprocess.call("pip uninstall -y splunk_appinspect", shell=True) - - -def test_validate_when_splunk_appinspect_missing(caplog): - # Need to make sure appinspect is not installed on the system - uninstall_splunk_appinspect() - error_msg = ( - "UCC validate dependencies are not installed. Please install them using the command ->" - " `pip install splunk-add-on-ucc-framework[validate]`." - ) - - from splunk_add_on_ucc_framework.commands.validate import validate - - with pytest.raises(SystemExit): - validate("some/path") - - assert error_msg in caplog.text - - -def test_validate_when_incorrect_path_provided(): - # Test when incorrect addon-path is provided, for that system should exit with exit_code == 2 - install_splunk_appinspect() - - from splunk_add_on_ucc_framework.commands.validate import validate - - with pytest.raises(SystemExit) as se: - validate("invalid/addon_path") - - assert se.value.code == 2 - - -def test_validate_when_correct_path_provided(): - # Test when correct addon-path is provided, for that system should exit with exit_code == 0 - install_splunk_appinspect() - - from splunk_add_on_ucc_framework.commands.validate import validate - - with pytest.raises(SystemExit) as se: - validate( - "tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample" - ) - - assert se.value.code == 0 diff --git a/tests/unit/generators/conf_files/test_create_commands_conf.py b/tests/unit/generators/conf_files/test_create_commands_conf.py index 44ee8a9cb1..02b740e669 100644 --- a/tests/unit/generators/conf_files/test_create_commands_conf.py +++ b/tests/unit/generators/conf_files/test_create_commands_conf.py @@ -52,7 +52,7 @@ def test_commands_conf_generation(global_config_all_json, input_dir, output_dir) input_dir, output_dir, ) - output = commands_conf.generate() + output = commands_conf.generate_conf() expected_content = dedent( """ @@ -60,12 +60,37 @@ def test_commands_conf_generation(global_config_all_json, input_dir, output_dir) filename = generatetextcommand.py chunked = true python.version = python3 + python.required = 3.7, 3.13 """ ).lstrip() - assert output == [ - { - "file_name": "commands.conf", - "file_path": f"{output_dir}/{ta_name}/default/commands.conf", - "content": expected_content, - } - ] + assert output == { + "file_name": "commands.conf", + "file_path": f"{output_dir}/{ta_name}/default/commands.conf", + "content": expected_content, + } + + +def test_commands_conf_spec_generation(global_config_all_json, input_dir, output_dir): + ta_name = global_config_all_json.product + commands_conf = CommandsConf( + global_config_all_json, + input_dir, + output_dir, + ) + output = commands_conf.generate_conf_spec() + expected_content = "\n".join( + [ + "[default]", + "python.required = {3.7|3.9|3.13}", + "* For Python scripts only, selects which Python version to use.", + '* Set to "3.9" to use the Python 3.9 version.', + '* Set to "3.13" to use the Python 3.13 version.', + "* Optional.", + "* Default: not set", + ] + ) + assert output == { + "file_name": "commands.conf.spec", + "file_path": f"{output_dir}/{ta_name}/README/commands.conf.spec", + "content": expected_content, + } diff --git a/tests/unit/generators/conf_files/test_create_inputs_conf.py b/tests/unit/generators/conf_files/test_create_inputs_conf.py index e1c0f1cbf3..8a133d2597 100644 --- a/tests/unit/generators/conf_files/test_create_inputs_conf.py +++ b/tests/unit/generators/conf_files/test_create_inputs_conf.py @@ -24,6 +24,7 @@ def test_generate_conf( """ [example_input_one] python.version = python3 + python.required = 3.7, 3.13 input_one_radio = yes index = default order_by = LastModifiedDate @@ -31,6 +32,7 @@ def test_generate_conf( limit = 1000 [example_input_two] python.version = python3 + python.required = 3.7, 3.13 disabled = true index = default input_two_checkbox_bool = true @@ -72,6 +74,12 @@ def test_generate_conf_spec(global_config_all_json, input_dir, output_dir): '"YYYY-MM-DDThh:mm:ss.000z". Defaults to 90 days earlier from now.', "use_existing_checkpoint = Data input already exists. " "Select `No` if you want to reset the data collection. (Default: yes)", + "python.required = {3.7|3.9|3.13}", + "* For Python scripts only, selects which Python version to use.", + '* Set to "3.9" to use the Python 3.9 version.', + '* Set to "3.13" to use the Python 3.13 version.', + "* Optional.", + "* Default: not set", "[example_input_two://]", "account =", "api1 =", @@ -89,6 +97,12 @@ def test_generate_conf_spec(global_config_all_json, input_dir, output_dir): "records. The default is 90 days before today.", "use_existing_checkpoint = Data input already exists. Select `No` if you want to reset the " "data collection. (Default: yes)", + "python.required = {3.7|3.9|3.13}", + "* For Python scripts only, selects which Python version to use.", + '* Set to "3.9" to use the Python 3.9 version.', + '* Set to "3.13" to use the Python 3.13 version.', + "* Optional.", + "* Default: not set", ] ) + "\n" @@ -129,6 +143,7 @@ def test_inputs_disable_two_inputs(tmp_path, input_dir, output_dir): """ [example_input_one] python.version = python3 + python.required = 3.7, 3.13 disabled = true input_one_radio = yes index = default @@ -137,6 +152,7 @@ def test_inputs_disable_two_inputs(tmp_path, input_dir, output_dir): limit = 1000 [example_input_two] python.version = python3 + python.required = 3.7, 3.13 disabled = true index = default input_two_checkbox_bool = true @@ -168,6 +184,12 @@ def test_inputs_disable_two_inputs(tmp_path, input_dir, output_dir): 'format: "YYYY-MM-DDThh:mm:ss.000z". Defaults to 90 days earlier from now.', "use_existing_checkpoint = Data input already exists. Select `No` if you want to reset the data " "collection. (Default: yes)", + "python.required = {3.7|3.9|3.13}", + "* For Python scripts only, selects which Python version to use.", + '* Set to "3.9" to use the Python 3.9 version.', + '* Set to "3.13" to use the Python 3.13 version.', + "* Optional.", + "* Default: not set", "[example_input_two://]", "account =", "api1 =", @@ -184,7 +206,13 @@ def test_inputs_disable_two_inputs(tmp_path, input_dir, output_dir): 'start_date = The date and time, in "YYYY-MM-DDThh:mm:ss.000z" format, after which to query and ' "index records. The default is 90 days before today.", "use_existing_checkpoint = Data input already exists. Select `No` if you want to reset the data " - "collection. (Default: yes)\n", + "collection. (Default: yes)", + "python.required = {3.7|3.9|3.13}", + "* For Python scripts only, selects which Python version to use.", + '* Set to "3.9" to use the Python 3.9 version.', + '* Set to "3.13" to use the Python 3.13 version.', + "* Optional.", + "* Default: not set\n", ] ) @@ -240,7 +268,9 @@ def test_inputs_conf_content_input_with_conf(input_dir, output_dir, ta_name, tmp conf = inputs_conf.generate_conf() assert conf is not None - assert conf["content"] == ("[example_input_three]\npython.version = python3\n") + assert conf["content"] == ( + "[example_input_three]\npython.version = python3\npython.required = 3.7, 3.13\n" + ) specs = inputs_conf.generate_conf_spec() assert specs is not None diff --git a/tests/unit/generators/conf_files/test_create_restmap_conf.py b/tests/unit/generators/conf_files/test_create_restmap_conf.py index 91b01bd908..b67d8789b5 100644 --- a/tests/unit/generators/conf_files/test_create_restmap_conf.py +++ b/tests/unit/generators/conf_files/test_create_restmap_conf.py @@ -64,30 +64,35 @@ def test_restmap_endpoints(global_config_all_json, input_dir, output_dir): "[admin_external:splunk_ta_uccexample_oauth]", "handlertype = python", "python.version = python3", + "python.required = 3.7, 3.13", "handlerfile = splunk_ta_uccexample_rh_oauth.py", "handleractions = edit", "handlerpersistentmode = true", "[admin_external:splunk_ta_uccexample_account]", "handlertype = python", "python.version = python3", + "python.required = 3.7, 3.13", "handlerfile = splunk_ta_uccexample_rh_account.py", "handleractions = edit, list, remove, create", "handlerpersistentmode = true", "[admin_external:splunk_ta_uccexample_settings]", "handlertype = python", "python.version = python3", + "python.required = 3.7, 3.13", "handlerfile = splunk_ta_uccexample_rh_settings.py", "handleractions = edit, list", "handlerpersistentmode = true", "[admin_external:splunk_ta_uccexample_example_input_one]", "handlertype = python", "python.version = python3", + "python.required = 3.7, 3.13", "handlerfile = splunk_ta_uccexample_rh_example_input_one.py", "handleractions = edit, list, remove, create", "handlerpersistentmode = true", "[admin_external:splunk_ta_uccexample_example_input_two]", "handlertype = python", "python.version = python3", + "python.required = 3.7, 3.13", "handlerfile = splunk_ta_uccexample_rh_example_input_two.py", "handleractions = edit, list, remove, create", "handlerpersistentmode = true", @@ -100,10 +105,37 @@ def test_restmap_endpoints(global_config_all_json, input_dir, output_dir): input_dir, output_dir, ) - output = restmap_conf.generate() + output = restmap_conf.generate_conf() assert output is not None - assert output[0]["file_name"] == "restmap.conf" - assert output[0]["content"] == expected_content + assert output["file_name"] == "restmap.conf" + assert output["content"] == expected_content + + +def test_restmap_conf_spec_generation(global_config_all_json, input_dir, output_dir): + ta_name = global_config_all_json.product + restmap_conf_spec = RestMapConf( + global_config_all_json, + input_dir, + output_dir, + ) + output = restmap_conf_spec.generate_conf_spec() + + expected_content = "\n".join( + [ + "[admin_external:]", + "python.required = {3.7|3.9|3.13}", + "* For Python scripts only, selects which Python version to use.", + '* Set to "3.9" to use the Python 3.9 version.', + '* Set to "3.13" to use the Python 3.13 version.', + "* Optional.", + "* Default: not set", + ] + ) + assert output == { + "file_name": "restmap.conf.spec", + "file_path": f"{output_dir}/{ta_name}/README/restmap.conf.spec", + "content": expected_content, + } def test_restmap_endpoints_with_user_defined_handlers( @@ -146,7 +178,7 @@ def test_restmap_endpoints_with_user_defined_handlers( restmap_conf = RestMapConf( global_config_logging_with_user_defined_handlers, input_dir, output_dir ) - output = restmap_conf.generate() + output = restmap_conf.generate_conf() assert output is not None - assert output[0]["file_name"] == "restmap.conf" - assert output[0]["content"] == expected_content + assert output["file_name"] == "restmap.conf" + assert output["content"] == expected_content diff --git a/tests/unit/generators/test_file_generator.py b/tests/unit/generators/test_file_generator.py index 1273a54f05..93721c2106 100644 --- a/tests/unit/generators/test_file_generator.py +++ b/tests/unit/generators/test_file_generator.py @@ -153,6 +153,7 @@ def test_begin( {"inputs.conf.spec": f"{output_dir}/{ta_name}/README/inputs.conf.spec"}, {"server.conf": f"{output_dir}/{ta_name}/default/server.conf"}, {"restmap.conf": f"{output_dir}/{ta_name}/default/restmap.conf"}, + {"restmap.conf.spec": f"{output_dir}/{ta_name}/README/restmap.conf.spec"}, {"web.conf": f"{output_dir}/{ta_name}/default/web.conf"}, {"alert_actions.conf": f"{output_dir}/{ta_name}/default/alert_actions.conf"}, { @@ -161,6 +162,7 @@ def test_begin( {"eventtypes.conf": f"{output_dir}/{ta_name}/default/eventtypes.conf"}, {"tags.conf": f"{output_dir}/{ta_name}/default/tags.conf"}, {"commands.conf": f"{output_dir}/{ta_name}/default/commands.conf"}, + {"commands.conf.spec": f"{output_dir}/{ta_name}/README/commands.conf.spec"}, {"searchbnf.conf": f"{output_dir}/{ta_name}/default/searchbnf.conf"}, { "splunk_ta_uccexample_account.conf.spec": f"{output_dir}/{ta_name}/" diff --git a/tests/unit/test_main.py b/tests/unit/test_main.py index 7e66aa31c8..9752e5c019 100644 --- a/tests/unit/test_main.py +++ b/tests/unit/test_main.py @@ -21,6 +21,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -36,6 +37,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -51,6 +53,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -66,10 +69,11 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( - ["-v", "--source", "package", "--ta-version", "2.1.0"], + ["-v", "--source", "package", "--ta-version", "2.1.0", "--overwrite"], { "source": "package", "config_path": None, @@ -81,6 +85,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": True, }, ), ( @@ -103,6 +108,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -127,6 +133,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -153,6 +160,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -180,6 +188,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -208,6 +217,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -238,6 +248,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -269,6 +280,7 @@ "pip_legacy_resolver": True, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -291,6 +303,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": False, "build_custom_ui": False, + "overwrite": False, }, ), ( @@ -315,6 +328,7 @@ "pip_legacy_resolver": False, "pip_custom_flag": "--progress-bar on", "build_custom_ui": False, + "overwrite": False, }, ), ], diff --git a/tests/unit/test_utils.py b/tests/unit/test_utils.py index 4190ae295a..729efa4b21 100644 --- a/tests/unit/test_utils.py +++ b/tests/unit/test_utils.py @@ -22,6 +22,8 @@ def test_get_j2_env(): "html_templates/mod_alert.html.template", "README/account_conf_spec.template", "README/alert_actions_conf_spec.template", + "README/restmap_conf_spec.template", + "README/commands_conf_spec.template", "README/inputs_conf_spec.template", "README/settings_conf_spec.template", "conf_files/alert_actions_conf.template", diff --git a/tests/unit/testdata/alert_action.py.generated b/tests/unit/testdata/alert_action.py.generated index bc5ffd4bba..840c4f1a15 100644 --- a/tests/unit/testdata/alert_action.py.generated +++ b/tests/unit/testdata/alert_action.py.generated @@ -35,13 +35,10 @@ class AlertActionWorkertest_alert(ModularAlertBase): if not self.validate_params(): return 3 status = modalert_test_alert_helper.process_event(self, *args, **kwargs) - except (AttributeError, TypeError) as ae: - self.log_error("Error: {}. Please double check spelling and also verify that a compatible version of Splunk_SA_CIM is installed.".format(str(ae)))#ae.message replaced with str(ae) - return 4 except Exception as e: msg = "Unexpected error: {}." if str(e): - self.log_error(msg.format(str(e)))#e.message replaced with str(ae) + self.log_error(msg.format(str(e))) else: import traceback self.log_error(msg.format(traceback.format_exc())) diff --git a/tests/unit/testdata/valid_config.json b/tests/unit/testdata/valid_config.json index d9d9ad78c6..2857bb8913 100644 --- a/tests/unit/testdata/valid_config.json +++ b/tests/unit/testdata/valid_config.json @@ -1341,6 +1341,7 @@ "version": "1.0.0", "displayName": "Splunk UCC test Add-on", "schemaVersion": "0.0.3", + "supportedPythonVersion":["3.7, 3.13"], "os-dependentLibraries": [ { "name": "cryptography", diff --git a/ui/package.json b/ui/package.json index 4b47d7a933..85e6e949dc 100644 --- a/ui/package.json +++ b/ui/package.json @@ -47,9 +47,9 @@ "@splunk/ui-utils": "^1.10.0", "@splunk/visualization-context": "^28.0.0", "@storybook/test": "^8.6.14", - "@vitejs/plugin-react": "^4.7.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/react": "^15.0.6", + "@vitejs/plugin-react": "^4.7.0", "@vitest/coverage-istanbul": "^3.2.4", "glob": "^11.0.3", "immutability-helper": "^3.1.1", @@ -62,10 +62,10 @@ "react-router-dom": "6.27.0", "styled-components": "^5.3.11", "uuid": "^11.1.0", - "zod": "^4.0.17", - "vite": "^7.1.3", + "vite": "^7.1.12", "vite-plugin-checker": "^0.10.2", - "vitest": "^3.2.4" + "vitest": "^3.2.4", + "zod": "^4.0.17" }, "devDependencies": { "@babel/core": "^7.28.3", @@ -87,7 +87,6 @@ "@storybook/builder-vite": "^8.6.14", "@storybook/react": "^8.6.14", "@storybook/react-vite": "^8.6.14", - "@types/react-dom": "^18.2.17", "@storybook/test-runner": "^0.23.0", "@testing-library/dom": "^10.4.0", "@testing-library/jest-dom": "^6.6.3", @@ -99,6 +98,7 @@ "@types/lodash": "^4.17.20", "@types/node": "^20.17.24", "@types/react": "^18.2.41", + "@types/react-dom": "^18.2.17", "@types/styled-components": "^5.1.34", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", @@ -160,7 +160,7 @@ "strip-ansi": "^6.0.1", "string-width": "^4.2.3", "esbuild": "^0.25.9", - "axios": "^1.11.0", + "axios": "^1.12.0", "jspdf": "^3.0.2", "http-proxy-middleware": "^3.0.5", "@splunk/dashboard-event-handlers": "29.0.0", @@ -179,7 +179,7 @@ "@splunk/datasource-utils": "29.0.0" }, "engines": { - "node": ">=20.11.0", + "node": "22.21.0", "yarn": "^1.22.22" }, "msw": { diff --git a/ui/src/components/AcceptModal/stories/__images__/AcceptModal-base-chromium.png b/ui/src/components/AcceptModal/stories/__images__/AcceptModal-base-chromium.png index 554b3151c6..4536fd1a06 100644 --- a/ui/src/components/AcceptModal/stories/__images__/AcceptModal-base-chromium.png +++ b/ui/src/components/AcceptModal/stories/__images__/AcceptModal-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4d66c4238211127e926e02efcef93d873475d0d9d6d59219ea5178ba153ac9b8 -size 38549 +oid sha256:ecd29ddf28495c1662e85ec7c9bb55ba3a96109fb35aaa3963fcab6ff2c06ce4 +size 39355 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-both-oauth-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-both-oauth-chromium.png index 79da215cb5..4978aeff5c 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-both-oauth-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-both-oauth-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3a4e8a4022ae91cb6621b78d61ba440e85f90ea8e9b728313641c42731827ac3 -size 30049 +oid sha256:48668a2340efd4ee989fa6d71542e7edd806b37b1de2f99627d402a767de3b91 +size 29477 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-config-page-groups-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-config-page-groups-chromium.png index c88821ee63..41f4ea4780 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-config-page-groups-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-config-page-groups-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3c8a16c7a0b938013e6125570322ab55857d874893e47f9e158ba9d1539aaf77 -size 18589 +oid sha256:65aaa0810b9364379ac00a92e85dbf6c67db415b56c18fca2442d5364b457be6 +size 18400 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-after-mods-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-after-mods-chromium.png index 62b506e71b..bd0015d0e2 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-after-mods-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-after-mods-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d6ebfad82119eeabc38acc4b18e2e6cfbb281493afb546bc64e81228539a4c3 -size 22471 +oid sha256:81c4346378db19a73320555091bbc26bc3fab268881021e8e0fa1aac61a461b5 +size 22564 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-chromium.png index 28115b40c8..47057c8494 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-field-modify-itself-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:183e44fe30a64afedea3b8fdca177c480a043ecc846dd2a3fa784a130642ce3a -size 19027 +oid sha256:9048377db4dce3c3d1786ea3f8674e4f7e0de35ed5be0300d20c17d6e3ab2c0a +size 19355 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-group-modifications-config-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-group-modifications-config-chromium.png index 2e3f53b5df..2f37438c1f 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-group-modifications-config-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-group-modifications-config-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:27e665668d96531cf499c8e424297e6ee9b703449f0ac0860462aa6101d81246 -size 28987 +oid sha256:045ef50ba1d3cdbfc47e14cea354691d92427cc943645b16affbad2088b257ea +size 28450 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-input-page-groups-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-input-page-groups-chromium.png index 0a0106a904..cc6d96392b 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-input-page-groups-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-input-page-groups-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c4e9fe4dbd00647dc855c04d78097af28ce7eb65013bf0a3afd2b1f672cf68a6 -size 18524 +oid sha256:74ac0dd48208af080e84a854f6db2f8b9eb5cbf9264c7aae7ae326bd9117ad71 +size 18385 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-basic-with-additional-field-types-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-basic-with-additional-field-types-chromium.png index 7cf17e83a7..cfa7d11695 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-basic-with-additional-field-types-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-basic-with-additional-field-types-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e92b59bf66535a7078df2319c43122b84f4f56b6318f87df80943c6e16cd3de2 -size 41711 +oid sha256:d553e34878ff16d8d0b93945b0f44178b9995000d278473d650a20bcbef14b24 +size 41089 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-oauth-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-oauth-chromium.png index 62b88cac3f..185ca8e07f 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-oauth-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-oauth-oauth-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:647d6b311c147e447a3209413b5a72b6fcc85317158145cf69b9fe65b137e077 -size 42542 +oid sha256:2f3440145a23d5106aeb3c1a8b95c37c612e9382549c9a16d03147a003cdc39f +size 43155 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-chromium.png index 825e56454e..982b8b4555 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c06d9e0a13cc2b35dd34237236373a8df5b95fe583483c09df77128926aedda7 -size 26747 +oid sha256:9048cf8105feb401f9cacfdc48e4aaf04455c01ec7f0cc19279b6c6132c4d6fa +size 26266 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-cloud-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-cloud-chromium.png index 825e56454e..982b8b4555 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-cloud-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-cloud-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c06d9e0a13cc2b35dd34237236373a8df5b95fe583483c09df77128926aedda7 -size 26747 +oid sha256:9048cf8105feb401f9cacfdc48e4aaf04455c01ec7f0cc19279b6c6132c4d6fa +size 26266 diff --git a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-enterprise-chromium.png b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-enterprise-chromium.png index 825e56454e..982b8b4555 100644 --- a/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-enterprise-chromium.png +++ b/ui/src/components/BaseFormView/stories/__images__/BaseFormView-ouath-basic-enterprise-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c06d9e0a13cc2b35dd34237236373a8df5b95fe583483c09df77128926aedda7 -size 26747 +oid sha256:9048cf8105feb401f9cacfdc48e4aaf04455c01ec7f0cc19279b6c6132c4d6fa +size 26266 diff --git a/ui/src/components/CheckBoxComponent/stories/__images__/CheckBoxComponent-base-chromium.png b/ui/src/components/CheckBoxComponent/stories/__images__/CheckBoxComponent-base-chromium.png index 920519bc34..76c871943a 100644 --- a/ui/src/components/CheckBoxComponent/stories/__images__/CheckBoxComponent-base-chromium.png +++ b/ui/src/components/CheckBoxComponent/stories/__images__/CheckBoxComponent-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8b3c9309508ab08bf69c17ac7f9c5941e5c4eb04831950de99677c7acac7c602 -size 4410 +oid sha256:f44803195551f9c259db4298582cb3fd5a8b04a0c276cc511a9372be5a794a2a +size 4325 diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-base-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-base-chromium.png index b0159d2028..e4ec079c33 100644 --- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-base-chromium.png +++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:859967e44f1a86d4e29faebf6d34e056740d28fcf4a312c80c4d9ed4bc556fa0 -size 17472 +oid sha256:7d8f73570b942565e08c9d50188ab99bb5688660f3eaa277931b820ccba0b2fc +size 17158 diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-create-mode-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-create-mode-chromium.png index 0d27b7d8c8..6df230539d 100644 --- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-create-mode-chromium.png +++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-create-mode-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bcc5b03f54ef35240912ab1a4416398371a93a7e2465a3cb00486714bf04fc22 -size 15178 +oid sha256:b4815f503988fa9b43dff16c59d3924d8d180e07cc4d15e8ee38351537ad0353 +size 14978 diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png index 9da65532fd..0ee0c93654 100644 --- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png +++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-input-page-view-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:52df47c557ed3fe77b8aecb4ee652898c359a79ba0a9ef158189fc16b27082c5 -size 55464 +oid sha256:584c5abe86fd45d3d8dc9f1e54e085d2b4d2987f92dea0d1750a078ee0ec3b90 +size 55448 diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-mixed-with-groups-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-mixed-with-groups-chromium.png index f5ca18d7cf..8b7068fdc6 100644 --- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-mixed-with-groups-chromium.png +++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-mixed-with-groups-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:72d2bdd5073146307a3ca01f1f85a00ce22bccc34a9ece23d2943be51e3c999b -size 28251 +oid sha256:0691bd789f573347fbff8b8808011cc243ed4820bbff33ee6364e5ae01a20b1f +size 27872 diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-multiline-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-multiline-chromium.png index efbe7af49f..391091ccf0 100644 --- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-multiline-chromium.png +++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-multiline-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a342b9d0fae0c222b80d1ebf56b7fbb3d1d56f77dbe519b1b61e2662b4949bb7 -size 23037 +oid sha256:0f9007d9b248d0559db9234e2f5c20f4c1dd8eee4de072aa5b01072ce4be3638 +size 22703 diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png index 203dd3016f..c0abc92ffa 100644 --- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png +++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-required-view-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f549f761aded913ad29c6f8b4a6f9af91559fa3ca145b9be94213e4b1c1678aa -size 61679 +oid sha256:ae566526b2629fe7d90b3429aac04d4f4a101b7bdfc754bb3ea0db8de66998e7 +size 60710 diff --git a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-with-single-group-chromium.png b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-with-single-group-chromium.png index fdf3dd8848..66d343eba8 100644 --- a/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-with-single-group-chromium.png +++ b/ui/src/components/CheckboxGroup/stories/__images__/CheckboxGroup-with-single-group-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c679ae4c55718f4490ab4e39b106b2e3e32e77f5fab80a76c41ca9354924582e -size 16385 +oid sha256:7afac446b834dda0c52b8365961b348c0d087456752be6c58b07edd259181b27 +size 16250 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-base-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-base-chromium.png index ae38406757..9d1a80d7f4 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-base-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:abd97af54d631b2f61963a225e5dd72717eb9af1c3852fa3203bbdf6e787be7f -size 14860 +oid sha256:65990c574bf0b6e760724e3b1bc292d5b27f841a0de32d093214e34d7c4a95a0 +size 14274 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-create-mode-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-create-mode-chromium.png index 3f62866a36..50d039379e 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-create-mode-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-create-mode-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9baec07de2b49f27fca4e0aaec8f8c3a7b7ab56fba4396a5778c39081683b7f0 -size 14574 +oid sha256:7f1e6315cd9bebebcfab27b5d2ea92d917a32591a07929b487a2be13e38178bc +size 14147 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-input-page-view-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-input-page-view-chromium.png index 17e6810c97..81fb0c6c3d 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-input-page-view-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-input-page-view-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:11ee7fea9ae5bf435b78aea5cd4db11fcaeab0758568e3b4d12662f800de31a9 -size 62046 +oid sha256:a3ae87237059222bf85a6aa25d8004f0a75b87456c803b7aea3f5ad84cba1c28 +size 61465 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-mixed-with-groups-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-mixed-with-groups-chromium.png index a49cc615d7..af17c1d6fe 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-mixed-with-groups-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-mixed-with-groups-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5e829d1b2f5a8aadedfc3de6bcd3d40d797874a4a8ed190157580b1ff7e0bfb -size 24851 +oid sha256:3e9f9052e38fd5855cd9c2e8704617147edeed9e762c1c69664901ea5b029d13 +size 24398 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-chromium.png index f747d845e3..7b94598574 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9e2fd3bc2e8aaad5944a1a194b0551d2641d5eb570f73a9872f774dfac90fd1b -size 20589 +oid sha256:ff63037f0246cf9bc758282a0e35520309447d894c2e5b83ea993fa3fbb53869 +size 20665 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-with-groups-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-with-groups-chromium.png index bdd2fa5cda..aa01800654 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-with-groups-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-multiline-with-groups-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e51708654bafae59deda44a46991f3b5933030e117bc7c24a53ffb7f0cd920aa -size 34780 +oid sha256:db6f7300f0a306c2f6a05c167ccd71bfebc2341dbcabcf4a26d9e00cb862c61f +size 33936 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-required-view-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-required-view-chromium.png index d944085244..3a17cad330 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-required-view-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-required-view-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:abc9b3f648cb2383eb2eeaf85c261943bbcf83c770d3a1d90d8a9d1c392bef8e -size 54735 +oid sha256:ab5a92021493800cdd4fe62a3c926f9852468470bd3cb8a2a65f01310400cdc7 +size 54088 diff --git a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-with-single-group-chromium.png b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-with-single-group-chromium.png index 273f7456c1..d206dae304 100644 --- a/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-with-single-group-chromium.png +++ b/ui/src/components/CheckboxTree/stories/__images__/CheckboxTree-with-single-group-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0f5bb246a20e0b9ab77bd5bc3f36639ae9f779d6172998cc32e1fcd9a3a616c3 -size 14848 +oid sha256:6a779aa3956db86f42e5b85827f4d52cb84eda7853053702fffbab749fa04754 +size 14397 diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-base-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-base-chromium.png index 43d726152f..1fc55a5b3f 100644 --- a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-base-chromium.png +++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:53e5e828e3798aafcb10a5f7a8bbd73409c7c963070fd85ecd82a8dc391846f7 -size 20436 +oid sha256:8afd3395194827bfd6a59467fb7bab435dab13c547f17cc13634cf31dfd01b50 +size 20138 diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-help-with-link-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-help-with-link-chromium.png index 9711fc08fc..c1336328e3 100644 --- a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-help-with-link-chromium.png +++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-help-with-link-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b2f4474a25e59dce7b313a7bd7d5ffc6bda67487a1f7d026ea9266d2c40fa074 -size 6937 +oid sha256:4d6b8e2751c4c31732a33b08f40cd98290f7bbbbe21bd59414a1d5d042675582 +size 6849 diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-chromium.png index 0559f777a7..54095adf59 100644 --- a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-chromium.png +++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e01ea0bb770013a2be5c5bb91a4c4d6d244a12fccb9906b808e8ba1d35cbaff4 -size 13524 +oid sha256:1f824ef91e79ca2d0f05d19191af061340a3c1824c4dd84b08edf750c3f8539d +size 13426 diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-with-links-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-with-links-chromium.png index b6289cdaf7..2b1644be23 100644 --- a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-with-links-chromium.png +++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-multi-line-help-text-with-links-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0ba06e3ab10997a3fc03af0fb35980dbc23a01831f7801762536ab7b8dd3bfb7 -size 12555 +oid sha256:1b2a69173923f5b5560b2ce013bbb5670995d4b07fbbd20d7f871f88810a1e5e +size 12359 diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-chromium.png index 33a49ca808..c0abca1995 100644 --- a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-chromium.png +++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:95f245173c0ccb00dc5f8fb6063edc365ff24cf778b0175520216c0c6cba3171 -size 5239 +oid sha256:1dc95072aa4126fdd90a7342cd353ff40585e2e8d4116cc93dccca91e444d6e0 +size 5177 diff --git a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-make-required-chromium.png b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-make-required-chromium.png index 9334eace39..a6c2b0bf39 100644 --- a/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-make-required-chromium.png +++ b/ui/src/components/ControlWrapper/stories/__images__/ControlWrapper-with-modifications-make-required-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ab42b7520f27a78b8c99727014df8c05fa3c0c8c9a58f94f76fe3b518131d871 -size 6139 +oid sha256:d7c0532db47ac165ae5a2edc129bddde4e2e196193820431db263eabafe06436 +size 6089 diff --git a/ui/src/components/DatePickerComponent/DatePickerComponent.test.tsx b/ui/src/components/DatePickerComponent/DatePickerComponent.test.tsx new file mode 100644 index 0000000000..6063de7dfb --- /dev/null +++ b/ui/src/components/DatePickerComponent/DatePickerComponent.test.tsx @@ -0,0 +1,39 @@ +import { render, screen } from '@testing-library/react'; +import React from 'react'; +import { vi, expect } from 'vitest'; +import userEvent from '@testing-library/user-event'; + +import DatePickerComponent from './DatePickerComponent'; + +const handleChange = vi.fn(); + +const renderDate = (value = '2025-05-21') => + render(); + +it('should render text component correctly with value', async () => { + renderDate(); + const date = screen.getByRole('combobox'); + + expect(date).toHaveValue('5/21/2025'); +}); + +it('should trigger callback correctly after typing', async () => { + renderDate(''); + const input = screen.getByRole('combobox'); + const user = userEvent.setup(); + + await user.type(input, '5/22/2025'); + await user.tab(); + expect(handleChange).toHaveBeenCalledWith('fieldId', '2025-05-22'); +}); + +it('should use callback with empty string after clear', async () => { + renderDate(); + const date = screen.getByRole('combobox'); + const user = userEvent.setup(); + + await user.clear(date); + await user.tab(); + + expect(handleChange).toHaveBeenCalledWith('fieldId', ''); +}); diff --git a/ui/src/components/DatePickerComponent/DatePickerComponent.tsx b/ui/src/components/DatePickerComponent/DatePickerComponent.tsx new file mode 100644 index 0000000000..b4046c5d99 --- /dev/null +++ b/ui/src/components/DatePickerComponent/DatePickerComponent.tsx @@ -0,0 +1,26 @@ +import React from 'react'; +import SUIDate, { DateChangeHandler } from '@splunk/react-ui/Date'; + +interface DatePickerComponentProps { + value: string; + handleChange: (field: string, value: string) => void; + field: string; + disabled?: boolean; +} + +const DatePickerComponent = (props: DatePickerComponentProps) => { + const handleChange: DateChangeHandler = (_: unknown, { value }: { value: string }) => { + props.handleChange(props.field, value); + }; + + return ( + + ); +}; + +export default DatePickerComponent; diff --git a/ui/src/components/DatePickerComponent/stories/DatePickerComponent.stories.tsx b/ui/src/components/DatePickerComponent/stories/DatePickerComponent.stories.tsx new file mode 100644 index 0000000000..130b070448 --- /dev/null +++ b/ui/src/components/DatePickerComponent/stories/DatePickerComponent.stories.tsx @@ -0,0 +1,62 @@ +import type { Meta, StoryObj } from '@storybook/react'; +import React, { useState } from 'react'; +import { fn } from '@storybook/test'; + +import DatePickerComponent from '../DatePickerComponent'; + +const meta = { + component: DatePickerComponent, + title: 'DatePickerComponent', + render: (props) => { + const [value, setValue] = useState(props.value); + + return ( + { + setValue(newValue); + props.handleChange(field, newValue); + }} + /> + ); + }, +} satisfies Meta; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + field: 'date', + value: '', + handleChange: fn(), + disabled: false, + }, +}; + +export const DateSelectedGB: Story = { + args: { + field: 'date', + value: '2025-01-20', + handleChange: fn(), + disabled: false, + }, +}; +export const DateSelectedzhcn: Story = { + args: { + field: 'date', + value: '2025-01-21', + handleChange: fn(), + disabled: false, + }, +}; + +export const DateDisabled: Story = { + args: { + field: 'date', + value: '2024-01-22', + handleChange: fn(), + disabled: true, + }, +}; diff --git a/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-disabled-chromium.png b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-disabled-chromium.png new file mode 100644 index 0000000000..71084d8064 --- /dev/null +++ b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-disabled-chromium.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d96d823f5baeca54294694d372e3d38d5f5d9a8a5a5572b0aaad8f3fc52990d +size 5083 diff --git a/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selected-chromium.png b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selected-chromium.png new file mode 100644 index 0000000000..0203a9c5a0 --- /dev/null +++ b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selected-chromium.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5243b974cd61fdcf000e6a6d38bdd4e3c6127765f562ee351419983fa587c9df +size 4686 diff --git a/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selected-gb-chromium.png b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selected-gb-chromium.png new file mode 100644 index 0000000000..ab6e68abf1 --- /dev/null +++ b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selected-gb-chromium.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49feac89acd0b1a44e44530ff57caf0ea55cdd509e57675e65426372fe210dc7 +size 5445 diff --git a/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selectedzhcn-chromium.png b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selectedzhcn-chromium.png new file mode 100644 index 0000000000..937c12f970 --- /dev/null +++ b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-date-selectedzhcn-chromium.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1d740f549128a04abcb0c26d5f77c73f271abd0613c2f9a815174cbeee2f476 +size 5262 diff --git a/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-default-chromium.png b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-default-chromium.png new file mode 100644 index 0000000000..4e5dd321de --- /dev/null +++ b/ui/src/components/DatePickerComponent/stories/__images__/DatePickerComponent-default-chromium.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1b22c38e3e82929380feab2d5a5b58cd7dcdc256a9c6fe3b45bc982ddf6c288 +size 3680 diff --git a/ui/src/components/DeleteModal/stories/__images__/DeleteModal-base-chromium.png b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-base-chromium.png index 4cdf8301e5..c11d06c3d5 100644 --- a/ui/src/components/DeleteModal/stories/__images__/DeleteModal-base-chromium.png +++ b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b4512bd2e1a32fc8baa71d31993ddcabf68e519ff8fcbdbbcda9ff5f8de0c8ea -size 42503 +oid sha256:3d469939a377c0d16a762c57c407f69054be16958622ce49b8a3f194954d5c7b +size 42438 diff --git a/ui/src/components/DeleteModal/stories/__images__/DeleteModal-inputs-chromium.png b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-inputs-chromium.png index 8be87e0483..8115aa2aa9 100644 --- a/ui/src/components/DeleteModal/stories/__images__/DeleteModal-inputs-chromium.png +++ b/ui/src/components/DeleteModal/stories/__images__/DeleteModal-inputs-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ea5f9c14f1420241cd3dfebd30d084096df42dd3ae593db1731a5c9b942afade -size 35923 +oid sha256:6c42883b385443defa19298f2c658f085efe7cf422f7c6e545a0fe8a92885b39 +size 36564 diff --git a/ui/src/components/DownloadButton/stories/__images__/DownloadButton-base-chromium.png b/ui/src/components/DownloadButton/stories/__images__/DownloadButton-base-chromium.png index a7a5b55f6e..895844220c 100644 --- a/ui/src/components/DownloadButton/stories/__images__/DownloadButton-base-chromium.png +++ b/ui/src/components/DownloadButton/stories/__images__/DownloadButton-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:7e3149ba85264ee12de560975f827ccdde1fcf911e1a627b39f876e2e8d697e3 -size 5326 +oid sha256:f4c6fb38c72e1f8d9f22812c0cce2b6ca14e87b9b4c72cb96c55ee4d7d4fb4fd +size 5240 diff --git a/ui/src/components/EntityPage/stories/__images__/EntityPage-base-chromium.png b/ui/src/components/EntityPage/stories/__images__/EntityPage-base-chromium.png index 69b9937b88..88d66e6ade 100644 --- a/ui/src/components/EntityPage/stories/__images__/EntityPage-base-chromium.png +++ b/ui/src/components/EntityPage/stories/__images__/EntityPage-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d3c2d1baa577387038acccf62df28415a0746d299e01439e74b103a54bee612d -size 26648 +oid sha256:d50fcfde573aa65e569a4c0a9ee022d29f43adc48b833a6da2afd806084a1d1f +size 25916 diff --git a/ui/src/components/EntityPage/stories/__images__/EntityPage-inputs-chromium.png b/ui/src/components/EntityPage/stories/__images__/EntityPage-inputs-chromium.png index f4819da18b..da4848a544 100644 --- a/ui/src/components/EntityPage/stories/__images__/EntityPage-inputs-chromium.png +++ b/ui/src/components/EntityPage/stories/__images__/EntityPage-inputs-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:670ce988839fd5af3b432940f4f002db7ad7b27c5d7be2de0dc239bd43314f82 -size 26309 +oid sha256:9a332e4a63eed9df2ba8364f0f92880e89cbac86512597dab718b2eb095d816e +size 26225 diff --git a/ui/src/components/ErrorBoundary/stories/__images__/ErrorBoundary-base-chromium.png b/ui/src/components/ErrorBoundary/stories/__images__/ErrorBoundary-base-chromium.png index b966efeee2..38bef4e9b4 100644 --- a/ui/src/components/ErrorBoundary/stories/__images__/ErrorBoundary-base-chromium.png +++ b/ui/src/components/ErrorBoundary/stories/__images__/ErrorBoundary-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:03268bf86641e508ff711cf4f9988be9d9a90f0264cb9333e1e2461e55a35848 -size 57479 +oid sha256:a20ca210037c4e76d16a6e8718d368871b71e8ecacbe0f0b501d74fada3347a7 +size 57554 diff --git a/ui/src/components/ErrorModal/stories/__images__/ErrorModal-base-chromium.png b/ui/src/components/ErrorModal/stories/__images__/ErrorModal-base-chromium.png index cf580e231b..2371050d84 100644 --- a/ui/src/components/ErrorModal/stories/__images__/ErrorModal-base-chromium.png +++ b/ui/src/components/ErrorModal/stories/__images__/ErrorModal-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44b8a400c238d2dc67e02145a1b1d33fd861221a7b5ac6996094fb5a3aa4613d -size 34285 +oid sha256:8eb8933fecab04210b4a30c06b606735bf6a8a4ccf47851de38ac5b3a3b31cae +size 35256 diff --git a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-base-chromium.png b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-base-chromium.png index 4e813963dc..09a532d75e 100644 --- a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-base-chromium.png +++ b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:15a61c371f528a6dfd73bad2809ffb7ac5eb0048352e56ae6b00bd42c6861768 -size 12090 +oid sha256:194839364e5362f06b7792440e52481103c7e61de6e387797de3bcd25c99d838 +size 11762 diff --git a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-encrypted-with-default-name-chromium.png b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-encrypted-with-default-name-chromium.png index 2eb6cfb45a..9ac85a4172 100644 --- a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-encrypted-with-default-name-chromium.png +++ b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-encrypted-with-default-name-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3236ef2245d08127341a383b93f1b5d178e392d083282e1a9bb6301d9c2cb2db -size 19121 +oid sha256:6c9362ae88b3fc31a4a30040afa5048ccda606e9ed254c555ad38dd0bf98f0c4 +size 18866 diff --git a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-with-default-name-chromium.png b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-with-default-name-chromium.png index e374a065bd..649d55d50c 100644 --- a/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-with-default-name-chromium.png +++ b/ui/src/components/FileInputComponent/stories/__images__/FileInputComponent-with-default-name-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4f2d17316a0745d5d0a3d49a4948fe75ab44358e01835b29a1fa6bff1b2e2a74 -size 16076 +oid sha256:7831f12886d2ea9991fcc0b9b0dc5668bf1bde76eef3211decbd908170ebf764 +size 15636 diff --git a/ui/src/components/Footer/stories/__images__/Footer-base-chromium.png b/ui/src/components/Footer/stories/__images__/Footer-base-chromium.png index c1209b4e93..a5307c81d4 100644 --- a/ui/src/components/Footer/stories/__images__/Footer-base-chromium.png +++ b/ui/src/components/Footer/stories/__images__/Footer-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89761656e87886fe7cc3c19b4de7a7ccc5d5a84b1e98837012a6ad2b2dc143f1 -size 9241 +oid sha256:9c5e29ff78caed7780c0f4d642fbcc1606ed111e23a6cadc396ce7aa8a04378d +size 9137 diff --git a/ui/src/components/FormModifications/FormModifications.test.tsx b/ui/src/components/FormModifications/FormModifications.test.tsx index b314cb07e7..fdebe486ab 100644 --- a/ui/src/components/FormModifications/FormModifications.test.tsx +++ b/ui/src/components/FormModifications/FormModifications.test.tsx @@ -6,6 +6,7 @@ import { z } from 'zod'; import { setUnifiedConfig } from '../../util/util'; import { + editOnlyModificationField, firstModificationField, firstStandardTextField, getConfigWithModifications, @@ -15,9 +16,10 @@ import { thirdModificationField, } from './TestConfig'; import EntityModal, { EntityModalProps } from '../EntityModal/EntityModal'; -import { EntitiesAllowingModifications } from '../../types/components/BaseFormTypes'; +import { BaseFormState, EntitiesAllowingModifications } from '../../types/components/BaseFormTypes'; import { invariant } from '../../util/invariant'; import { StringOrTextWithLinks } from '../../types/globalConfig/baseSchemas'; +import { getModificationForEntity } from './FormModifications'; const handleRequestClose = vi.fn(); const setUpConfigWithDefaultValue = () => { @@ -286,3 +288,36 @@ it('verify no modifications', async () => { verifyAllProps(componentParentElement, componentInput, firstStandardTextField); }); + +it('check mode for getModificationForEntity', () => { + const state: BaseFormState = { + data: { + [editOnlyModificationField.field]: { + value: 'a', + disabled: false, + error: false, + display: true, + }, + }, + }; + + const modificationEdit = getModificationForEntity( + editOnlyModificationField, + state, + 'edit', + 'configuration' + ); + expect(modificationEdit).toBeDefined(); + expect(modificationEdit?.fieldValue).toBe('a'); + expect(modificationEdit?.fieldsToModify).toHaveLength(1); + expect(modificationEdit?.fieldsToModify[0].fieldId).toBe(firstStandardTextField.field); + + // create mode should not return modification, when only edit mode is specified + const modificationCreate = getModificationForEntity( + editOnlyModificationField, + state, + 'create', + 'configuration' + ); + expect(modificationCreate).toBeUndefined(); +}); diff --git a/ui/src/components/FormModifications/FormModifications.ts b/ui/src/components/FormModifications/FormModifications.ts index 9cd74e86d4..a30df33ee3 100644 --- a/ui/src/components/FormModifications/FormModifications.ts +++ b/ui/src/components/FormModifications/FormModifications.ts @@ -100,7 +100,7 @@ const ifRegexpMatchesValue = ( } }; -const getModificationForEntity = ( +export const getModificationForEntity = ( entity: EntitiesAllowingModifications, stateShallowCopy: BaseFormState, mode: Mode, @@ -118,8 +118,8 @@ const getModificationForEntity = ( getValueMapTruthyFalse(currentFieldValue, page) === getValueMapTruthyFalse(mod.fieldValue, page) || // or if the mod value is a regex pattern and it matches the current field value - (ifRegexpMatchesValue(currentFieldValue, mod.fieldValue) && - (!mod.mode || mod.mode === mode))) + ifRegexpMatchesValue(currentFieldValue, mod.fieldValue)) && + (!mod.mode || mod.mode === mode) ); }); diff --git a/ui/src/components/FormModifications/TestConfig.ts b/ui/src/components/FormModifications/TestConfig.ts index cbf6934025..c734f82c20 100644 --- a/ui/src/components/FormModifications/TestConfig.ts +++ b/ui/src/components/FormModifications/TestConfig.ts @@ -145,6 +145,25 @@ export const thirdModificationField = { help: 'Third Modification field - checkbox - help', } satisfies z.infer; +export const editOnlyModificationField = { + type: 'text', + label: 'Edit Only Modification field - text - label', + field: 'edit_only_modification_field', + help: 'Edit Only Modification field - text - help', + modifyFieldsOnValue: [ + { + fieldValue: 'a', + mode: 'edit', + fieldsToModify: [ + { + fieldId: 'standard_text1', + disabled: true, + }, + ], + }, + ], +} satisfies z.infer; + export const regexpModificationField = { type: 'text', label: 'Regexp Modification field - text - label', diff --git a/ui/src/components/Group/stories/__images__/Group-base-chromium.png b/ui/src/components/Group/stories/__images__/Group-base-chromium.png index 4218213168..acac70311a 100644 --- a/ui/src/components/Group/stories/__images__/Group-base-chromium.png +++ b/ui/src/components/Group/stories/__images__/Group-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c268570c8226a6d3b44bc371af80907c3d639eff1710e77df6975003393a12ab -size 9049 +oid sha256:c3a8d4ab85c9f8efe5d3b940b07b4b6b2bbf22c39d426c0c13aa992602b6abd7 +size 8872 diff --git a/ui/src/components/Group/stories/__images__/Group-expandable-chromium.png b/ui/src/components/Group/stories/__images__/Group-expandable-chromium.png index f672edb2a9..130a184314 100644 --- a/ui/src/components/Group/stories/__images__/Group-expandable-chromium.png +++ b/ui/src/components/Group/stories/__images__/Group-expandable-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eecc03ec5b764eb82e91f4980e10e66911067c2ba3c9095e5a2c7378168fdb3a -size 8646 +oid sha256:be70d0435bce0ea812aa112095a4f55caa57c4a70e04028b1c72881dc65eafce +size 8485 diff --git a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-base-chromium.png b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-base-chromium.png index e181a71219..e532b956bd 100644 --- a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-base-chromium.png +++ b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b82e321fe9718716e2a8cd1a0ce48bfdc8ccf09459ecd9edfb1f9343a6c21a19 -size 6201 +oid sha256:9be393df9e63928083fd3260b04781fa3ede81fcfa15453d4a942e9c9590f757 +size 6165 diff --git a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-as-text-with-links-chromium.png b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-as-text-with-links-chromium.png index c7f1fa0861..61f8d1378a 100644 --- a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-as-text-with-links-chromium.png +++ b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-as-text-with-links-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5d63eac0958341d4fe191ea0debba598b03537336f0020a608f31d9b752b478a -size 11219 +oid sha256:308d4c9945a47e6ec9c8044e71f67eee6b67176d8ab019f1c147673845c857c2 +size 11270 diff --git a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-many-lines-and-link-chromium.png b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-many-lines-and-link-chromium.png index 22dc00159f..b4d113a89b 100644 --- a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-many-lines-and-link-chromium.png +++ b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-many-lines-and-link-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:fc42763ff4a438b172a080239b8422317724f3403f79188d2bf02873b7dc6d36 -size 10432 +oid sha256:035eba0ffd66861b4499bf4e89e4f8f2af30ef1999dd383efcc676e9cbcf153e +size 10400 diff --git a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-no-links-in-many-lines-chromium.png b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-no-links-in-many-lines-chromium.png index b9bac20005..b25bdc28fe 100644 --- a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-no-links-in-many-lines-chromium.png +++ b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-help-no-links-in-many-lines-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b5df69898d2de30987878ea3378d28f9e1a30c7f36b96e9ef8698d032f0435c3 -size 9772 +oid sha256:a2607888f602f1ccfa745e8e56f5d7e2841f786689363be1bc856e388656b760 +size 9652 diff --git a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-one-link-many-lines-chromium.png b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-one-link-many-lines-chromium.png index 00e981264e..86dcbba6c3 100644 --- a/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-one-link-many-lines-chromium.png +++ b/ui/src/components/HelpLinkComponent/stories/__images__/HelpLinkComponent-one-link-many-lines-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f97063ca68d7b69ac4004a680eacf6f72eb649f2e4111788252a0eb99d0a45a7 -size 9280 +oid sha256:714f7133ae5e617c2fee0322fae4a445e06ad453697ddb1c1c310a1ca5716aba +size 9230 diff --git a/ui/src/components/MarkdownMessage/stories/__images__/MarkdownMessage-base-chromium.png b/ui/src/components/MarkdownMessage/stories/__images__/MarkdownMessage-base-chromium.png index 84452e53c4..191397798a 100644 --- a/ui/src/components/MarkdownMessage/stories/__images__/MarkdownMessage-base-chromium.png +++ b/ui/src/components/MarkdownMessage/stories/__images__/MarkdownMessage-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:385fb715b9acedbb87366da06319ddfb986da96b1c293882578a23580b959917 -size 1443 +oid sha256:9120cc7a1a7f3447e0b7a34916b4fa82949cd57932662c6c110533a1f092cf05 +size 1424 diff --git a/ui/src/components/MenuInput/stories/__images__/MenuInput-base-chromium.png b/ui/src/components/MenuInput/stories/__images__/MenuInput-base-chromium.png index e775800a18..15b8b27091 100644 --- a/ui/src/components/MenuInput/stories/__images__/MenuInput-base-chromium.png +++ b/ui/src/components/MenuInput/stories/__images__/MenuInput-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d8b2c83821813302e592fc5ec4042b451fe5b349ba89859daaf57139d794e46 -size 5813 +oid sha256:561dfd6c431a1f96ae8b2b53ca1e613e335104d5b4249d7b82e8bb5f90a3a779 +size 5836 diff --git a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-menu-chromium.png b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-menu-chromium.png index 241f3ce3e1..169baa836d 100644 --- a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-menu-chromium.png +++ b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-menu-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:21b9090b57497ae7485a0a43119eb1ddf258e8476b6f7d2ec75aa09c37cc37c1 -size 26699 +oid sha256:d3cfd7de8b74fa90e0b0f1860d4b21c12813e6ed8c098e59c92091c69889681a +size 26819 diff --git a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-sub-menu-chromium.png b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-sub-menu-chromium.png index 786745bc03..96c3ab2a35 100644 --- a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-sub-menu-chromium.png +++ b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-opened-sub-menu-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5027a13dccd4474b47016204956867f9442135557574de831ccd07387153d75d -size 20287 +oid sha256:c8368bb55d2dfb1dd42eee47255b693a97c6c74af66473e6dd01fc935ed628e0 +size 20291 diff --git a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-chromium.png b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-chromium.png index e775800a18..15b8b27091 100644 --- a/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-chromium.png +++ b/ui/src/components/MenuInput/stories/__images__/MenuInput-with-sub-menu-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d8b2c83821813302e592fc5ec4042b451fe5b349ba89859daaf57139d794e46 -size 5813 +oid sha256:561dfd6c431a1f96ae8b2b53ca1e613e335104d5b4249d7b82e8bb5f90a3a779 +size 5836 diff --git a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-all-props-chromium.png b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-all-props-chromium.png index d24d1cdb5d..647be0cf32 100644 --- a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-all-props-chromium.png +++ b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-all-props-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:3547a3cb615ab998d935191b946a638fa53b01aa911c613008b0567b942f4407 -size 5645 +oid sha256:b5ebbc2decbad9c41209141331ac4e88062a248e4c306b2dcdd50b6fd0ba6771 +size 5620 diff --git a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-base-chromium.png b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-base-chromium.png index ebcfbf62b0..14df516c64 100644 --- a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-base-chromium.png +++ b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c00743412c52322c2f1c3b1d93e62a2ed656cff74337acda4eba5fa17835e653 -size 5327 +oid sha256:80c776ef9968b88ef134d7b3ee46f1ec9b9dc526f48279cbcb03ac6055e1b608 +size 5254 diff --git a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-endpoint-api-chromium.png b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-endpoint-api-chromium.png index a368512655..04b6350e01 100644 --- a/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-endpoint-api-chromium.png +++ b/ui/src/components/MultiInputComponent/stories/__images__/MultiInputComponent-endpoint-api-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f9d9a80328b56773a8e0fe0bd2982ea576b1ae4a88421fb244851c7a678a423d -size 5894 +oid sha256:a8792c2f23270b86bbb575641e5039503c66c22b73f566aa79720864b593fbce +size 5868 diff --git a/ui/src/components/RadioComponent/stories/__images__/RadioComponent-base-chromium.png b/ui/src/components/RadioComponent/stories/__images__/RadioComponent-base-chromium.png index ccf9dae1d0..d642756ee8 100644 --- a/ui/src/components/RadioComponent/stories/__images__/RadioComponent-base-chromium.png +++ b/ui/src/components/RadioComponent/stories/__images__/RadioComponent-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ea187266abeaec3a2801199328ea0b7acf7c2ea318929635f1da3d3301504755 -size 6871 +oid sha256:204db72428266c5e1e70f8b478346bb4999d2749de08bb358ac6e8753b68444f +size 6714 diff --git a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-accept-any-input-chromium.png b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-accept-any-input-chromium.png index 6e7c76d889..be892e4741 100644 --- a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-accept-any-input-chromium.png +++ b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-accept-any-input-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5550c9913ffe4667aa081706684bb5bab9231717009200cc0ae4799cdc81f9d0 -size 6761 +oid sha256:5ec5998cd0ddea82e9f050cd5ecf8ac787e3bc31f2e8ed860bb40befa0090203 +size 6794 diff --git a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-allow-deny-list-from-backend-chromium.png b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-allow-deny-list-from-backend-chromium.png index 54e97b691f..0b7a2f7022 100644 --- a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-allow-deny-list-from-backend-chromium.png +++ b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-allow-deny-list-from-backend-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a488209a51a4924d56eb697e0116a7f5dd47eb9104c148d939bacbb8f0296130 -size 8176 +oid sha256:e1da8b31ab65f3ffd9b0d60c33c8847f70f6d1f7c0095e1206b494e22ff878aa +size 8087 diff --git a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-select-list-chromium.png b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-select-list-chromium.png index c2093f13ae..f06992c806 100644 --- a/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-select-list-chromium.png +++ b/ui/src/components/SingleInputComponent/stories/__images__/SingleInputComponent-select-list-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f54cda0d84a8b421f55be051ddab4f676efaa3842f13b11b8e3d6628506e7a6b -size 5891 +oid sha256:f79be032932a0983f50bff0a8269c8ed56589dd20c9d69224d01e1f961d51af8 +size 5849 diff --git a/ui/src/components/SubDescription/stories/__images__/SubDescription-base-chromium.png b/ui/src/components/SubDescription/stories/__images__/SubDescription-base-chromium.png index f4a78b592a..34b4e22b7d 100644 --- a/ui/src/components/SubDescription/stories/__images__/SubDescription-base-chromium.png +++ b/ui/src/components/SubDescription/stories/__images__/SubDescription-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:744999f4954ae62c7006b72de06889f64ee7d69d96980b044e3bc917d3a924c7 -size 36419 +oid sha256:06ec576c1baf5d0229da6764c9ff88a72518e8f2740ae749ce2a00e4e9e990c1 +size 37054 diff --git a/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-base-chromium.png b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-base-chromium.png index df1ec29e49..81d9c4434b 100644 --- a/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-base-chromium.png +++ b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d5b59a364d4e16b04e50879e02c0bd690fc8002950e473d3812c743b1095086f -size 4493 +oid sha256:63339c13e7438875d5aab0aa8bd9733d45b5509c312053096aa8926f70e806d0 +size 4405 diff --git a/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-encrypted-chromium.png b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-encrypted-chromium.png index 6de63e4dc6..87a63f44c4 100644 --- a/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-encrypted-chromium.png +++ b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-encrypted-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:43a089d9c27968098e231eea51ea6812dce4614827d71ba4245811aaecf88ce3 -size 5711 +oid sha256:9a61b386f6ca321a24f4c10cdc43745955a9c3277b01983bb6fda0bc1e180034 +size 5592 diff --git a/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-un-encrypted-chromium.png b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-un-encrypted-chromium.png index 62e28cbaad..41aca72ed8 100644 --- a/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-un-encrypted-chromium.png +++ b/ui/src/components/TextAreaComponent/stories/__images__/TextAreaComponent-un-encrypted-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:eedfaed37143bb8f3ccf2259ffe8d796d58499fc54e24710b8cabfb27562fee8 -size 8057 +oid sha256:d4772faf6063564a97c9091b2c745bdbc30392ab24c89022eecf5353a157aff9 +size 7845 diff --git a/ui/src/components/TextComponent/stories/__images__/TextComponent-all-props-true-chromium.png b/ui/src/components/TextComponent/stories/__images__/TextComponent-all-props-true-chromium.png index ca988709f6..6177f198d3 100644 --- a/ui/src/components/TextComponent/stories/__images__/TextComponent-all-props-true-chromium.png +++ b/ui/src/components/TextComponent/stories/__images__/TextComponent-all-props-true-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:38dfebb728045bb475773590257f7cdf52d3c9a2357356be255e764e7a4cb726 -size 5125 +oid sha256:700043d37b816853d7b8929017fc9311903bfa1cef718fb0ccd6b7233c487ffd +size 5201 diff --git a/ui/src/components/TextComponent/stories/__images__/TextComponent-base-chromium.png b/ui/src/components/TextComponent/stories/__images__/TextComponent-base-chromium.png index 01a4989d46..60483581e5 100644 --- a/ui/src/components/TextComponent/stories/__images__/TextComponent-base-chromium.png +++ b/ui/src/components/TextComponent/stories/__images__/TextComponent-base-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5a0735ec70b71d345248c83c680e4e2a59c65a58d9e2f34021c8a7d613def4eb -size 4493 +oid sha256:801632aabe4cef67c73b1f17285fc436bd8c4183b8ce75ac5fc9407dd66661e3 +size 4406 diff --git a/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png b/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png index f2670c8556..24c897360a 100644 --- a/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png +++ b/ui/src/components/table/stories/__images__/TableWrapper-ouath-basic-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:697bfc5f80f23fb3064acedefe08318ad8be67ab0434c600dea93326a6c9ed1f -size 26353 +oid sha256:20b0b458cec87bb361965ba36ff06c50217ec0dc40e9940637304e6d1304b3ac +size 25768 diff --git a/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png b/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png index 67be7fce6d..2da82035af 100644 --- a/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png +++ b/ui/src/components/table/stories/__images__/TableWrapper-simple-config-with-status-mapped-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:0910ec24caf5775d993f03944e17d5d606f7e5b94c89977c641b50ee61b6d659 -size 52696 +oid sha256:f943144354b97da6523179a6cbbc64bfd9a009b073d02dd336f6353c8950f308 +size 52015 diff --git a/ui/src/components/table/stories/__images__/TableWrapper-simple-table-many-services-chromium.png b/ui/src/components/table/stories/__images__/TableWrapper-simple-table-many-services-chromium.png index eb45b6dbc4..3479d63d4f 100644 --- a/ui/src/components/table/stories/__images__/TableWrapper-simple-table-many-services-chromium.png +++ b/ui/src/components/table/stories/__images__/TableWrapper-simple-table-many-services-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:19897accf702d872eaf687ef6a763cbb3841095f4de53c423b0fb663737fd4a2 -size 88026 +oid sha256:c09755ee02574bd5c732caf956990a56b13076270534447d965ac357ae0880fd +size 92072 diff --git a/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png b/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png index d7e7e4749c..c7747cc088 100644 --- a/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png +++ b/ui/src/components/table/stories/__images__/TableWrapper-simple-table-style-page-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a17c9b28555b0685f7f05c35ef2fa74a0a96650faea5015b8c7f83ad81d96168 -size 74347 +oid sha256:3859218a0552aa6c259b1765cae6b35d3c2c930769670baf338531e48f64e735 +size 77668 diff --git a/ui/src/constants/ControlTypeMap.ts b/ui/src/constants/ControlTypeMap.ts index 04036ee13f..7844f49e8b 100644 --- a/ui/src/constants/ControlTypeMap.ts +++ b/ui/src/constants/ControlTypeMap.ts @@ -6,6 +6,7 @@ import SingleInputComponent from '../components/SingleInputComponent/SingleInput import MultiInputComponent from '../components/MultiInputComponent/MultiInputComponent'; import CheckBoxComponent from '../components/CheckBoxComponent/CheckBoxComponent'; import RadioComponent from '../components/RadioComponent/RadioComponent'; +import DatePickerComponent from '../components/DatePickerComponent/DatePickerComponent'; import CustomControl from '../components/CustomControl/CustomControl'; import FileInputComponent from '../components/FileInputComponent/FileInputComponent'; import CheckboxGroup from '../components/CheckboxGroup/CheckboxGroup'; @@ -15,6 +16,7 @@ const componentsMap = { checkboxGroup: CheckboxGroup, checkboxTree: CheckboxTree, custom: CustomControl, + date: DatePickerComponent, file: FileInputComponent, helpLink: HelpLinkComponent, multipleSelect: MultiInputComponent, diff --git a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-custom-header-chromium.png b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-custom-header-chromium.png index 6a3eda181a..d880d73909 100644 --- a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-custom-header-chromium.png +++ b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-custom-header-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:05d83eb36ca20ba82dcf7e1121f99a584eb960ba111951eb2d4a9cb8b103ade8 -size 76163 +oid sha256:4e4b7f58a61ddf71cf2773ae69d6e05701f8a7c3b0c010fb1cccec72f6fc1bdf +size 78560 diff --git a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png index d94296d2e4..2820534f7e 100644 --- a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png +++ b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-page-view-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bedd88cefb046d5866f2313c8b7b02805a89b1b78cc5691c4deb5079ce6fbbf1 -size 56149 +oid sha256:71471dce80576b4128c0701d0820b11624085d3fa4d7039e0b8103d61244c30c +size 59173 diff --git a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png index 0b30d00488..e9b95321e8 100644 --- a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png +++ b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-configuration-view-add-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1571c86621406b6bb036a5d3fba282c5508a9a8da1e05e8033d52019da3977b2 -size 132225 +oid sha256:862e5dce904b9801c216582b947acbf0d5c5fa8d006c8fa88927713068aa334d +size 133385 diff --git a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-long-tab-name-story-chromium.png b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-long-tab-name-story-chromium.png index 2f563f33ed..fa5ec49eb8 100644 --- a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-long-tab-name-story-chromium.png +++ b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-long-tab-name-story-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5082f1561270696d789f58ed73ae0c89a5e2f0ebd81df0ab5f1203dc5285e5eb -size 60703 +oid sha256:0ee598e49e5bbba938d2e6dce3a581346875451c208c61b6cace67b9cf051d46 +size 64724 diff --git a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-multi-tabs-story-chromium.png b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-multi-tabs-story-chromium.png index 20a5355256..fb86ab9756 100644 --- a/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-multi-tabs-story-chromium.png +++ b/ui/src/pages/Configuration/stories/__images__/ConfigurationPage-multi-tabs-story-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:31c4b2d00b12687fb3cc7a08498de5354a26968e7808e360e0f18b5650a56b12 -size 53857 +oid sha256:991436ff3f5416a0a253106aa2e66773b57ef2b4525d3272df8ddff4493980a0 +size 56657 diff --git a/ui/src/pages/Dashboard/stories/__images__/DashboardPage-dashboard-page-view-chromium.png b/ui/src/pages/Dashboard/stories/__images__/DashboardPage-dashboard-page-view-chromium.png index de2d76a685..4857339be9 100644 --- a/ui/src/pages/Dashboard/stories/__images__/DashboardPage-dashboard-page-view-chromium.png +++ b/ui/src/pages/Dashboard/stories/__images__/DashboardPage-dashboard-page-view-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4d8808f984371321352f2da46386193f3e595a879659ef62c2c7f6f30947f52d -size 80069 +oid sha256:3ada80d4b901304cf2cdf6a404e85cdb2fe6c1199402c1a7ad2e4ebdec7bb368 +size 83580 diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png index 92c97865ba..d0786cea33 100644 --- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png +++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-expanded-row-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:774d594ed2efdaec9a40e2f9a754316ba0d515f301cd324d8c83539fa2337aa4 -size 47966 +oid sha256:31e48ece93f6056a83d80374df6f69c96b9dcf34efe1311ba19b6093b52c68d8 +size 49757 diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png index fb43ef167d..605b8eb7e4 100644 --- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png +++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-add-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e58409d8a30b2e6d1fbe981cb03874a2fbfd8ee5406aad4f6bacd16ef9f4abcc -size 120813 +oid sha256:6720c19dbb520c63daab60256c3f6906c8c7733dfdc1de132ac9fcd6813f48e7 +size 119884 diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png index e3fda92568..a35d9ddadf 100644 --- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png +++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:433cc53d289051b3b5aa0038e87a586a95a162ae918e895ecab7ca094288d13c -size 43897 +oid sha256:f34c849d41bd84391c5a52c88a77fe539ce4cf2eccff149305916963f9fc74c4 +size 43845 diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png index a3e997a6d7..d0fb92802c 100644 --- a/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png +++ b/ui/src/pages/Input/stories/__images__/InputPage-input-page-view-update-input-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6dee22574133a9bef1e7f27fd16a0031487e57d0db3b0b443afb8b808f09611f -size 120305 +oid sha256:7602fa46ef47b70e9812db561b458ff9f1078a0d9a195264c83197942fa20fa1 +size 119278 diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-tab-custom-header-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-tab-custom-header-chromium.png index 6dee115683..ca307aa912 100644 --- a/ui/src/pages/Input/stories/__images__/InputPage-input-tab-custom-header-chromium.png +++ b/ui/src/pages/Input/stories/__images__/InputPage-input-tab-custom-header-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f119a59777925b2cdf3413633e3674c45db89c75f1805b89d3c7fe871abcd4af -size 73879 +oid sha256:4eae0c2fcf96175db4b0a2d57a55a1d4a211e64feba5c00457fcd090d67bac11 +size 76398 diff --git a/ui/src/pages/Input/stories/__images__/InputPage-input-tab-view-add-chromium.png b/ui/src/pages/Input/stories/__images__/InputPage-input-tab-view-add-chromium.png index d7081cd9cd..47736fb0ca 100644 --- a/ui/src/pages/Input/stories/__images__/InputPage-input-tab-view-add-chromium.png +++ b/ui/src/pages/Input/stories/__images__/InputPage-input-tab-view-add-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:34c22f2a825d4d80c27ed501fbcb4666a90d7db430e52252db1afd8e1aaaf498 -size 62709 +oid sha256:fa6c6a195d26b16f384e9c4e944e1b75b2f2c3f9fc70ec112d5d026effaa1ce9 +size 61839 diff --git a/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png b/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png index ef88421166..02ffeb94f6 100644 --- a/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png +++ b/ui/src/pages/stories/__images__/GlobalConfigPlayground-global-config-playground-chromium.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1ed944f6f95977e03e0e33a91c5a9076ba93344f804cf276db712b94088e8bb3 -size 60670 +oid sha256:1303507ee857e404ba7f1ce4e7af558fbbd7e14b86b420f7ba671ff0799f0e3a +size 61462 diff --git a/ui/src/types/globalConfig/meta.ts b/ui/src/types/globalConfig/meta.ts index d34ea27f04..a4edd54ea5 100644 --- a/ui/src/types/globalConfig/meta.ts +++ b/ui/src/types/globalConfig/meta.ts @@ -15,6 +15,7 @@ export const meta = z isVisible: z.boolean().default(true).optional(), supportedThemes: z.array(z.string()).optional(), showFooter: z.boolean().default(true).optional(), + supportedPythonVersion: z.array(z.string()).optional(), defaultView: z .enum(['inputs', 'configuration', 'dashboard', 'search']) .default('configuration') diff --git a/ui/yarn.lock b/ui/yarn.lock index 74d51e8cde..df088695eb 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -1,4 +1,3 @@ - # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 @@ -41,28 +40,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.22.5", "@babel/core@^7.23.9", "@babel/core@^7.27.4", "@babel/core@^7.28.0", "@babel/core@^7.7.5": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz" - integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helpers" "^7.27.6" - "@babel/parser" "^7.28.0" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.0" - "@babel/types" "^7.28.0" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.28.3": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.22.5", "@babel/core@^7.23.9", "@babel/core@^7.27.4", "@babel/core@^7.28.0", "@babel/core@^7.28.3", "@babel/core@^7.7.5": version "7.28.3" resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz#aceddde69c5d1def69b839d09efa3e3ff59c97cb" integrity sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ== @@ -92,18 +70,7 @@ eslint-visitor-keys "^2.1.0" semver "^6.3.1" -"@babel/generator@^7.22.5", "@babel/generator@^7.27.5", "@babel/generator@^7.28.0", "@babel/generator@^7.7.2": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz" - integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== - dependencies: - "@babel/parser" "^7.28.0" - "@babel/types" "^7.28.0" - "@jridgewell/gen-mapping" "^0.3.12" - "@jridgewell/trace-mapping" "^0.3.28" - jsesc "^3.0.2" - -"@babel/generator@^7.28.3": +"@babel/generator@^7.22.5", "@babel/generator@^7.27.5", "@babel/generator@^7.28.3", "@babel/generator@^7.7.2": version "7.28.3" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz#9626c1741c650cbac39121694a0f2d7451b8ef3e" integrity sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw== @@ -132,20 +99,7 @@ lru-cache "^5.1.1" semver "^6.3.1" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.1.tgz" - integrity sha512-QwGAmuvM17btKU5VqXfb+Giw4JcN0hjuufz3DYnpeVDvZLAObloM77bhMXiqry3Iio+Ai4phVRDwl6WU10+r5A== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.1" - "@babel/helper-member-expression-to-functions" "^7.27.1" - "@babel/helper-optimise-call-expression" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" - "@babel/traverse" "^7.27.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.28.3": +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.27.1", "@babel/helper-create-class-features-plugin@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz#3e747434ea007910c320c4d39a6b46f20f371d46" integrity sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg== @@ -199,16 +153,7 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.27.3": - version "7.27.3" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz" - integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== - dependencies: - "@babel/helper-module-imports" "^7.27.1" - "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.3" - -"@babel/helper-module-transforms@^7.28.3": +"@babel/helper-module-transforms@^7.27.1", "@babel/helper-module-transforms@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz#a2b37d3da3b2344fe085dab234426f2b9a2fa5f6" integrity sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== @@ -279,14 +224,6 @@ "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" -"@babel/helpers@^7.27.6": - version "7.28.2" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz" - integrity sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw== - dependencies: - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" - "@babel/helpers@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" @@ -295,14 +232,7 @@ "@babel/template" "^7.27.2" "@babel/types" "^7.28.2" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.4", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0", "@babel/parser@^7.7.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz" - integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== - dependencies: - "@babel/types" "^7.28.0" - -"@babel/parser@^7.28.3": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.4", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0", "@babel/parser@^7.28.3", "@babel/parser@^7.7.0": version "7.28.3" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== @@ -340,14 +270,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.27.1" "@babel/plugin-transform-optional-chaining" "^7.27.1" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.27.1.tgz" - integrity sha512-6BpaYGDavZqkI6yT+KSPdpZFfpnd68UKXbcjI9pJ13pvHhPrCKWOOLp+ysvMeA+DxnhuPpgIaRpxRxo5A9t5jw== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/traverse" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz#373f6e2de0016f73caf8f27004f61d167743742a" @@ -561,14 +483,6 @@ "@babel/helper-create-class-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-class-static-block@^7.27.1": - version "7.27.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.27.1.tgz" - integrity sha512-s734HmYU78MVzZ++joYM+NkJusItbdRcbm+AGRgJCt3iA+yux0QpD9cBVdz3tKyrjVYWRl7j0mHSmv4lhV0aoA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.27.1" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-class-static-block@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz#d1b8e69b54c9993bc558203e1f49bfc979bfd852" @@ -577,18 +491,6 @@ "@babel/helper-create-class-features-plugin" "^7.28.3" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-classes@^7.28.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.0.tgz" - integrity sha512-IjM1IoJNw72AZFlj33Cu8X0q2XK/6AaVC3jQu+cgQ5lThWD5ajnuUAml80dqRmOhmPkTH8uAwnpMu9Rvj0LTRA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-globals" "^7.28.0" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-replace-supers" "^7.27.1" - "@babel/traverse" "^7.28.0" - "@babel/plugin-transform-classes@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz#598297260343d0edbd51cb5f5075e07dee91963a" @@ -889,13 +791,6 @@ "@babel/helper-annotate-as-pure" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/plugin-transform-regenerator@^7.28.0": - version "7.28.1" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.1.tgz" - integrity sha512-P0QiV/taaa3kXpLY+sXla5zec4E+4t4Aqc9ggHlfZ7a2cp8/x/Gv08jfwEtn9gnnYIMvHx6aoOZ8XJL8eU71Dg== - dependencies: - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/plugin-transform-regenerator@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz#b8eee0f8aed37704bbcc932fd0b1a0a34d0b7344" @@ -1008,83 +903,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.27.1" "@babel/helper-plugin-utils" "^7.27.1" -"@babel/preset-env@^7.2.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.0.tgz" - integrity sha512-VmaxeGOwuDqzLl5JUkIRM1X2Qu2uKGxHEQWh+cvvbl7JuJRgKGJSfsEF/bUaxFhJl/XAyxBe7q7qSuTbKFuCyg== - dependencies: - "@babel/compat-data" "^7.28.0" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-plugin-utils" "^7.27.1" - "@babel/helper-validator-option" "^7.27.1" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.27.1" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.27.1" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.27.1" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.27.1" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.27.1" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.27.1" - "@babel/plugin-syntax-import-attributes" "^7.27.1" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.27.1" - "@babel/plugin-transform-async-generator-functions" "^7.28.0" - "@babel/plugin-transform-async-to-generator" "^7.27.1" - "@babel/plugin-transform-block-scoped-functions" "^7.27.1" - "@babel/plugin-transform-block-scoping" "^7.28.0" - "@babel/plugin-transform-class-properties" "^7.27.1" - "@babel/plugin-transform-class-static-block" "^7.27.1" - "@babel/plugin-transform-classes" "^7.28.0" - "@babel/plugin-transform-computed-properties" "^7.27.1" - "@babel/plugin-transform-destructuring" "^7.28.0" - "@babel/plugin-transform-dotall-regex" "^7.27.1" - "@babel/plugin-transform-duplicate-keys" "^7.27.1" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-dynamic-import" "^7.27.1" - "@babel/plugin-transform-explicit-resource-management" "^7.28.0" - "@babel/plugin-transform-exponentiation-operator" "^7.27.1" - "@babel/plugin-transform-export-namespace-from" "^7.27.1" - "@babel/plugin-transform-for-of" "^7.27.1" - "@babel/plugin-transform-function-name" "^7.27.1" - "@babel/plugin-transform-json-strings" "^7.27.1" - "@babel/plugin-transform-literals" "^7.27.1" - "@babel/plugin-transform-logical-assignment-operators" "^7.27.1" - "@babel/plugin-transform-member-expression-literals" "^7.27.1" - "@babel/plugin-transform-modules-amd" "^7.27.1" - "@babel/plugin-transform-modules-commonjs" "^7.27.1" - "@babel/plugin-transform-modules-systemjs" "^7.27.1" - "@babel/plugin-transform-modules-umd" "^7.27.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.27.1" - "@babel/plugin-transform-new-target" "^7.27.1" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.27.1" - "@babel/plugin-transform-numeric-separator" "^7.27.1" - "@babel/plugin-transform-object-rest-spread" "^7.28.0" - "@babel/plugin-transform-object-super" "^7.27.1" - "@babel/plugin-transform-optional-catch-binding" "^7.27.1" - "@babel/plugin-transform-optional-chaining" "^7.27.1" - "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/plugin-transform-private-methods" "^7.27.1" - "@babel/plugin-transform-private-property-in-object" "^7.27.1" - "@babel/plugin-transform-property-literals" "^7.27.1" - "@babel/plugin-transform-regenerator" "^7.28.0" - "@babel/plugin-transform-regexp-modifiers" "^7.27.1" - "@babel/plugin-transform-reserved-words" "^7.27.1" - "@babel/plugin-transform-shorthand-properties" "^7.27.1" - "@babel/plugin-transform-spread" "^7.27.1" - "@babel/plugin-transform-sticky-regex" "^7.27.1" - "@babel/plugin-transform-template-literals" "^7.27.1" - "@babel/plugin-transform-typeof-symbol" "^7.27.1" - "@babel/plugin-transform-unicode-escapes" "^7.27.1" - "@babel/plugin-transform-unicode-property-regex" "^7.27.1" - "@babel/plugin-transform-unicode-regex" "^7.27.1" - "@babel/plugin-transform-unicode-sets-regex" "^7.27.1" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.14" - babel-plugin-polyfill-corejs3 "^0.13.0" - babel-plugin-polyfill-regenerator "^0.6.5" - core-js-compat "^3.43.0" - semver "^6.3.1" - -"@babel/preset-env@^7.28.3": +"@babel/preset-env@^7.2.0", "@babel/preset-env@^7.28.3": version "7.28.3" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz#2b18d9aff9e69643789057ae4b942b1654f88187" integrity sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg== @@ -1181,12 +1000,7 @@ "@babel/plugin-transform-react-jsx-development" "^7.27.1" "@babel/plugin-transform-react-pure-annotations" "^7.27.1" -"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.17.8", "@babel/runtime@^7.2.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.27.0", "@babel/runtime@^7.27.6", "@babel/runtime@^7.9.2": - version "7.28.2" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz" - integrity sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA== - -"@babel/runtime@^7.26.9": +"@babel/runtime@^7.10.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.14.0", "@babel/runtime@^7.17.8", "@babel/runtime@^7.2.0", "@babel/runtime@^7.21.5", "@babel/runtime@^7.26.9", "@babel/runtime@^7.27.0", "@babel/runtime@^7.27.6", "@babel/runtime@^7.9.2": version "7.28.3" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.3.tgz#75c5034b55ba868121668be5d5bb31cc64e6e61a" integrity sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA== @@ -1200,20 +1014,7 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.28.0" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz" - integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== - dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.28.0" - "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.0" - "@babel/template" "^7.27.2" - "@babel/types" "^7.28.0" - debug "^4.3.1" - -"@babel/traverse@^7.28.3": +"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.28.3" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== @@ -1226,7 +1027,7 @@ "@babel/types" "^7.28.2" debug "^4.3.1" -"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.0", "@babel/types@^7.28.2", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": +"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.25.4", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.28.2" resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz" integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== @@ -2582,105 +2383,115 @@ estree-walker "^2.0.2" picomatch "^4.0.2" -"@rollup/rollup-android-arm-eabi@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.2.tgz#292e25953d4988d3bd1af0f5ebbd5ee4d65c90b4" - integrity sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA== - -"@rollup/rollup-android-arm64@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.2.tgz#053b3def3451e6fc1a9078188f22799e868d7c59" - integrity sha512-nTeCWY83kN64oQ5MGz3CgtPx8NSOhC5lWtsjTs+8JAJNLcP3QbLCtDDgUKQc/Ro/frpMq4SHUaHN6AMltcEoLQ== - -"@rollup/rollup-darwin-arm64@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.2.tgz" - integrity sha512-HV7bW2Fb/F5KPdM/9bApunQh68YVDU8sO8BvcW9OngQVN3HHHkw99wFupuUJfGR9pYLLAjcAOA6iO+evsbBaPQ== - -"@rollup/rollup-darwin-x64@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.2.tgz#fe05f95a736423af5f9c3a59a70f41ece52a1f20" - integrity sha512-SSj8TlYV5nJixSsm/y3QXfhspSiLYP11zpfwp6G/YDXctf3Xkdnk4woJIF5VQe0of2OjzTt8EsxnJDCdHd2xMA== - -"@rollup/rollup-freebsd-arm64@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.2.tgz#41e1fbdc1f8c3dc9afb6bc1d6e3fb3104bd81eee" - integrity sha512-ZyrsG4TIT9xnOlLsSSi9w/X29tCbK1yegE49RYm3tu3wF1L/B6LVMqnEWyDB26d9Ecx9zrmXCiPmIabVuLmNSg== - -"@rollup/rollup-freebsd-x64@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.2.tgz#69131e69cb149d547abb65ef3b38fc746c940e24" - integrity sha512-pCgHFoOECwVCJ5GFq8+gR8SBKnMO+xe5UEqbemxBpCKYQddRQMgomv1104RnLSg7nNvgKy05sLsY51+OVRyiVw== - -"@rollup/rollup-linux-arm-gnueabihf@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.2.tgz#977ded91c7cf6fc0d9443bb9c0a064e45a805267" - integrity sha512-EtP8aquZ0xQg0ETFcxUbU71MZlHaw9MChwrQzatiE8U/bvi5uv/oChExXC4mWhjiqK7azGJBqU0tt5H123SzVA== - -"@rollup/rollup-linux-arm-musleabihf@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.2.tgz#dc034fc3c0f0eb5c75b6bc3eca3b0b97fd35f49a" - integrity sha512-qO7F7U3u1nfxYRPM8HqFtLd+raev2K137dsV08q/LRKRLEc7RsiDWihUnrINdsWQxPR9jqZ8DIIZ1zJJAm5PjQ== - -"@rollup/rollup-linux-arm64-gnu@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.2.tgz#5e92613768d3de3ffcabc965627dd0a59b3e7dfc" - integrity sha512-3dRaqLfcOXYsfvw5xMrxAk9Lb1f395gkoBYzSFcc/scgRFptRXL9DOaDpMiehf9CO8ZDRJW2z45b6fpU5nwjng== - -"@rollup/rollup-linux-arm64-musl@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.2.tgz#2a44f88e83d28b646591df6e50aa0a5a931833d8" - integrity sha512-fhHFTutA7SM+IrR6lIfiHskxmpmPTJUXpWIsBXpeEwNgZzZZSg/q4i6FU4J8qOGyJ0TR+wXBwx/L7Ho9z0+uDg== - -"@rollup/rollup-linux-loongarch64-gnu@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.2.tgz#bd5897e92db7fbf7dc456f61d90fff96c4651f2e" - integrity sha512-i7wfGFXu8x4+FRqPymzjD+Hyav8l95UIZ773j7J7zRYc3Xsxy2wIn4x+llpunexXe6laaO72iEjeeGyUFmjKeA== - -"@rollup/rollup-linux-ppc64-gnu@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.2.tgz#a7065025411c14ad9ec34cc1cd1414900ec2a303" - integrity sha512-B/l0dFcHVUnqcGZWKcWBSV2PF01YUt0Rvlurci5P+neqY/yMKchGU8ullZvIv5e8Y1C6wOn+U03mrDylP5q9Yw== - -"@rollup/rollup-linux-riscv64-gnu@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.2.tgz#17f9c0c675e13ef4567cfaa3730752417257ccc3" - integrity sha512-32k4ENb5ygtkMwPMucAb8MtV8olkPT03oiTxJbgkJa7lJ7dZMr0GCFJlyvy+K8iq7F/iuOr41ZdUHaOiqyR3iQ== - -"@rollup/rollup-linux-riscv64-musl@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.2.tgz#bc6ed3db2cedc1ba9c0a2183620fe2f792c3bf3f" - integrity sha512-t5B2loThlFEauloaQkZg9gxV05BYeITLvLkWOkRXogP4qHXLkWSbSHKM9S6H1schf/0YGP/qNKtiISlxvfmmZw== - -"@rollup/rollup-linux-s390x-gnu@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.2.tgz#440c4f6753274e2928e06d2a25613e5a1cf97b41" - integrity sha512-YKjekwTEKgbB7n17gmODSmJVUIvj8CX7q5442/CK80L8nqOUbMtf8b01QkG3jOqyr1rotrAnW6B/qiHwfcuWQA== - -"@rollup/rollup-linux-x64-gnu@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.2.tgz#1e936446f90b2574ea4a83b4842a762cc0a0aed3" - integrity sha512-Jj5a9RUoe5ra+MEyERkDKLwTXVu6s3aACP51nkfnK9wJTraCC8IMe3snOfALkrjTYd2G1ViE1hICj0fZ7ALBPA== - -"@rollup/rollup-linux-x64-musl@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.2.tgz#c6f304dfba1d5faf2be5d8b153ccbd8b5d6f1166" - integrity sha512-7kX69DIrBeD7yNp4A5b81izs8BqoZkCIaxQaOpumcJ1S/kmqNFjPhDu1LHeVXv0SexfHQv5cqHsxLOjETuqDuA== - -"@rollup/rollup-win32-arm64-msvc@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.2.tgz#b4ad4a79219892aac112ed1c9d1356cad0566ef5" - integrity sha512-wiJWMIpeaak/jsbaq2HMh/rzZxHVW1rU6coyeNNpMwk5isiPjSTx0a4YLSlYDwBH/WBvLz+EtsNqQScZTLJy3g== - -"@rollup/rollup-win32-ia32-msvc@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.2.tgz#b1b22eb2a9568048961e4a6f540438b4a762aa62" - integrity sha512-gBgaUDESVzMgWZhcyjfs9QFK16D8K6QZpwAaVNJxYDLHWayOta4ZMjGm/vsAEy3hvlS2GosVFlBlP9/Wb85DqQ== - -"@rollup/rollup-win32-x64-msvc@4.46.2": - version "4.46.2" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.2.tgz#87079f137b5fdb75da11508419aa998cc8cc3d8b" - integrity sha512-CvUo2ixeIQGtF6WvuB87XWqPQkoFAFqW+HUo/WzHwuHDvIwZCtjdWXoYCcr06iKGydiqTclC4jU/TNObC/xKZg== +"@rollup/rollup-android-arm-eabi@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz#0f44a2f8668ed87b040b6fe659358ac9239da4db" + integrity sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ== + +"@rollup/rollup-android-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz#25b9a01deef6518a948431564c987bcb205274f5" + integrity sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA== + +"@rollup/rollup-darwin-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz#8a102869c88f3780c7d5e6776afd3f19084ecd7f" + integrity sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA== + +"@rollup/rollup-darwin-x64@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz#8e526417cd6f54daf1d0c04cf361160216581956" + integrity sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA== + +"@rollup/rollup-freebsd-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz#0e7027054493f3409b1f219a3eac5efd128ef899" + integrity sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA== + +"@rollup/rollup-freebsd-x64@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz#72b204a920139e9ec3d331bd9cfd9a0c248ccb10" + integrity sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ== + +"@rollup/rollup-linux-arm-gnueabihf@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz#ab1b522ebe5b7e06c99504cc38f6cd8b808ba41c" + integrity sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ== + +"@rollup/rollup-linux-arm-musleabihf@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz#f8cc30b638f1ee7e3d18eac24af47ea29d9beb00" + integrity sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ== + +"@rollup/rollup-linux-arm64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz#7af37a9e85f25db59dc8214172907b7e146c12cc" + integrity sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg== + +"@rollup/rollup-linux-arm64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz#a623eb0d3617c03b7a73716eb85c6e37b776f7e0" + integrity sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q== + +"@rollup/rollup-linux-loong64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz#76ea038b549c5c6c5f0d062942627c4066642ee2" + integrity sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA== + +"@rollup/rollup-linux-ppc64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz#d9a4c3f0a3492bc78f6fdfe8131ac61c7359ccd5" + integrity sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw== + +"@rollup/rollup-linux-riscv64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz#87ab033eebd1a9a1dd7b60509f6333ec1f82d994" + integrity sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw== + +"@rollup/rollup-linux-riscv64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz#bda3eb67e1c993c1ba12bc9c2f694e7703958d9f" + integrity sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg== + +"@rollup/rollup-linux-s390x-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz#f7bc10fbe096ab44694233dc42a2291ed5453d4b" + integrity sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ== + +"@rollup/rollup-linux-x64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz#a151cb1234cc9b2cf5e8cfc02aa91436b8f9e278" + integrity sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q== + +"@rollup/rollup-linux-x64-musl@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz#7859e196501cc3b3062d45d2776cfb4d2f3a9350" + integrity sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg== + +"@rollup/rollup-openharmony-arm64@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz#85d0df7233734df31e547c1e647d2a5300b3bf30" + integrity sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw== + +"@rollup/rollup-win32-arm64-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz#e62357d00458db17277b88adbf690bb855cac937" + integrity sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w== + +"@rollup/rollup-win32-ia32-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz#fc7cd40f44834a703c1f1c3fe8bcc27ce476cd50" + integrity sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg== + +"@rollup/rollup-win32-x64-gnu@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz#1a22acfc93c64a64a48c42672e857ee51774d0d3" + integrity sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ== + +"@rollup/rollup-win32-x64-msvc@4.52.5": + version "4.52.5" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz#1657f56326bbe0ac80eedc9f9c18fc1ddd24e107" + integrity sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -4854,14 +4665,14 @@ argparse@^2.0.1: resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -aria-query@5.3.0, aria-query@^5.0.0: +aria-query@5.3.0: version "5.3.0" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== dependencies: dequal "^2.0.3" -aria-query@^5.3.2: +aria-query@^5.0.0, aria-query@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz" integrity sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw== @@ -5036,10 +4847,10 @@ axe-core@^4.10.0, axe-core@^4.2.0: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz" integrity sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg== -axios@^1.11.0, axios@^1.6.1: - version "1.11.0" - resolved "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz#c2ec219e35e414c025b2095e8b8280278478fdb6" - integrity sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA== +axios@^1.12.0, axios@^1.6.1: + version "1.12.2" + resolved "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz#6c307390136cf7a2278d09cec63b136dfc6e6da7" + integrity sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.4" @@ -7186,12 +6997,7 @@ fb-watchman@^2.0.0, fb-watchman@^2.0.2: dependencies: bser "2.1.1" -fdir@^6.2.0, fdir@^6.4.3, fdir@^6.4.4, fdir@^6.4.6: - version "6.4.6" - resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz" - integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== - -fdir@^6.5.0: +fdir@^6.2.0, fdir@^6.4.3, fdir@^6.5.0: version "6.5.0" resolved "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== @@ -10159,7 +9965,7 @@ minimatch@10.0.3, minimatch@^10.0.3: dependencies: "@isaacs/brace-expansion" "^5.0.0" -minimatch@9.0.3, minimatch@^9.0.3: +minimatch@9.0.3: version "9.0.3" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== @@ -10180,7 +9986,7 @@ minimatch@^8.0.2: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.4: +minimatch@^9.0.3, minimatch@^9.0.4: version "9.0.5" resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz" integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== @@ -10870,7 +10676,7 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: picomatch@^4.0.2, picomatch@^4.0.3: version "4.0.3" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz#796c76136d1eead715db1e7bad785dedd695a042" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pirates@^4.0.4, pirates@^4.0.7: @@ -11716,32 +11522,34 @@ rollup-plugin-license@^3.6.0: spdx-satisfies "~5.0.1" rollup@^4.43.0: - version "4.46.2" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.46.2.tgz" - integrity sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg== + version "4.52.5" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz#96982cdcaedcdd51b12359981f240f94304ec235" + integrity sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw== dependencies: "@types/estree" "1.0.8" optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.46.2" - "@rollup/rollup-android-arm64" "4.46.2" - "@rollup/rollup-darwin-arm64" "4.46.2" - "@rollup/rollup-darwin-x64" "4.46.2" - "@rollup/rollup-freebsd-arm64" "4.46.2" - "@rollup/rollup-freebsd-x64" "4.46.2" - "@rollup/rollup-linux-arm-gnueabihf" "4.46.2" - "@rollup/rollup-linux-arm-musleabihf" "4.46.2" - "@rollup/rollup-linux-arm64-gnu" "4.46.2" - "@rollup/rollup-linux-arm64-musl" "4.46.2" - "@rollup/rollup-linux-loongarch64-gnu" "4.46.2" - "@rollup/rollup-linux-ppc64-gnu" "4.46.2" - "@rollup/rollup-linux-riscv64-gnu" "4.46.2" - "@rollup/rollup-linux-riscv64-musl" "4.46.2" - "@rollup/rollup-linux-s390x-gnu" "4.46.2" - "@rollup/rollup-linux-x64-gnu" "4.46.2" - "@rollup/rollup-linux-x64-musl" "4.46.2" - "@rollup/rollup-win32-arm64-msvc" "4.46.2" - "@rollup/rollup-win32-ia32-msvc" "4.46.2" - "@rollup/rollup-win32-x64-msvc" "4.46.2" + "@rollup/rollup-android-arm-eabi" "4.52.5" + "@rollup/rollup-android-arm64" "4.52.5" + "@rollup/rollup-darwin-arm64" "4.52.5" + "@rollup/rollup-darwin-x64" "4.52.5" + "@rollup/rollup-freebsd-arm64" "4.52.5" + "@rollup/rollup-freebsd-x64" "4.52.5" + "@rollup/rollup-linux-arm-gnueabihf" "4.52.5" + "@rollup/rollup-linux-arm-musleabihf" "4.52.5" + "@rollup/rollup-linux-arm64-gnu" "4.52.5" + "@rollup/rollup-linux-arm64-musl" "4.52.5" + "@rollup/rollup-linux-loong64-gnu" "4.52.5" + "@rollup/rollup-linux-ppc64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-gnu" "4.52.5" + "@rollup/rollup-linux-riscv64-musl" "4.52.5" + "@rollup/rollup-linux-s390x-gnu" "4.52.5" + "@rollup/rollup-linux-x64-gnu" "4.52.5" + "@rollup/rollup-linux-x64-musl" "4.52.5" + "@rollup/rollup-openharmony-arm64" "4.52.5" + "@rollup/rollup-win32-arm64-msvc" "4.52.5" + "@rollup/rollup-win32-ia32-msvc" "4.52.5" + "@rollup/rollup-win32-x64-gnu" "4.52.5" + "@rollup/rollup-win32-x64-msvc" "4.52.5" fsevents "~2.3.2" rrweb-cssom@^0.8.0: @@ -12590,13 +12398,13 @@ tinyexec@^0.3.2: resolved "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz" integrity sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA== -tinyglobby@^0.2.14: - version "0.2.14" - resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz" - integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ== +tinyglobby@^0.2.14, tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== dependencies: - fdir "^6.4.4" - picomatch "^4.0.2" + fdir "^6.5.0" + picomatch "^4.0.3" tinypool@^1.1.1: version "1.1.1" @@ -13257,31 +13065,17 @@ vite-plugin-node-polyfills@^0.24.0: "@rollup/plugin-inject" "^5.0.5" node-stdlib-browser "^1.2.0" -"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": - version "7.1.1" - resolved "https://registry.npmjs.org/vite/-/vite-7.1.1.tgz" - integrity sha512-yJ+Mp7OyV+4S+afWo+QyoL9jFWD11QFH0i5i7JypnfTcA1rmgxCbiA8WwAICDEtZ1Z1hzrVhN8R8rGTqkTY8ZQ== - dependencies: - esbuild "^0.25.0" - fdir "^6.4.6" - picomatch "^4.0.3" - postcss "^8.5.6" - rollup "^4.43.0" - tinyglobby "^0.2.14" - optionalDependencies: - fsevents "~2.3.3" - -vite@^7.1.3: - version "7.1.4" - resolved "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz#354944affb55e1aff0157406b74e0d0a3232df9a" - integrity sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw== +"vite@^5.0.0 || ^6.0.0 || ^7.0.0-0", vite@^7.1.12: + version "7.1.12" + resolved "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz#8b29a3f61eba23bcb93fc9ec9af4a3a1e83eecdb" + integrity sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug== dependencies: esbuild "^0.25.0" fdir "^6.5.0" picomatch "^4.0.3" postcss "^8.5.6" rollup "^4.43.0" - tinyglobby "^0.2.14" + tinyglobby "^0.2.15" optionalDependencies: fsevents "~2.3.3"