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:
+
+
+
## `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"